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 :

execution de programme externe


Sujet :

avec Java

  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2007
    Messages : 643
    Points : 305
    Points
    305
    Par défaut execution de programme externe
    Salut à tous,

    J'ai besoin, à travers un programme JAVA, de lancer un script ant.
    Je m'aide pour ça de 2 tutorials qui sont les suivants :
    http://blog.developpez.com/adiguba?t...es_plus_simple
    http://ydisanto.developpez.com/tutoriels/j2se/runtime/

    Pourtant malgré l'aide de ces tutos je n'arrive pas à lancer ma commande.
    J'essaie en vain des tas de possibilités mais je ne fait que tourné en rond.

    J'ai déjà créé un fichier batch qui lance mon script de la manière suivantes:
    ant -buildfile script\ant_script.xml

    J'ai donc pour le moment 2 soucis majeurs pour ma commande sous JAVA:
    -les espaces, car j'utilise un chemin absolu avec le dossier program Files dedans
    -les arguments, car je lance mon programme ant avec 2 arguments.

    Je vous joint une de mes lignes de code de test pour l'appel de ma commande en JAVA :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Runtime runtime = Runtime.getRuntime();
    runtime.exec("C:/Program%20Files/apache-ant-1.7.1/bin/ant -buildfile D:/projet/test/script/ant_packers_script.xml");

  2. #2
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    En même temps, ANT propose une API permettant de déclencher des builds directement depuis java, ce qui est un peu plus propre que de bon vieux Runtime.

    http://www.ibm.com/developerworks/we...502_gawor.html
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2007
    Messages : 643
    Points : 305
    Points
    305
    Par défaut
    Disons que c'est dans le cadre d'un apprentissage de JAVA que je fait ca donc même si il existe plus simple, il est important pour moi de programmer quelques chose en JAVA pour faire cela.

    Mais je garde l'info au chaud

  4. #4
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2007
    Messages : 643
    Points : 305
    Points
    305
    Par défaut
    J'ai trouvé ce code mais qui malheureusement ne marche que pour des fichiers textes, aller savoir pourquoi...

    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
     java.io.*;
     public class Exec {
     public static void main(String[] args) {
     String cmd;
     
     cmd = "cmd /c c:\\fichier.bat";
     
     try {
     Runtime r = Runtime.getRuntime();
     Process p = r.exec(cmd);
     p.waitFor();//si l'application doit attendre a ce que ce process fini
     }catch(Exception e) {
     System.out.println("erreur d'execution " + cmd + e.toString());
     }
     }

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2007
    Messages : 643
    Points : 305
    Points
    305
    Par défaut
    Je pense avoir trouver une partie de la réponse dans ce tutorial:
    http://www.valhalla.fr/2001/03/17/co...rogramme-java/

    Malheureusement j'ai un soucis dans l'interprétation de ma ligne de commande qui contient ce fameux "program Files" et son espace.

    J'ai essayer %20, \, etc... rien à faire il me dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cannot run program ""C:\Program":
    Si vous avez des idées je suis très preneur

  6. #6
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2007
    Messages : 643
    Points : 305
    Points
    305
    Par défaut
    Il semblerais que cela marche bien avec des espaces quand la commande pointe sur une fichier .exe mais pas pour un .bat...

    N'est-il dont pas possible de lancer un programme bat avec des paramètres sous JAVA ?

  7. #7
    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,

    Citation Envoyé par miltone Voir le message
    Si tu aurais tout lu tu aurais surement vu qu'il est préférable d'utiliser la version exec(String[]) pour séparer les paramètres, et qu'il est nécessaire de traiter les flux d'E/S depuis différents thread...

    Bref on est bien loin du code que tu donnes !



    Sinon, je n'ai pas compris pourquoi la solution de sinok ne te convient pas

    a++

  8. #8
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mexique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 328
    Points : 459
    Points
    459
    Par défaut
    Salut,

    Tu peux essayer ceci:

    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
     
             Runtime runtime = Runtime.getRuntime();
             try
             {
                runtime.exec(new String[]
                           { "C:\\Chemin\\ton.bat"});
                     //ou bien par exemple t'inspirer de:
    // { "C:\\Program Files\\Adobe\\Reader 8.0\\Reader\\AcroRd32.exe",
                           //    "C:\\Mes programmes\\T07GR-F.pdf"});
             } 
                 catch(Exception err)
                {
                   ...........
                   ..........
                }
    Cordialement,

    Dan

  9. #9
    Membre régulier Avatar de fatypunk
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2007
    Messages : 71
    Points : 74
    Points
    74
    Par défaut
    Citation Envoyé par miltone Voir le message
    Disons que c'est dans le cadre d'un apprentissage de JAVA que je fait ca donc même si il existe plus simple, il est important pour moi de programmer quelques chose en JAVA pour faire cela.

    Mais je garde l'info au chaud
    Si tu apprends à coder en java alors je tiens à te dire une chose à mes yeux cruciale : on choisit un language, une plateforme, un framework en fonction des besoins ! Chaque solution présente des avantages et des inconvénients ! Le principal avantage de java réside dans sa portabilité : Linux, Windows, Mac Os, Solaris, téléphone portable et même frigo... Ton code n'est pas portable et donc annule un des principaux avantage de la plateforme java...

    Il existe un tas de solution plus propre. Une solution simple est de placer la commande à exécuter comme un paramètre modifiable à l'extérieur du code ! Par exemple dans un fichier de configuration en xml. Une autre solution serait de placer le code spécifique à une plateforme hôte dans un fichier de script externe dans un langage de script directement l'exécutable par la JVM : ruby, beanshell, ... on pourrait alors sélectionner ou écrire un script pour n'importe quelle plateforme hôte !
    Développeur Java SE, Java EE (EJB3)
    IDE : Netbeans 6.5 / Serveur d'application : Glassfish v2.1 / OS : Ubuntu 8.10 Intrepid Ibex et CentOS 5
    Historique : GWBasic, Turbo Pascal (beaucoup), Visual Basic, C (un peu), C++ (beaucoup), Assembleur (6800 et x86 / un peu), Java, Smalltalk (un peu), Lisp (un peu), Prolog (un peu), PHP, Ruby (un peu), et retour à Java (beaucoup).

    Pas de questions techniques par MP s'il vous plait !

  10. #10
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Citation Envoyé par fatypunk Voir le message
    Il existe un tas de solution plus propre. Une solution simple est de placer la commande à exécuter comme un paramètre modifiable à l'extérieur du code ! Par exemple dans un fichier de configuration en xml. Une autre solution serait de placer le code spécifique à une plateforme hôte dans un fichier de script externe dans un langage de script directement l'exécutable par la JVM : ruby, beanshell, ... on pourrait alors sélectionner ou écrire un script pour n'importe quelle plateforme hôte !
    Sachant que la solution la plus propre en full java je la cite un poil plus haut...
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  11. #11
    Membre régulier Avatar de fatypunk
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2007
    Messages : 71
    Points : 74
    Points
    74
    Par défaut
    Citation Envoyé par sinok Voir le message
    Sachant que la solution la plus propre en full java je la cite un poil plus haut...
    Autant pour moi je ne connaissais pas... J'ai parcouru en vitesse le lien que tu donne mais il y a un truc que je n'ai pas saisi : Le tout est compilé ou tu peux modifier un fichier après installation afin de l'adapter à un autre os/archi par exemple ?
    Développeur Java SE, Java EE (EJB3)
    IDE : Netbeans 6.5 / Serveur d'application : Glassfish v2.1 / OS : Ubuntu 8.10 Intrepid Ibex et CentOS 5
    Historique : GWBasic, Turbo Pascal (beaucoup), Visual Basic, C (un peu), C++ (beaucoup), Assembleur (6800 et x86 / un peu), Java, Smalltalk (un peu), Lisp (un peu), Prolog (un peu), PHP, Ruby (un peu), et retour à Java (beaucoup).

    Pas de questions techniques par MP s'il vous plait !

  12. #12
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2007
    Messages : 643
    Points : 305
    Points
    305
    Par défaut
    Merci à toi danimo pour ta réponse qui marche.

    J'avais oublié de précisé une chose très importante. Mais j'apprend JAVA et je dois me basé exclusivement sur la JDK et rien d'autre.
    Voilà pourquoi les autres solutions apportés n'étaient pas convenable pour moi.
    Je dois travaillé de façon la plus simple et standard possible car c'est déjà assez complexe pour moi.
    L'idée n'est pas de trouver la meilleure solution mais la plus simple qui soit en utilisant que la JDK.

    Néanmoins Vous conseils sont utiles et j'en prend bonne note.
    Il me serviront bientôt quand j'aurais acquis un peu plus de connaissance.

    J'arrive à exécuter des commandes comme dans une console windows mais je n'arrive pas à obtenir un retour de la commande dans ma console netbeans.
    J'essaie d'utiliser "getOutputStream();" mais ca ne donne rien.

    Pour le moment je peux résumé mon code à 1 ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Process proc = Runtime.getRuntime().exec("C:\\test.bat");

  13. #13
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2007
    Messages : 643
    Points : 305
    Points
    305
    Par défaut
    J'arrive à obtenir une substitution de la console de windows à celle de Netbeans mais cela ne marche que pour 1 seul ligne et surtout après l'execution complète de ma commande appelée et non en même temps.

    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
    try {
            Process proc = Runtime.getRuntime().exec(new String[]{ "C:\\Program Files\\apache-ant-1.7.1\\bin\\ant.bat",
                    "-buildfile","D:\\test\\test\\script\\ant_packers_script.xml"});
            InputStream os = proc.getInputStream();
     
            StringWriter writer=new StringWriter();
        InputStreamReader streamReader=new InputStreamReader(os);
        //le buffer permet le readline
        BufferedReader buffer=new BufferedReader(streamReader);
        String line="";
        while ( null!=(line=buffer.readLine())){
        writer.write(line);
        }
        // Sortie finale dans le String
        System.out.println(writer.toString());
           } 
       catch (IOException e) 
           {
     
           }
    Comment pouvoir substitué intégralement les messages de la console windows à celle de l'IDE et par extension au programme ?

  14. #14
    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
    Exécuter une application externe en Java - Consommation des flux

    TOUS les flux doivent être traité (ou fermé)...

    a++

  15. #15
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2007
    Messages : 643
    Points : 305
    Points
    305
    Par défaut
    en fait je constate que JAVA ne veux pas m'executer 1 batch précis alors que celui-ci marche très bien quand je le lance seul.

    C'est assez curieux comme soucis non?

    voici le batch qui ne veux pas ce lancer :

    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
    @ECHO OFF
    color F0
    cls
    title PACKERS
    echo 				PACKERS 2.0
    echo.
    echo ------------------------------------------------------------------------------
     
    REM cherche sur le lecteur système la présence des dossiers des outils installés.
     
    echo recherche des outils(ant, izpack, launch4j) en cours...
     
    set Liste=C
    for %%a in (%Liste%) do for /f "delims=" %%b in ('dir /s /b /ad "%%a:\" 2^>NUL ^| findstr /i "apache-ant-1.7.1"') do (
    set ANT=%%b
    goto sortie1
    )
    :sortie1
    set Liste=C
    for %%a in (%Liste%) do for /f "delims=" %%b in ('dir /s /b /ad "%%a:\" 2^>NUL ^| findstr /i "Launch4j"') do (
    set LAUNCH4J=%%b
    goto sortie2
    )
    :sortie2
    set Liste=C
    for %%a in (%Liste%) do for /f "delims=" %%b in ('dir /s /b /ad "%%a:\" 2^>NUL ^| findstr /i "izpack"') do (
    set IZPACK=%%b
    goto sortie3
    )
    :sortie3
     
    REM demande le nom et la version du projet désiré
    echo.
    echo tapez le numero de la version de GLU2008 souhaite 
    echo sinon appuyer sur entrer pour recuperer la version 
    echo en cours de developpement
    echo.
    Rset /p VERSION=numero de version :
    pause
     
    call ant -buildfile script\ant_packers_script.xml > test.txt
    pause
    y a t-il des conditions de batch pour que celui-ci soit lancé par JAVA?

  16. #16
    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
    Citation Envoyé par miltone Voir le message
    en fait je constate que JAVA ne veux pas m'executer 1 batch
    C'est à dire ? Comment constates-tu cela ?
    Et à quoi correspond ton code ? Si c'est celui de ton message précédent c'est tout à fait normal (cf ma réponse précédente). Au passage le catch() vide ca craint

    Citation Envoyé par miltone Voir le message
    y a t-il des conditions de batch pour que celui-ci soit lancé par JAVA?
    Heu au hasard : traiter tous les flux...

    a++

  17. #17
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mexique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 328
    Points : 459
    Points
    459
    Par défaut
    Citation Envoyé par miltone Voir le message
    Comment pouvoir substitué intégralement les messages de la console windows à celle de l'IDE et par extension au programme ?
    Peut-être as tu un "bouton" genre Build te permettant de valider ou non certaines options en cochant une case type "run in MSDOS Window".

    C'est le cas avec mon IDE (jGRASP) .

    Cordialement,

    Dan

Discussions similaires

  1. [C#] Comment executer un programme externe ?
    Par Worldofdada dans le forum C#
    Réponses: 7
    Dernier message: 11/02/2009, 14h36
  2. [Système] execution des programmes externes
    Par jadoo dans le forum Langage
    Réponses: 2
    Dernier message: 06/11/2006, 16h55
  3. Exécuter un programme externe et détecter sa terminaison
    Par leserapheen dans le forum Pascal
    Réponses: 10
    Dernier message: 04/10/2006, 17h19
  4. [VB6]Executer un programme externe et récuperer les sorties
    Par agro dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 29/03/2006, 13h08
  5. [Système] Executer un programme externe depuis un scripte php
    Par Scorpion Rouge dans le forum Langage
    Réponses: 1
    Dernier message: 24/01/2006, 11h59

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