Bonjour,
J'ai une application java pour laquelle j'ai fait un système de mise à jour. Je me suis basé sur ce tuto : http://baptiste-wicht.developpez.com...l/java/update/ . J'ai fait quelques modifications, j'ai notamment abandonné l'idée JDesktop, car d'une part, je trouve ça un peu lourd d'intégrer la librairie simplement pour lancer un jar, et d'après ce que j'ai compris, la librairie n'est pas vraiment portable. Elle a l'air de nécessiter des .so sous linux et des .dll sous windows, et je n'ai pas envie de faire un programme d'installation pour chaque système d'exploitation... d'autant que les éléments à installer vont différer selon les destinataires de l'appli.
Bref, j'ai essayé d'utiliser la fonction suivante :
Le moment où j'utilise la fonction est le suivant : je vérifie l'existence d'une nouvelle version du logiciel. S'il y en a une, je propose à l'utilisateur de la télécharger. S'il accepte, je fais :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 public class Outil{ // .... // public static String launch(String commande) { try { LOG.getLogger().info("lancement de " + commande); Process process = Runtime.getRuntime().exec(commande); String retour = convertStreamToString(process.getInputStream()); return retour; } catch (IOException e) { LOG.getLogger().error(Outil.stackTraceToString(e)); return null; } } }
Et le main du launcher est le suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 try { //on lance lanceur, qui va s'occuper de supprimer l'ancien jar //et de renommer le nouveau puis de le lancer LOG.getLogger().info("lancement du launcher"); Outil.launch("java -jar " + launcherPath + " " + distantVersion); LOG.getLogger().info("exit"); System.exit(0); } catch (Exception e) { JOptionPane.showMessageDialog(null, "Impossible de relancer le programme"); }
Le problème est le suivant : le System.exit(0) (du deuxième code que j'ai montré) est atteint au mauvais moment : la fonction "launch" ne se termine que quand on quitte le programme.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 public static void main(String[] args) { String version = ""; try { version = args[0]; } catch (Exception e) { e.printStackTrace(); } //Si une nouvelle version a été téléchargée if (new File("new.jar").exists()) { LOG.getLogger().info("1 - nouvelle version"); //On supprime la version actuelle boolean reussite = new File("appli.jar").delete(); LOG.getLogger().info("2 - appli.jar suppression" + (reussite ? " ECHOUEE" : " REUSSIE")); //On renomme la nouvelle avec le nom de l'ancienne reussite = new File("new.jar").renameTo(new File("appli.jar")); LOG.getLogger().info("3 - new.jar renommage en appli.jar" + (reussite ? " ECHOUE" : " REUSSI")); //Enregistrement de la version actuelle dans le fichier de proprietes ProprietesManagement pm = new ProprietesManagement(); pm.setVersion(version); pm.serialisation(); launch("java -jar appli.jar"); //S'il n'y a qu'une version courante et pas de nouvelles } else if (current.exists()) { LOG.getLogger().info("pas de nouvelle version"); launch("java -jar appli.jar"); System.exit(0); //Si aucun fichier n'existe } else { JOptionPane.showMessageDialog(null, "Un problème est apparu lors de la mise à jour..."); } }
Ce qui fait qu'au moment où je veux faire les opérations de remplacement du jar, il est encore en utilisation, et la mise à jour échoue donc. Je suppose que c'est un problème inhérent à :
Qui attend que la commande lancée dans un "terminal" soit terminée pour s'arrêter.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Process process = Runtime.getRuntime().exec(commande); String retour = convertStreamToString(process.getInputStream());
Y a-t-il un moyen simple d'éviter ça ?
Merci
Partager