Moment de l'exécution.getRuntime().exec(), l'exécution de la classe Java
Je suis d'exécution Java de la classe de l'intérieur de mon application.
proc = Runtime.getRuntime().exec("java Test");
Comment puis-je reconnaître si Test
succès ou non (c'est à dire pas d'exceptions)?
Redirection de la sortie /erreur:
proc = Runtime.getRuntime().exec(new String[] {
"java",
mclass,
">NUL 2>test.txt"
});
De cmd
:
java Main >NUL 2>test.txt
OriginalL'auteur Little Jeans | 2010-12-05
Vous devez vous connecter pour publier un commentaire.
Cela fonctionne, si le
Test
est conçu correctement et renvoie appropriée les codes de sortie (en général, >0 si quelque chose s'est mal passé).Si vous souhaitez obtenir
Test
sortie s/message d'erreur pour déterminer quel était le problème, vous devriez obtenirproc.getInputStream()
(ce qui renvoie le flux de sortie de l'enfant),proc.getErrorStream()
et lire à partir du flux d'entrée dans des threads séparés.Noter que le processus de l'enfant se bloque s'il écrit à l'erreur/flux de sortie et il n'y a pas de lecteurs. Donc erreur de lecture/flux de sortie du processus est utile dans tous les cas.
Une autre option pour éviter à l'enfant de blocage est de rediriger son erreur/de sortie pour un fichier et/ou à
/dev/null
('NUL' pour windows):cmd
, il fonctionne très bien. Alors que quand j'utiliseexec
ou process builder, ma demande juste s'arrête et rien ne se passe, j'ai donc d'y mettre fin. Tous les conseils?Il est difficile de dire définitivement. Essayez de vous rediriger vers un fichier. Contient-il quoi que ce soit après l'exécution?
S'il vous plaît, jetez un oeil à ma mise à jour. Suis-je en train de faire? Le fichier ne contient rien, soit à l'aide de
cmd
ouexec
.Ainsi, bien que
NIL
ne fonctionne toujours pas pour moi, j'ai décidé de mettre de l'erreur & flux de sortie à des threads séparés. Merci pour votre aide.juste pour ne pas confondre les futurs lecteurs. Il n'y a pas de
exitCode()
méthode dansProcess
classe. SeulementexitValue()
.OriginalL'auteur khachik
Redirection est effectuée par le processeur shell, pas par
Runtime.exec()
(au moins pas sur Windows).Vous avez besoin pour l'exécution de votre commande par
cmd.exe
:vous pouvez cocher la case "os.le nom de" propriété système (System.getProperty) et appeler les commandes du shell (sh ou cmd). Ou un petit hack: sous Unix/Linux créer un lien appelé "cmd" qui pointe vers la commande shell...
OriginalL'auteur Carlos Heuberger
Voir le Processus de la classe
Vous pouvez appeler
proc.waitFor()
pour retourner une valeur de type entier. Mais vous devez vous assurer que toutes les sorties du programme est gérée correctement (par exemple, utilisation de laproc.getInputStream()
méthode).OriginalL'auteur Marc
Avez-vous essayé
proc.exitValue()
?OriginalL'auteur Filip Spiridonov
Euh... quoi? Faire de cette façon:
Cette opération permet d'appeler la méthode statique "int someStaticMethod()" de la classe "Test" qui est chargé dynamiquement.
Test.sameStaticMethod()
?Peut-être le nom de la classe est inconnue au moment de la compilation?
Vous pouvez exécuter le code java dans un coin de la JVM pour éviter 32bit limitation de la mémoire, par exemple.
J'ai à l'appel de la classe dans l'emplacement donné par donné classname.
Jeans: Pourquoi ne pas vous mettre dans le classpath?
OriginalL'auteur thejh
Vous pouvez utiliser ProcessBuilder classe de java pour exécuter ces fichiers.
OriginalL'auteur Rajat Bhadauria