Appeler une commande shell en java
Résolu
jklms
Messages postés
13
Date d'inscription
Statut
Membre
Dernière intervention
-
jklms Messages postés 13 Date d'inscription Statut Membre Dernière intervention -
jklms Messages postés 13 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je souhaiterai appeler une commande shell en java. Je veux appeler "pdflatex" sur un fichier tex pour le compiler. J'ai regardé la classe runtime et process, mais ma commande ne semble pas fonctionner :
Mon fichier .tex n'est pas compilé.
Pourtant, quand je fais ça, ca marche :
Quelqu'un a une idée?
Je souhaiterai appeler une commande shell en java. Je veux appeler "pdflatex" sur un fichier tex pour le compiler. J'ai regardé la classe runtime et process, mais ma commande ne semble pas fonctionner :
public class Test { /** * @param args */ public static void main(String[] args) { try { Runtime rt = Runtime.getRuntime(); String[] tabcommande = {"pdflatex"}; String[] tabparam = {"essai.tex"}; Process processus=rt.exec(tabcommande, tabparam); processus.waitFor(); System.out.println(" exit : " + processus.exitValue()); System.out.println("ok"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("error"); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("error"); } } }
Mon fichier .tex n'est pas compilé.
Pourtant, quand je fais ça, ca marche :
import java.io.IOException; /** * */ /** * @author clem * */ public class Test2 { /** * @param args */ public static void main(String[] args) { try { Runtime rt = Runtime.getRuntime(); Process processus=rt.exec("gedit test2"); //processus.waitFor(); //System.out.println(" exit : " + processus.exitValue()); System.out.println("ok"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("error"); } } }
Quelqu'un a une idée?
A voir également:
- Appeler une commande shell en java
- Jeux java itel - Télécharger - Jeux vidéo
- Waptrick java football - Télécharger - Jeux vidéo
- Invite de commande - Guide
- Classic shell - Télécharger - Personnalisation
- Appeler en privé - Guide
5 réponses
Process processus=rt.exec(tabcommande, tabparam);
Le deuxième argument c'est pour les variables d'environnements. Les paramètres doivent aller dans le premier argument.
String[] cmd = {"pdflatex","essai.tex"}; Process processus = rt.exec(cmd);
ok, mais même quand je fais
ou même directement
le processus reste dans le waitFor et ne termine pas.
Sans le waitFor, le fichier n'est même pas compilé.
String[] cmd = {"pdflatex","essai.tex"};
Process processus = rt.exec(cmd);
ou même directement
Process processus = rt.exec("pdflatex essai.tex)
le processus reste dans le waitFor et ne termine pas.
Sans le waitFor, le fichier n'est même pas compilé.
Si tu ne fais pas de waitFor tu vas avoir une IllegalThreadStateException au moment où tu fais un processus.exitValue(), il est donc important d'attendre la fin du programme avant d'afficher sa valeur de retour.
Il faudrait aussi lire les messages que tu récupères de la commande, il y a peut-être des informations à en tirer (des erreurs peut-être) :
Il faudrait aussi lire les messages que tu récupères de la commande, il y a peut-être des informations à en tirer (des erreurs peut-être) :
Process processus = rt.exec(...); Scanner out = new Scanner(processus.getInputStream()); while (out.hasNextLine()) System.out.println(out.nextLine()); out.close(); Scanner err = new Scanner(processus.getErrorStream()); while (err.hasNextLine()) System.err.println(err.nextLine()); err.close(); processus.waitFor(); System.out.println(processus.exitValue());
C'est bien ce qu'il me semblait pour le waitFor(). J'ai compris grace toi ce qui n'allait pas, merci : je n'étais pas dans le bon dossier, et un
Maintenant, mon fichier latex est bien compilé, mais le résultat pdf est enregistré dans le workspace d'eclipse et pas dans un répertoire que je voudrais. Cela doit être un parametre de pdflatex...
System.out.println(System.getProperties().get("user.dir"));m'a permit de m'en rendre compte.
Maintenant, mon fichier latex est bien compilé, mais le résultat pdf est enregistré dans le workspace d'eclipse et pas dans un répertoire que je voudrais. Cela doit être un parametre de pdflatex...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bon je croyais avoir compris et bien non en fait...
Je veux a partir de mon programme java appelé un jar file (checkstyle)
Quand, dans le dossier /Documents/chTest, je fais :
(ne vous préoccupez pas des deux arguments de checkstyle, il renvoie un message d'erreur d'usage s'il les deux fichiers xml et java ne sont pas là.
Par contre, quand j'appelle partir de mon programme
j'ai ce résultat :
J'ai déjà eu une exception FileNotFound, mais je comprends pas puisque le fichier est bien là...
Si quelqu'un a une idée je sèche. merci ;)
Je veux a partir de mon programme java appelé un jar file (checkstyle)
Quand, dans le dossier /Documents/chTest, je fais :
Tout marche bien.
java -jar checkstyle-5.6-all.jar \-c sun_checks.xml Check.java
(ne vous préoccupez pas des deux arguments de checkstyle, il renvoie un message d'erreur d'usage s'il les deux fichiers xml et java ne sont pas là.
Par contre, quand j'appelle partir de mon programme
public static void main(String[] args) {
try {
System.out.println(System.getProperties().get("user.dir"));
Runtime rt = Runtime.getRuntime();
//Le jar checkstyle-5.6-all.jar a deux arguments (un .xml (s'il y a \-c) et un .java)
String[] tabcommande = {"java -jar checkstyle-5.6-all.jar \\-c sun_checks.xml Check.java"};
Process processus=rt.exec(tabcommande,null, new File((String) "/home/clem/Documents/chTest/"));
Scanner out = new Scanner(processus.getInputStream());
while (out.hasNextLine())
System.out.println(out.nextLine());
out.close();
Scanner err = new Scanner(processus.getErrorStream());
while (err.hasNextLine())
System.err.println(err.nextLine());
err.close();
processus.waitFor();
System.out.println("exit value " + processus.exitValue());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
j'ai ce résultat :
/home/clem/Documents/Eclipse-workspace
java.io.IOException: Cannot run program "java -jar checkstyle-5.6-all.jar \-c sun_checks.xml Check.java" (in directory "/home/clem/Documents/chTest"): java.io.IOException: error=2, No such file or directory
at java.lang.ProcessBuilder.start(ProcessBuilder.java:488)
at java.lang.Runtime.exec(Runtime.java:612)
at Test2.main(Test2.java:25)
Caused by: java.io.IOException: java.io.IOException: error=2, No such file or directory
at java.lang.UNIXProcess.<init>(UNIXProcess.java:164)
at java.lang.ProcessImpl.start(ProcessImpl.java:81)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:470)
... 2 more
J'ai déjà eu une exception FileNotFound, mais je comprends pas puisque le fichier est bien là...
Si quelqu'un a une idée je sèche. merci ;)
Soit tu mets toute ta commande dans un String, soit tu la mets dans un String[] mais en mettant chaque argument dans une case distincte. Comme tu as fait il pense que le programme à exécuter est "java -jar ..." or le programme c'est juste "java" car "-jar" est une option.
String[] tabcommande = {"java", "-jar", "checkstyle-5.6-all.jar", "\\-c" "sun_checks.xml" "Check.java"};