Java.lang.RunTime : marche, mais pas vraiment [résolu]

Java.lang.RunTime : marche, mais pas vraiment [résolu] - Java - Programmation

Marsh Posté le 19-03-2003 à 10:50:32    

salut tout le monde!
ayant besoin d'exécuter un programme externe dans une de mes classes java, je me suis dit que j'allais utiliser la classe RunTime de l'api java. Bon, ça me lance mon prog, mais pas tout à fait : il ne me donne pas le même résultat que si je tape la ligne de commande dans mon shell!
y'a-t-il une histoire d'importation de librairie qu'il faut faire ou autre?? je n'arrive pas à trouver d'exemples complets!!
 
au cas où, voici mon code :

Code :
  1. String com = "/usr/local/bin/tlprender";
  2. String w = "--width="+width;
  3. String h = "--height="+height;
  4. String f = "-f"+format;
  5. String l = "--layout=\""+aLayout+"\"";
  6. String o = "-o"+tulipFilePath+aTulipFileName;
  7. String i = tulipFilePath+aTulipFileName+".tlp";
  8. System.out.println(com+" "+w+" "+h+" "+f+" "+l+" "+o+" "+i);
  9. Process p;
  10.        try {
  11.            p = Runtime.getRuntime().exec(com+" "+w+" "+h+" "+f+" "+l+" "+o+" "+i);
  12.            int go = p.waitFor();
  13.    System.out.println(go);
  14.        } catch (Exception a) {
  15.            a.printStackTrace();
  16.        }


 
merci!  :hello:


Message édité par arghbis le 08-04-2003 à 19:18:47
Reply

Marsh Posté le 19-03-2003 à 10:50:32   

Reply

Marsh Posté le 19-03-2003 à 12:58:02    

alors?? pas d'idée??
si mon programme utilise des librairies, ai-je besoin de les charger, ou l'exécution du programme s'en charge?
 
 
 [:kecje]

Reply

Marsh Posté le 19-03-2003 à 15:09:31    

bon je vais essayer de faire plus clair au cas où quelqu'un voudrais me répondre :
- imaginons que j'ai un exécutable (chuis sous linux) qui a besoin de librairies openGL => ai-je besoin de charger ces librairies dans le Runtime java ou pas??
 
quelqu'un connait-il un example complet d'utilisation de la classe Runtime?
 
 [:spikler]

Reply

Marsh Posté le 19-03-2003 à 17:37:36    

ben sous windows, il y a des commandes que tu places dans exec, qui ne fonctionnent que si tu precedes ta commande de "cmd /c".
 
exemple:
 
Runtime.getRuntime("cmd /C " + commande_a_exec + " " + param1 + " " + param2 ...);
 
en fait, il semblerait que le exec ait besoin d'un environnement d'execution que exec ne fournit pas.
 
peut etre que sous linux c'est pareil, mais au lieu de cmd tu mets: "bash " ou "sh "
 

Reply

Marsh Posté le 19-03-2003 à 18:46:33    

heu, normalement, Runtime.getRuntime().exec(ta comande), c bon, puisque le getruntime doit donner l'environnement d'axécution!
 
le problème est pas que mon programme ne s'exécute pas, c qu'il s'exécute pas correctement!!
 
mais merci qd même!

Reply

Marsh Posté le 19-03-2003 à 20:25:02    

arghbis a écrit :

heu, normalement, Runtime.getRuntime().exec(ta comande), c bon, puisque le getruntime doit donner l'environnement d'axécution!
 
le problème est pas que mon programme ne s'exécute pas, c qu'il s'exécute pas correctement!!
 
mais merci qd même!


j'ai bien précisé que c'etait sous windows... :D
 
c'etait avec le JDK 1.2.2, peut etre qu'avec les nouvelles versions, ca n'est plus nécessaire...
 
en fait, ce n'est pas l'environnement qui manque mais un truc d'execution (genre move ne marche pas car il lui manque un truc)
 
c'est specifique windows...

Reply

Marsh Posté le 19-03-2003 à 21:00:46    

la construction de la chaine que tu passes a ton shell, tu pourrais pas la faire encore peu plus tordue stp? :heink:


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 19-03-2003 à 21:02:14    

peut etre une histoire de var d'env (ou tu as notamment le path vers tes librairies) qui n'est pas initialisée dans ce cas... ou une histoire d'user (genre l'user avec lequel est lancé la jvm n'est pas celui que tu crois)  
 
...


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 19-03-2003 à 21:04:08    

