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 :
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;
		}
	    }
    }
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
 
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");
    }
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
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...");
	}
    }
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.
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 à :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
 Process process = Runtime.getRuntime().exec(commande);
		    String retour = convertStreamToString(process.getInputStream());
Qui attend que la commande lancée dans un "terminal" soit terminée pour s'arrêter.

Y a-t-il un moyen simple d'éviter ça ?

Merci