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

avec Java Discussion :

Problème avec Process.exec() (Ligne de commande complexe)


Sujet :

avec Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 97
    Points : 47
    Points
    47
    Par défaut Problème avec Process.exec() (Ligne de commande complexe)
    Bonjour à tous


    Je développe actuellement une application (Netbeans 8.0 et Ubuntu) devant impérativement appeler durant son exécution un autre programme java. Pour ce faire, j'utilise habituellement, dans le shell la ligne de commande suivante :

    java -Xmx1G -classpath /home/user/software/a.jar:/home/user/software/b.jar:/home/user/software/c.jar:/home/user/software/d.jar:. /home/user/software/Script 0 1 0 1 /home/user/LSEQU/ 1000 32 1000 32 10 28 1000 1191 1 1 0 0 0 0 S 25 90 0 0 0 0 T 0 100 1 0.0 1000 /home/user/tmp/ Model 0 B 0 0 CLASSIC 0 1 LIBSVM /home/user/software/libsvm/ 0 L 1 1 S 0


    où je suis obligée d'allouer explicitement de la mémoire à la machine virtuelle java, où je dois citer explicitement l'ensemble des .jar dont le programme appelé a besoin pour son exécution, et, où le script de lancement du programme Script.java, requiert énormément de paramètres (0 1 0 1 /home/user/LSEQU/ 1000 32 1000 32 10 28 1000 1191 1 1 0 0 0 0 S 25 90 0 0 0 0 T 0 100 1 0.0 1000 /home/user/tmp/ Model 0 B 0 0 CLASSIC 0 1 LIBSVM /home/user/software/libsvm/ 0 L 1 1 S 0
    ), pour que le programme "software" puisse s'exécuter correctement. J'insiste sur le fait que cette ligne de commande fonctionne parfaitement dans le shell.

    Or, mon problème est le suivant : Lorsque j'utilise Process.exec(), je n'arrive pas à faire en sorte que cela fonctionne. En effet, il semblerait que toutes les combinaisons de tableaux de String essayées jusque maintenant n'aient pas convenu...

    Je suis consciente que je dois absolument passer par des tableaux de String, mais mon problème est que je ne sais absolument pas comment les "organiser" pour que ça fonctionne... Ça fait déjà pas mal de temps que je suis sur ce problème, est-ce que quelqu'un parmi vous aurait une idée à me proposer ?

    Je vous remercie d'avance pour votre aide,

    Nath

    ps : je précise que naturellement, même si ce n'est pas mentionné parce-que le problème ne se situe pas là, que les différents threads/flux sont (normalement) correctement gérés... Mon seul et unique problème ici est bien de faire passer la commande java + options de la commande java + arguments de la commande java + programme à exécuter + arguments du programme à exécuter.

  2. #2
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Et donc :
    Quel est l'erreur ?
    Quel est le code en question ?




    Sinon à noter que depuis Java 6 on peut utiliser "*" pour charger tous les jar d'un répertoire.
    Si "/home/user/software/" comporte uniquement les librairies de l'application, on peut remplacer ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    -classpath /home/user/software/a.jar:/home/user/software/b.jar:/home/user/software/c.jar:/home/user/software/d.jar:.
    Par cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    -classpath '/home/user/software/*:.'


    a++

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 97
    Points : 47
    Points
    47
    Par défaut
    Bonjour


    Pour finir j'ai modifié un peu ma façon de faire, voici mon 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
    String path_software = "/home/user/software/";
     
            String pix = "0 1 0 1 /home/user/LS/LS5QU/ 1000 32 1000 32 10 28 1000 1191 1 1 0 0 0 0 S 25 90 0 0 0 0 T 0 100 1 0.0 1000 /home/tmp/ Z 0 B 0 0 C 0 1 L /home/user/ 0 L 1 1 S 0"; 
            String cmd = "java";
            String mem = " -Xmx1G";
            String path = " -classpath a.jar:b.jar:c.jar:d.jar:. Script_cv";
            String command = cmd + mem + path;
            String script = pix;
            String[] argsP = {command,script};
            System.out.println("Command :" + command);
     
            try {
                //Runtime rt = Runtime.getRuntime();
                //System.out.println("Begin running...");
                //Process proc = rt.exec(command); 
                //Process proc = rt.exec(argsP);
     
                ProcessBuilder pb = new ProcessBuilder(argsP);
                pb.directory(new File(path_software));
     
                Process p = pb.start();
     
                ShowFlux outFlux = new ShowFlux(p.getInputStream());
                ShowFlux errFlux = new ShowFlux(p.getErrorStream());
     
                new Thread(outFlux).start();
                new Thread(errFlux).start();
     
                int exitVal = p.waitFor();
                System.out.println("Wainting over. Process exit Value :" + exitVal);
            } catch(IOException e){
                e.printStackTrace();
            } catch (InterruptedException e){
                e.printStackTrace();
            }
     
        }

    Et voici l'erreur que j'obtiens :

    Directory of software : /home/user/software/
    Command :java -Xmx1G -classpath a.jar:b.jar:c.jar:d.jar:. Script_cv
    Arguments software (script) : 0 1 0 1 /home/user/LS/LS5QU/ 1000 32 1000 32 10 28 1000 1191 1 1 0 0 0 0 S 25 90 0 0 0 0 T 0 100 1 0.0 1000 /home/tmp/ Z 0 B 0 0 C 0 1 L /home/user/ 0 L 1 1 S 0
    java.io.IOException: Cannot run program "java -Xmx1G -classpath a.jar:b.jar:c.jar:d.jar:. Script_cv" (in directory "/home/user/software"): error=2, Aucun fichier ou dossier de ce type

    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)


    Auriez-vous une idée du problème ?

    Merci beaucoup !

  4. #4
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    ProcessBuilder attend un tableau de paramètre tel qu'il sera passé au programme.
    Le premier élément doit correspondre au nom du programme, le suivant un premier paramètre, etc.

    La tu essayes d’exécuter un programme qui se nommerait "java -Xmx1G -classpath a.jar:b.jar:c.jar:d.jar:. Script_cv"...


    En clair il faut découper la ligne de commande selon les espaces, puis passer chaque paramètre indépendamment :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ProcessBuilder pb = new ProcessBuilder("java", "-Xmx1G", "-classpath", "a.jar:b.jar:c.jar:d.jar:.", "Script_cv", "0", "1", "0", "1", "/home/user/LS/LS5QU/" /* etc. */ );


    Sinon quelques petites remarques :
    • Ne pas oublier de fermer le flux d'entrée au plus tôt si on ne l'utilise pas (p.getOutputStream().close()).
    • Inutile de créer deux threads. Un des deux flux peut très bien être traité dans le thread courant (c'est toujours mieux que de ne rien faire).
    • Les catch() avec un simple e.printStackTrace() c'est pas terrible
    • Je rajouterais un try/finally avec un process.destroy() à la fin, pour détruire le process en cas de problème



    a++

Discussions similaires

  1. [Mail] Problème étrange avec PHP en ligne de commande
    Par jojosbiz dans le forum Langage
    Réponses: 3
    Dernier message: 21/05/2007, 14h04
  2. Appeler une URL avec & depuis une ligne de commande
    Par Fritzoune dans le forum Shell et commandes GNU
    Réponses: 14
    Dernier message: 13/02/2006, 14h52
  3. [JTable][TableCellRenderer]Problèmes avec coloriage de ligne
    Par Baptiste Wicht dans le forum Composants
    Réponses: 7
    Dernier message: 11/02/2006, 09h33
  4. [FLASH MX2004] Problème avec fscommand("exec", ...
    Par djo.mos dans le forum Flash
    Réponses: 10
    Dernier message: 24/08/2005, 07h49

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