IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API standards et tierces Java Discussion :

[Runtime] Problème avec Runtime.getRuntime()


Sujet :

API standards et tierces Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2005
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mali

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2005
    Messages : 246
    Par défaut [Runtime] Problème avec Runtime.getRuntime()
    Bonjour,

    Je voulais faire un code java pour exécuter les commandes DOS suivantes :

    cd c:\cwsjava\test
    et
    java org.apache.axis.wsdl.Java2WSDL -o fib.wsdl -l "http://localhost:8080/axis/services/fibonacci" -n urn:fibonacci -p"fibonacci" urn:fibonacci fibonacci.Fibonacci

    La classe Fibonacci.class se trouve dans l'arborescence
    c:\cwsjava\test\fibonacci.

    alors j'ai fait le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    public class AutoFib {
     
    	/**
             * @param args
             */
    	public static void main(String[] args) {
    		// TODO Raccord de méthode auto-généré
     
    		try { 
    			Runtime.getRuntime().exec("cmd.exe /k cd c:\\cwsjava\\test" );
    			String l="\""+"http://localhost:8080/axis/services/fibonacci"+"\"";
    			String l1="\""+"fibonacci"+"\"";
    			System.out.println(l);
    			System.out.println(l1);
    			Runtime.getRuntime().exec("cmd.exe /k java org.apache.axis.wsdl.Java2WSDL -o fib.wsdl -l "+l+" -n urn:fibonacci -p"+l1+" urn:fibonacci fibonacci.Fibonacci" );
    			} catch (Exception e) { }
     
     
    	}
     
    }
    Le resultat qui devait être la création d'un fichier WDSL (fib.wsdl) ne donne rien, même un message d'erreur.

    Merci pour votre aide.

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par demcoul Voir le message
    ne donne rien, même un message d'erreur.
    En même temps c'est un peu normal :
    • Tu ne lis pas les flux de sorties de tes process (donc pas moyen de voir leurs éventuels messages d'erreur).
    • Tu utilises un bloc catch vide ! Comme cela c'est sûr que tu ne sera pas embêté par les messages d'erreur


    De plus :
    • Il est préférable de passer à exec() chaque paramètre indépendamment dans un String[] plutôt qu'une grande chaine de caractère...
    • Tu dois traiter TOUS les flux d'entré/sorties des process que tu crées.
    • Lancer un process pour faire un CD est totalement inutile, puisque cela ne concernera que le process lancé et non pas les suivant ! Si tu veux changer le répertoire de travail il faut utiliser la méthode exec() adapté.
    • Non seulement c'est spécifique à Windows, mais cmd /k laisse le shell ouvert Tes process ne finiront jamais. Il serait préférable d'utiliser cmd /C ou directement java (puisque tu n'as apparemment pas besoin des spécificités du shell).



    Plus d'info :


    Sans compter le grand nombre de sujet sur le forum...

    a++

  3. #3
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2005
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mali

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2005
    Messages : 246
    Par défaut
    merci, je pense pouvoir me débrouiller.

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur JAVA JEE / PHP
    Inscrit en
    Avril 2008
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur JAVA JEE / PHP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 151
    Par défaut
    bon cd n'est pas une commande de dos a 100%, donc tu ne peux faire cette commande avec Runtime.

  5. #5
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2005
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mali

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2005
    Messages : 246
    Par défaut
    Après avoir rapidement fait une lecture du tuto, voici ce que j'ai fait, main sans succèss.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
     
    import java.io.*;
    public class AutoFib {
    	public static void main(String[] args) {
     
    		try { 
    			//Runtime.getRuntime().exec("cmd.exe /k javac c:\\cwsjava\\test\\Fibonacci.java" ); 
    			File f=new File(".\\cwsjava");
    			String l="\""+"http://localhost:8080/axis/services/fibonacci"+"\"";
    			String l1="\""+"fibonacci"+"\"";
    			System.out.println(l);
    			System.out.println(l1);
    			String [] arg={"cmd.exe", "java", "org.apache.axis.wsdl.Java2WSDL", "-o", "fib.wsdl", "-l", l, "-n", "urn:fibonacci", "-p"+l1, "urn:fibonacci", "fibonacci.Fibonacci"};
    			Runtime.getRuntime().exec(arg);
    			} catch (Exception e) {e.printStackTrace(System.out); }
     
    }
    }
    Merci.

  6. #6
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par adiGuba Voir le message
    • Tu ne lis pas les flux de sorties de tes process (donc pas moyen de voir leurs éventuels messages d'erreur).
    Non seulement tu ne vois pas les messages de l'application que tu lances, mais cela pourrait également la bloquer si elle écrit trop de données ou qu'elle attend des données en entrée...

    De plus soit tu utilises cmd.exe avec 2 paramètres pour utiliser le shell, soit tu n'utilises pas cmd.exe et tu appelles directement le programme avec ses paramètres...


    a++

  7. #7
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2005
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mali

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2005
    Messages : 246
    Par défaut
    Bonjour,

    Voilà après une lecture attentive de votre tuto, j'ai alors opté pour un exec(String[] cmdarray, String[] env).

    Voici le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    import java.io.*;
    public class AutoFib {
     
    	/**
             * @param args
             */
    	public static void main(String[] args) {
    		// TODO Raccord de méthode auto-généré
     
    		try { 
    			//Runtime.getRuntime().exec("cmd.exe /k javac c:\\cwsjava\\test\\Fibonacci.java" ); 
    			File f=new File(".\\cwsjava\\test\\");
    			Runtime runtime=Runtime.getRuntime();
    			String l="\""+"http://localhost:8080/axis/services/fibonacci"+"\"";
    			String l1="\""+"fibonacci"+"\"";
    			System.out.println(l);
    			System.out.println(l1);
    			String pf="Program "+"Files";
    			String [] arg={"cmd.exe","/C","C:\\Program Files\\Java\\jdk1.5.0_12\\java", "-classpath", "org.apache.axis.wsdl.Java2WSDL", "-o", "fib.wsdl", "-l"+l, "-n", "urn:fibonacci", "-p"+l1, "urn:fibonacci", "fibonacci.Fibonacci"};
    			String[] envp={}; // je voulais dire que l'environnement est la classpath par défaut
    			final Process process=runtime.exec(arg,envp);
    			new Thread(){
    				public void run(){
    					try{
    					BufferedReader reader=new BufferedReader(new InputStreamReader(process.getErrorStream()));
    					String line="";
    					try {
    						while((line=reader.readLine())!=null){
    							System.out.println(line);
    						}
    					} finally{reader.close();}
    					}catch(IOException ioe){ioe.printStackTrace();}
    					}
    				}.start();
    			} catch (Exception e) {e.printStackTrace(System.out); }
    	}
    A l'exécution, j'obtien le message d'erreur suivant :

    'C:\Program' n'est pas reconnu en tant que commande interne
    ou externe, un programme exécutable ou un fichier de commandes.


    Qaund l'enlève le chemin de java en dur, c'est alors le message


    'java' n'est pas reconnu en tant que commande interne
    ou externe, un programme ex‚cutable ou un fichier de commandes.


    Par ailleurs, je voulais aussi définir le repertoire de travail, mais en utilisant exec(String[} cmdarray, String[] env, File dir).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    final Process process=runtime.exec(arg,envp,f);
    Cela provoque aussi une erreur d'exception du type :



    java.io.IOException: CreateProcess: cmd.exe /C java -classpath org.apache.axis.wsdl.Java2WSDL -o fib.wsdl -l"http://localhost:8080/axis/services/fibonacci" -n urn:fibonacci -p"fibonacci" urn:fibonacci fibonacci.Fibonacci error=267
    at java.lang.ProcessImpl.create(Native Method)
    at java.lang.ProcessImpl.<init>(ProcessImpl.java:81)
    at java.lang.ProcessImpl.start(ProcessImpl.java:30)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:451)
    at java.lang.Runtime.exec(Runtime.java:591)
    at fibonacci.AutoFib.main(AutoFib.java:23)


    Alors comment corriger.

  8. #8
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Pour hériter de l'environnement, il ne faut pas mettre un environnement vide, mais un environnement null :
    De plus l'environnement n'a rien à voir avec la notion de classpath ! C'est une notion des systèmes d'exploitations...

    Deuxièmement : soit tu appelles directement java en séparant les paramètres tel qu'il les recevra :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String [] arg={"C:\\Program Files\\Java\\jdk1.5.0_12\\java", "-classpath", "org.apache.axis.wsdl.Java2WSDL", "-o", "fib.wsdl", "-l"+l, "-n", "urn:fibonacci", "-p"+l1, "urn:fibonacci", "fibonacci.Fibonacci"};
    Soit tu utilises cmd.exe avec 2 paramètres et la ligne de commande complète comme paramètre, tel qu'elle devrait être saisie (avec des quotes pour protégé les espaces...).


    Enfin encore une fois il faut traiter TOUS les flux d'entré/sorties...


    a++

  9. #9
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2005
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mali

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2005
    Messages : 246
    Par défaut
    Excusez moi,

    Mais je viens de choisir la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    String [] arg={"C:\\Program Files\\Java\\jdk1.5.0_12\\java", "-classpath", "org.apache.axis.wsdl.Java2WSDL", "-o", "fib.wsdl", "-l",l,"-n", "urn:fibonacci", "-p"+l1, "urn:fibonacci", "fibonacci.Fibonacci"};
     
    String envp=null;
    File f=new File(".\\cwsjava\\test\\");// le repertoire dans lequel se trouve ma classe java fibonacci.Fibonacci.class 
     
    final Process process=runtime.exec(arg,envp,f);
    Cela donne un message d'erreur IOException :



    java.io.IOException: CreateProcess: "C:\Program Files\Java\jdk1.5.0_12\java" -classpath org.apache.axis.wsdl.Java2WSDL -o fib.wsdl -l "http://localhost:8080/axis/services/fibonacci" -n urn:fibonacci -p"fibonacci" urn:fibonacci fibonacci.Fibonacci error=2
    at java.lang.ProcessImpl.create(Native Method)
    at java.lang.ProcessImpl.<init>(ProcessImpl.java:81)
    at java.lang.ProcessImpl.start(ProcessImpl.java:30)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:451)
    at java.lang.Runtime.exec(Runtime.java:591)
    at fibonacci.AutoFib.main(AutoFib.java:23)


    Comme vous le voyez, l'exécution s'arrête au niveau de la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    final Process process=runtime.exec(arg,envp,f);
    et les traitements ne sont plus faits.

    Deuxièment : Je voulais un peu d'explication sur le traitement des flux, car j'ai juste fais un print, pour voir ce qui se passe. Je n'arrive pas du tout à comprendre la notion de traitement, si cela ne vous dérrange pas un petit exemple.

    merci.

  10. #10
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2005
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mali

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2005
    Messages : 246
    Par défaut
    Merci beaucoup pour vos remarques, je viens de reussir.
    Vous êtes un genie tout simplement.

  11. #11
    Membre averti
    Inscrit en
    Août 2008
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 31
    Par défaut
    Bonjour,
    voilà j'ai déjà déposé le problème sur ce site
    mais je pense que vous pourriez m'aider

    J’ai rencontré un problème hier avec la limitation des chemins
    enfin je pense que c'est ce qui cause problème
    je fais un pre processing des fichier cpp

    Voilà par exemple je lance cette commande :

    String[] cmd = new String[] {"Resource\\gcc.exe",
    "-E",
    in_path,
    ">",
    "out_path"};

    in_path : le chemin ou se trouve mon dossier cpp
    out_path: le fichier de sortie apres le pre processing qui porte le meme nom que celui en entrée et donc fichier.cpp

    par exemple
    in_path= d:/dossiercpp/fichier.cpp
    out_path= fichier.cpp

    Et bien il y a deux cas qui ne fonction dans les tests
     Si le chemin où sont mis les fichier cpp pour les test est trop long
    Dans ce cas ça passe pas
     Si le chemin est court et que le nom du fichier contient plus de 8caractère alors ça passe pas aussi.

    J’ai lu que le gcc est limité en nombre de caractère seulement quant je lance
    Ma commande dans l’invite de commande ça passe
    J’imagine que avec les pre processing qui existe déjà les fichiers ont plus de 8 caractère
    Et les chemins des tests client sont long
    Donc pourquoi ça ne marche pas dans mon cas
    Dois-je rajouter une option ou autre ???

    Cordialement,

  12. #12
    Membre averti
    Inscrit en
    Février 2010
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 17
    Par défaut lancer cmd a distance
    bonsoir
    alors je vous pose ma question comment on peut executer des fichier.cmd a partir d'un prg java a savoir que ces fichier existe sur un serveur windows server 2003

    merci en avance

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec runtime developpeur et client
    Par leberger dans le forum Silverlight
    Réponses: 7
    Dernier message: 01/10/2010, 18h07
  2. Réponses: 4
    Dernier message: 17/12/2008, 22h02
  3. Problème avec Runtime.exec()
    Par Vince182 dans le forum Langage
    Réponses: 2
    Dernier message: 24/10/2007, 17h48
  4. [Runtime] Problème avec la méthode 'exec'
    Par regisba dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 25/08/2006, 13h36
  5. problème avec runtime
    Par jouf dans le forum Runtime
    Réponses: 1
    Dernier message: 07/04/2006, 15h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo