Je travaille sur un programme écrit en Java qui, pour certaines actions lance des programmes externes en utilisant des lignes de commande configurées par l'utilisateur. Actuellement, il utilise Runtime.exec()
et ne conserve pas le Process
(les programmes lancés sont soit un éditeur de texte soit un utilitaire d'archivage, donc pas besoin des flux in/out/err du système).
Il y a cependant un petit problème : lorsque le programme Java se termine, il ne se termine pas vraiment tant que tous les programmes lancés ne sont pas sortis.
Je préférerais largement que les programmes lancés soient complètement indépendants de la JVM qui les a lancés.
Le système d'exploitation cible est multiple, Windows, Linux et Mac étant le minimum, mais tout système à interface graphique avec une JVM est vraiment ce qui est souhaité (d'où la configurabilité par l'utilisateur des lignes de commande actuelles).
Quelqu'un sait-il comment faire en sorte que le programme lancé s'exécute de manière totalement indépendante de la JVM ?
Modifier en réponse à un commentaire
Le code de lancement est le suivant. Le code peut lancer un éditeur positionné sur une ligne et une colonne spécifiques, ou il peut lancer un visualiseur d'archives. Les valeurs entre guillemets dans la ligne de commande configurée sont traitées comme étant codées ECMA-262, et sont décodées et les guillemets sont supprimés pour former le paramètre d'exécution souhaité.
Le lancement a lieu sur l'EDT.
static Throwable launch(String cmd, File fil, int lin, int col) throws Throwable {
String frs[][]={
{ "$FILE$" ,fil.getAbsolutePath().replace('\\','/') },
{ "$LINE$" ,(lin>0 ? Integer.toString(lin) : "") },
{ "$COLUMN$",(col>0 ? Integer.toString(col) : "") },
};
String[] arr; // array of parsed tokens (exec(cmd) does not handle quoted values)
cmd=TextUtil.replace(cmd,frs,true,"$$","$");
arr=(String[])ArrayUtil.removeNulls(TextUtil.stringComponents(cmd,' ',-1,true,true,true));
for(int xa=0; xa<arr.length; xa++) {
if(TextUtil.isQuoted(arr[xa],true)) {
arr[xa]=TextDecode.ecma262(TextUtil.stripQuotes(arr[xa]));
}
}
log.println("Launching: "+cmd);
Runtime.getRuntime().exec(arr);
return null;
}
Cela semble se produire uniquement lorsque le programme est lancé à partir de mon IDE. Je ferme cette question puisque le problème n'existe que dans mon environnement de développement ; ce n'est pas un problème en production . D'après le programme de test dans l'une des réponses, et les tests supplémentaires que j'ai effectués, je suis convaincu que ce n'est pas un problème qui sera vu par n'importe quel utilisateur du programme sur n'importe quelle plate-forme.
0 votes
Je pense que vous voulez dire que vous utilisez actuellement Runtime.exec()
0 votes
@Chadwick : Oups - oui, merci.
0 votes
Je pense que ce n'est qu'un problème de Windows. Sur Mac, j'ai eu le problème inverse : il fallait s'assurer que le processus externe que j'avais lancé fait sortir lorsque la JVM sort.