ben en fait, que je lance la jvm moi même ou pas, ça change rien (j'ai essayé pour voir). Ce que je me demande, c s'il faut renseigner l'instance Runtime sur les variables d'environnement qui ne concernent as java, ou si c directement accessible??  :heink:

Reply

Marsh Posté le 19-03-2003 à 21:09:08    

arghbis a écrit :

ben en fait, que je lance la jvm moi même ou pas, ça change rien (j'ai essayé pour voir). Ce que je me demande, c s'il faut renseigner l'instance Runtime sur les variables d'environnement qui ne concernent as java, ou si c directement accessible??  :heink:  

ben fait systemachin.exec("echo $LAVARIABLEDONTTUASEVENTUELLEMENTBESOIN" ) :o
au fait t'as tenté de recuper les output de ton exec, des fois qu'il y aurait un msg d'erreur que tu vois pas?
et puis si au lieu de "ça marche pas pareil" tu etais plus précis ça t'aiderait peut etre a trouver le probleme ;)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 19-03-2003 à 21:09:08   

Reply

Marsh Posté le 19-03-2003 à 21:13:00    

ben le problème est justement là!  
les messages disent que tout c bien passé, mais moi je vois bien que non!
 
la classe java lance un prog qui prends un fichier en entrée et génère une image en sortie. et ben l'image générée par la commande par java n'est pas la même (pas la bonne) que celle générée par la même commande en shell.
 
les stacktrace ne disent rien, et le code de sortie est 0 (ok, donc!)
 
comprends plus rien moi!!  :pt1cable:

Reply

Marsh Posté le 19-03-2003 à 21:16:12    

bah et t sur que tu lui files le bon fichier en entrée...?
genere ta commande plus proprement et affiche là avant de l'executer pour voir :??:


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 19-03-2003 à 21:17:32    

merci, mais c déjà ce que je fais!! chuis pas trop une buse qd même!!  ;)  
les fichiers sont identiques et la commande est identique!!
c hallucinant!

Reply

Marsh Posté le 19-03-2003 à 21:19:34    

forcément que non [:spamafote]
 
sinon fais un truc genre sys.exec("set" ) ou export
et mate si les variables sont bien settées


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 19-03-2003 à 21:39:46    

ouaip, je crois que c ce que je vais faire dès demain, au boulot!!!  :sweat:  
 
merci pour ton aide  [:spikler]

Reply

Marsh Posté le 20-03-2003 à 01:11:35    

arghbis a écrit :

les messages disent que tout c bien passé, mais moi je vois bien que non!
 
la classe java lance un prog qui prends un fichier en entrée et génère une image en sortie. et ben l'image générée par la commande par java n'est pas la même (pas la bonne) que celle générée par la même commande en shell.


 
IMHO rien a voir avec Runtime.exec()...
 
S'il te génere une image c'est que tout s'est bien passe... si ce n'est pas la bonne c'est que tu lui passe de mauvais arguments. Il ne va pas te creer la mauvaise image juste pour t'embeter.
 
Et que signifie "pas la bonne" ? Il t'en génere une ou non ?
 
Bref...
 

Citation :


String o = "-o"+tulipFilePath+aTulipFileName;  
String i = tulipFilePath+aTulipFileName+".tlp";  


 
Tu les prends d'ou tulipFilePath et aTulipFileName (ton input et ton output) ? tu ne les aurais pas codes en dur quelque part par hasard ?
 
pour verifier code en dur le chemin du tlp que tu veux rendre et le chemin de l'output directement dans ton exec... si ca marche c'est que tu as merdouille quelque part.

Reply

Marsh Posté le 20-03-2003 à 08:51:32    

c ce que j'ai déjà dit plus haut! je l'ai codée en dur ma commande pour essayer, et c pour ça que je dit "ça marche, mais pas vraiment"!
 
je pense qu"au cours du programme, il a besoin d'une lib que java ne charge pas, c pour ça qu'il génère une image, mais vide (la génération de l'image et la génération de son contenu ne font pas appel à la même lib)

Reply

Marsh Posté le 01-04-2003 à 14:58:30    

je remonte mon topic, car j'ai du nouveau : je pense savoir d'où vient l'erreur, mais je n'arrive pas à la résoudre!
 

Code :
  1. String com = "/usr/local/bin/tlprender";
  2. String w = "--width="+width;
  3. String h = "--height="+height;
  4. String f = "-f"+format;
  5. String l = "--layout=\""+aLayout+"\"";
  6. String o = "-o"+tulipFilePath+aTulipFileName;
  7. String i = tulipFilePath+aTulipFileName+".tlp";
  8. System.out.println(com+" "+w+" "+h+" "+f+" "+l+" "+o+" "+i);
  9. Process p;
  10.       try {
  11.           p = Runtime.getRuntime().exec(com+" "+w+" "+h+" "+f+" "+l+" "+o+" "+i);
  12.           int go = p.waitFor();
  13.    System.out.println(go);
  14.       } catch (Exception a) {
  15.           a.printStackTrace();
  16.       }


 
dans la ligne en gras, si j'enlève les doubles quotes protégées (\" ) et que le paramètre aLayout est un String ne contenant pas d'espace (par exemple macin au lieu de machin bidule) ça marche.
 
j'ai remarqué dans les tokens utilisés par la commande exec, qu'il me mettait deux tokens différent si je mets machin bidule! comment éviter celà??
 
remercie encore!
 
--edit-- mince, la ligne n'apparait pas en gras, j'ai que les balises! chuis pas doué qd même!!  :pt1cable:


Message édité par arghbis le 01-04-2003 à 14:59:19
Reply

Marsh Posté le 01-04-2003 à 15:16:17    

essaie de remplacer tes " par des ' genre au lieu de  
 
"tadirladada -yadu \"soleil\" -etdes \"nanas\" "
 
tu mets  
 
"tadirladada -yadu 'soleil' -etdes 'nanas' "
 
ca fait quoi ? (et cette fois ci essaie avant de me dire que ca marche pas)

Reply

Marsh Posté le 01-04-2003 à 15:24:57    

heu ben désolé, mais je l'avais déjà tenté ça!! (promis juré!!  :whistle: )
 
ça marche toujours pas!

Reply

Marsh Posté le 01-04-2003 à 16:10:23    

de plus en plus fort!
 
exemple

Code :
  1. String comm="macommande --option=\"monoption\"";
  2. Runtime.getRuntime().exec(comm);


 
marche pas!

Code :
  1. String comm="macommande --option='monoption'";
  2. Runtime.getRuntime().exec(comm);


marche pas non plus!

Code :
  1. String comm="macommande --option=monoption";
  2. Runtime.getRuntime().exec(comm);


marche!
 :pt1cable:  :pt1cable:  :pt1cable:  
 
soit y'a un concept java que je ne connais pas et qui explique ça, soit je suis maudit! si vous plait, me dites pas que j'ai besoin d'être désenvouté!  :cry:


Message édité par arghbis le 01-04-2003 à 16:10:52
Reply

Marsh Posté le 01-04-2003 à 16:22:40    

bon je continue à me répondre tout seul! je pense savoir d'où vient l'erreur!
la méthode exec prends en argument un String, qu'elle fait passer dans un StringTokenizer pour récupérer les différents tokens. Le problème est que par défaut, le constructeur de StringTokenizer ne renvoie pas les séparateurs de chaine (ici les espaces) en tant que token, et je ne vois pas de moyen de spécifier ça à exec!
 
dois-je réécrire ces méthodes?? est-ce simple ou y-a-t-il une astuce??
 
help  [:spikler]

Reply

Marsh Posté le 01-04-2003 à 17:15:07    

[:kecje]  
vous pensez que ça mérite un bug/feature report ou pas?? c qd même bizarre non?

Reply

Marsh Posté le 01-04-2003 à 17:19:25    

edit : plonk...


Message édité par krosso le 01-04-2003 à 17:20:05
Reply

Marsh Posté le 01-04-2003 à 17:21:10    

hein? ça veut dire koi?

Reply

Marsh Posté le 01-04-2003 à 17:27:46    

arghbis a écrit :

hein? ça veut dire koi?


ça veut dire que comme d'hab, j'ai posté une réponse en ayant lu que la moitié du thread et que je suis tombé à côté de la plaque... sorry.
 
Du coup j'ai relu le thread en entier. Mais là, tout de suite, je n'ai pas d'idée.
 

Reply

Marsh Posté le 01-04-2003 à 17:30:32    

ah ok! mais en fait, j'avais pas vu ta première réponse!  :D  
 
alors, personne??
 
juste une idée comme ça: si je crée une classe qui implémente Runtime et que je redéfini juste la méthode exec pour faire ce que je veux, vous pensez que c jouable?

Reply

Marsh Posté le 08-04-2003 à 19:18:26    

bon, j'ai résolu mon problème :
au lieu d'utiliser la méthode exec(String command) de la classe Runtime, j'utilise la méthode exec(String [] commandarray).
 
bon vous pourrez objecter que vous l'avez déjà dit (et je l'avais déjà essayé), mais il y a une subtilité non documenté.
 
explication :
le programme que je veux lancer par java se lance ainsi en ligne de commande sous linux: monprogramme --monOption="Une option bizarre"
il y a des doubles quotes pour protéger les espaces entre les termes.  
En java, avec commandarray, ben faut pas mettre ces quotes!  :pt1cable:  
 
ex : String [] command = {"macommande", "--monOption=Une option bizarre"};
 
et zou! ça roule!!
 
 
merci la doc java et ça manière bizarre de faire les choses!!

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed