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]exec d'une commande DOS [FAQ]


Sujet :

API standards et tierces Java

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 66
    Points : 43
    Points
    43
    Par défaut [Runtime]exec d'une commande DOS
    Salut à tous,

    J'ai une exception en essayant de créer un process via la fonction exec de la classe Runtime.
    J'essaye de lancer la commande wscompile (du JWSDP). Même en essayant de lancer la commande "dir", j'ai la même erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    java.io.IOException: CreateProcess: wscompile -gen:client -d "C:\Documents and Settings\dme\.dum4ws\tmp\classes" -classpath "C:\Documents and Settings\dme\.dum4ws\tmp\classes" "C:\Documents and Settings\dme\.dum4ws\config-wsdl.xml" 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 java.lang.Runtime.exec(Runtime.java:464)
    Quand je lance exactement la même commande dans une invite DOS, ça marche.

    ça fait la même chose si je spécifie le patch complet de la commande wscompile.

    Quelqu'un peut me dire ce qui ne va pas...

    Pour info voilà ma classe qui lance la commande:
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    public class WSDL2JavaNoExit {
     
      public static Logger m_logger = Logger.getLogger(WSDL2JavaNoExit.class);
     
      /****
       * Lance wscompile
       */
      public static void run(String dir_out_stub) throws Exception{
            try {
          Runtime rt = Runtime.getRuntime();
          String cmd[] = new String[7];
          cmd[0] = "wscompile";
          cmd[1] = "-gen:client";
          cmd[2] = "-d";
          cmd[3] = dir_out_stub;
          cmd[4] = "-classpath";
          cmd[5] = dir_out_stub;
          cmd[6] = "L:\\config-wsdl.xml";
          m_logger.debug("Launch the command " + cmd);
          Process proc = rt.exec(cmd);
          // any error message?
          StreamGobbler errorGobbler = new StreamGobbler(proc.getErrorStream(), "ERROR");
          // any output?
          StreamGobbler outputGobbler = new StreamGobbler(proc.getInputStream(), "OUTPUT");
          // kick them off
          errorGobbler.start();
          outputGobbler.start();
          // any error???
          int exitVal = proc.waitFor();
          m_logger.debug("ExitValue: " + exitVal);
        }
        catch (Exception e) {
          m_logger.fatal("Exception catched",e);
        }
      }
    }
     
    /****
     * Récupère la sortie standard de la commande wscompile
     */
    class StreamGobbler extends Thread
    {
      public static Logger m_logger = Logger.getLogger(StreamGobbler.class);
      InputStream is;
      String type;
      StreamGobbler(InputStream is, String type) {
        this.is = is;
        this.type = type;
      }
     
      public void run() {
        try {
          InputStreamReader isr = new InputStreamReader(is);
          BufferedReader br = new BufferedReader(isr);
          String line = null;
          while ( (line = br.readLine()) != null)
            m_logger.debug(type + ">" + line);
        }
        catch (IOException ioe) {
          m_logger.error("Exception catched",ioe);
        }
      }
    }
    Merci
    fifi

  2. #2
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Points : 1 996
    Points
    1 996
    Par défaut Re: [Runtime]exec d'une commande
    Citation Envoyé par fidififouille
    Salut à tous,

    J'ai une exception en essayant de créer un process via la fonction exec de la classe Runtime.
    J'essaye de lancer la commande wscompile (du JWSDP). Même en essayant de lancer la commande "dir", j'ai la même erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    java.io.IOException: CreateProcess: wscompile -gen:client -d "C:\Documents and Settings\dme\.dum4ws\tmp\classes" -classpath "C:\Documents and Settings\dme\.dum4ws\tmp\classes" "C:\Documents and Settings\dme\.dum4ws\config-wsdl.xml" 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 java.lang.Runtime.exec(Runtime.java:464)
    Quand je lance exactement la même commande dans une invite DOS, ça marche.

    ça fait la même chose si je spécifie le patch complet de la commande wscompile.

    Quelqu'un peut me dire ce qui ne va pas...

    Pour info voilà ma classe qui lance la commande:
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    public class WSDL2JavaNoExit {
     
      public static Logger m_logger = Logger.getLogger(WSDL2JavaNoExit.class);
     
      /****
       * Lance wscompile
       */
      public static void run(String dir_out_stub) throws Exception{
            try {
          Runtime rt = Runtime.getRuntime();
          String cmd[] = new String[7];
          cmd[0] = "wscompile";
          cmd[1] = "-gen:client";
          cmd[2] = "-d";
          cmd[3] = dir_out_stub;
          cmd[4] = "-classpath";
          cmd[5] = dir_out_stub;
          cmd[6] = "L:\\config-wsdl.xml";
          m_logger.debug("Launch the command " + cmd);
          Process proc = rt.exec(cmd);
          // any error message?
          StreamGobbler errorGobbler = new StreamGobbler(proc.getErrorStream(), "ERROR");
          // any output?
          StreamGobbler outputGobbler = new StreamGobbler(proc.getInputStream(), "OUTPUT");
          // kick them off
          errorGobbler.start();
          outputGobbler.start();
          // any error???
          int exitVal = proc.waitFor();
          m_logger.debug("ExitValue: " + exitVal);
        }
        catch (Exception e) {
          m_logger.fatal("Exception catched",e);
        }
      }
    }
     
    /****
     * Récupère la sortie standard de la commande wscompile
     */
    class StreamGobbler extends Thread
    {
      public static Logger m_logger = Logger.getLogger(StreamGobbler.class);
      InputStream is;
      String type;
      StreamGobbler(InputStream is, String type) {
        this.is = is;
        this.type = type;
      }
     
      public void run() {
        try {
          InputStreamReader isr = new InputStreamReader(is);
          BufferedReader br = new BufferedReader(isr);
          String line = null;
          while ( (line = br.readLine()) != null)
            m_logger.debug(type + ">" + line);
        }
        catch (IOException ioe) {
          m_logger.error("Exception catched",ioe);
        }
      }
    }
    Merci
    fifi
    L'erreur 2 indique qu'il ne trouve pas le fichier.

    "Dir" est un mauvais exemple car c'est une commande interne du shell de windows.

    "wscompile" est-il une batch commande?

    Si oui, alors essaie avec "cmd /c".

    Modifie ainsi ton code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // Création de la commande à éxecuter
     
    StringBuffer command = new StringBuffer(512);
    command.append("wscompile "); // préférable avec le path complet
    command.append("-gen:client "); 
    command.append(-d \"" +dir_out_stub+ "\" ");
    command.append(-classpath \"" +dir_out_stub+  "\" ");
    command.append("L:\\config-wsdl.xml");
     
    cmd[0] = "cmd";
    cmd[1] = "/c";
    cmd[2] = command.toString();
    Bien le bonjour chez vous
    Jowo

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 56
    Points : 59
    Points
    59
    Par défaut
    Salut,

    Le problème pourrait venir des "antislash" de tes chemins de répertoire.

    Tu devrais essayer de déspécialiser tes antislash avec...... un autre antislash !

    Ce qui donnerait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    wscompile -gen:client -d "C:\\Documents and Settings\\dme\\.dum4ws\\tmp\\classes" -classpath "C:\\Documents and Settings\\dme\\.dum4ws\\tmp\\classes" "C:\\Documents and Settings\\dme\\.dum4ws\\config-wsdl.xml"
    @ +

    ToCToF

  4. #4
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 66
    Points : 43
    Points
    43
    Par défaut
    déjà essayé.
    En plus, j'ai exactement la même exception quand j'essaye de lancer juste la commande "dir"
    rt.exec("dir");

    ça fait pareil !


  5. #5
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Points : 1 996
    Points
    1 996
    Par défaut
    As-tu mon lu message?

    Dir est LE PIRE EXEMPLE . Dir est une commande interne du shell de Windows. Il n'existe pas d'éxecutable s'appelant dir.exe, dir.bat, dir.cmd ou dir.com

    code pour lancer la commande 'dir':

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    runtime.exec(String [] {"cmd", "/c", "dir"});
    En plus ça ne va pas fonctionner car tu ne lis pas la sortie standard du sous-processus créé.
    Bien le bonjour chez vous
    Jowo

  6. #6
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 66
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par jowo
    As-tu mon lu message?
    Sorry,
    (wscompile de JWSDP est un .bat)
    j'avais pas vu ton message.
    En effet, ça marche avec la méthode cmd /c <ligne de commande à lancer>
    Avec mon thread streamGobbler j'arrive a récupérer les sorties std de wscompile.
    Le truc, c'est que le exitValue de int exitVal = proc.waitFor(); est celui du process cmd.
    Comment je fais pour récupérer le errorlevel (le code retour) de ma commande wscompile ?

    Merci de vos aides !!!
    Fifi

  7. #7
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Points : 1 996
    Points
    1 996
    Par défaut
    Citation Envoyé par fidififouille
    Citation Envoyé par jowo
    As-tu mon lu message?
    Comment je fais pour récupérer le errorlevel (le code retour) de ma commande wscompile ?

    Merci de vos aides !!!
    Fifi
    C'est une question plutôt "système windows" que java .

    Je crois qu'en utilisant la commande 'EXIT [ExitCode]'.
    Il faut modifier ton fichier wscompile pour qu'il termine avec la commande 'EXIT %ErrorLevel%'.

    Dans ton fichier wscompile.bat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    wscompile.exe ....
    set ErrorWSC = %ErrorLevel%
     
    Exit %ErrorWSC%
    Je te laisse le plaisir de tester tout ça
    Bien le bonjour chez vous
    Jowo

  8. #8
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 66
    Points : 43
    Points
    43
    Par défaut
    Merci merci !
    je vais me débrouiller pour récupérer le code retour correctement.
    Merciiiii

    fifi

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

Discussions similaires

  1. lancer Internet explorer pas une commande DOS
    Par dsr57 dans le forum Windows
    Réponses: 4
    Dernier message: 03/12/2010, 14h52
  2. [Runtime]exec() avec une commande paramétrée
    Par nice dans le forum Général Java
    Réponses: 9
    Dernier message: 12/05/2005, 13h15
  3. Réponses: 3
    Dernier message: 22/10/2004, 12h04
  4. [Debutant(e)][Système]Executer une commande DOS
    Par iceman dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 18/05/2004, 14h30
  5. [VB6] probleme de redirection d'une commande DOS
    Par WriteLN dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 10/06/2003, 09h36

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