2011-03-29 3 views
5

Salut les gars. Je travaille sur un programme en Java conçu pour être utilisé sur un environnement Linux qui crée un nouveau processus Java qui exécute une autre classe Java, mais j'ai des problèmes avec cela. J'ai finalement réglé tous mes problèmes à ce sujet. L'appel Java Runtime.exec malheurs sur Linux

Runtime.getRuntime().exec(new String[] { "/bin/bash", "-c", "'java -classpath /home/kevin/workspace/Misc/bin HelloWorld'" }) 

dans mon programme Java retourne

/bin/bash: /usr/lib/jvm/java-6-openjdk/jre/bin/java -classpath /home/kevin/workspace/Misc/bin HelloWorld: No such file or directory 

dans les deux stdout/stderr. Si je tente

Runtime.getRuntime().exec(new String[] { "/bin/bash -c 'java -classpath /home/kevin/workspace/Misc/bin HelloWorld'" }) 

Je reçois une exception Java

Cannot run program "/bin/bash -c 'java -classpath /home/kevin/workspace/Misc/bin HelloWorld'": java.io.IOException: error=2, No such file or directory 
    ... 
Caused by: java.io.IOException: java.io.IOException: error=2, No such file or directory 

Et enfin, en utilisant un simple

Runtime.getRuntime().exec("/bin/bash -c 'java -classpath /home/kevin/workspace/Misc/bin HelloWorld'") 

me donne un

-classpath: -c: line 0: unexpected EOF while looking for matching `'' 
-classpath: -c: line 1: syntax error: unexpected end of file 

de stdout/stderr.

Pendant ce temps, la création d'une nouvelle ligne .sh fichier (et l'attribution d'autorisations appropriées) avec seulement cela (no #!/Bin/bash en haut du fichier)

/bin/bash -c 'java -classpath /home/kevin/workspace/Misc/bin HelloWorld' 

donne la sortie correcte avec pas d'erreurs Je comprends que l'utilisation de Runtime.exec est assez compliquée à perfectionner, et j'ai déjà résolu de gros problèmes, mais ce problème me dérange (comme l'utilisation de StringTokenizer par Runtime.exec). commandes qui ont des espaces en eux, c'est pourquoi j'ai invoqué la surcharge qui accepte les tableaux de chaînes). Cependant, j'ai toujours des problèmes avec ça et je ne comprends pas pourquoi.

Répondre

11

Votre première tentative était presque correcte.

Runtime.getRuntime().exec(new String[] { "/bin/bash", "-c", "java -classpath /home/kevin/workspace/Misc/bin HelloWorld" }) 

Vous n'avez pas besoin supplémentaire de citer, car le passage String individuels arguments cite efficacement automatiquement.

+2

Monsieur, vous êtes le meilleur. Je ne peux pas croire que la réponse était aussi simple! Merci beaucoup, je n'aurais jamais pensé à faire quelque chose comme ça. –

Questions connexes