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 :

Lancer une commande (type ligne de commande) depuis programme Java


Sujet :

API standards et tierces Java

  1. #1
    Membre du Club
    Inscrit en
    Février 2006
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 87
    Points : 55
    Points
    55
    Par défaut Lancer une commande (type ligne de commande) depuis programme Java
    Bonjour à tous,

    voilà... je pense que mon titre est explicite mais je vais expliquer ce que je voudrais faire exactement!

    Je voudrais depuis un programme Java exécuter une commande comme si je le faisais dans un terminal... j'utilise la méthode Runtime.getRuntime.exec("ma_commande"); mais j'ai l'impression que rien ne se passe! En fait, tout dépend de ce que je rentre comme commande!

    En gros, quand je lui demande d'exécuter un .bat, il n'y a pas d'erreur à l'exécution mais rien de se passe... Si je lance ce même .bat depuis une invite de commande il n'y a aucun souci alors je commence à m'arracher les cheveux car je suis sur le même problème depuis un moment!

    Je suis obligé de procéder de cette façon car j'utilise un outil qui ne marche qu'en ligne de commande donc pas le choix!

    Si quelqu'un a une idée, je lui en serais très reconnaissant.

    Merci beaucoup et bonne soirée à tous...

  2. #2
    Membre éclairé Avatar de Pollux
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    706
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2005
    Messages : 706
    Points : 680
    Points
    680
    Par défaut
    Aurais-tu fais une recherche avant de poser ta question? Parce que ce sujet a été abordé moultes fois....

    Il faut récupérer les flux in/out de la commande pour voir ce qui se dit...

    Cherche un peu, tu trouveras surement la réponse à ton problème et sinon donne un bout de code et on pourra t'aider
    Pour chaque langage existe une faq / N'oubliez pas de lire les règles du forum

  3. #3
    Membre confirmé Avatar de schniouf
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2003
    Messages : 382
    Points : 474
    Points
    474
    Par défaut
    Salut,

    Sous Windows ça ne marche pas de taper directement la commande. Il faut d'abord lancer cmd.exe, puis taper la commande dans l'invite ! L'option "/c" de cmd.exe permet de spécifier la commande dans l'appel.

    Voici comment tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    try
    {
       Process p = Runtime.getRuntime().exec( "cmd.exe /c monExecutable.exe" );
       java.io.BufferedReader out = new java.io.BufferedReader( new java.io.InputStreamReader( p.getInputStream() ) );
    }
    catch ( IOException e )
    {
    	// Erreur		
    }

  4. #4
    Membre du Club
    Inscrit en
    Février 2006
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 87
    Points : 55
    Points
    55
    Par défaut
    Je vous rassure, j'ai bien effectué une recherche avant de poster ce sujet mais cela ne m'a pas vraiment aidé...

    Je vais tenter de vous expliquer mon souci plus profondément...

    Voilà, j'ai créé un fichier Test.java qui me lance simplement une JFrame (cela me permet de voir directement si le .bat qui doit me lancer le fichier Test.java marche)!

    Voilà le code de mon Test.java:

    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
    import javax.swing.*;
     
     
    public class Test {
     
    	public static void main(String[] args) {
     
    		try {
     
    			JFrame jf = new JFrame("Truc");
                jf.show();
                jf.pack();
     
    		}catch (Exception e) {
    			e.printStackTrace();
    		}
     
    	}
     
    }
    Ensuite, j'ai créé un programme principal dans lequel je fais appel à la méthode Runtime.getRuntime.exec("blabla");... voici le code de ce fichier:

    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
    public class Launcher {
     
    	public static void main(String[] args) throws InterruptedException {
     
    		try {
     
    			final Runtime rt = Runtime.getRuntime();
     
                Process proc = rt.exec("cmd.exe /c go.bat");
                java.io.BufferedReader out = new java.io.BufferedReader( new java.io.InputStreamReader( proc.getInputStream() ) );
     
    			proc.getInputStream().close();
    			proc.getOutputStream().close();
    			proc.getErrorStream().close();
     
     
    		}catch (IOException e) {
    			e.printStackTrace();
    		}
     
    	}
     
    }
    Voici maintenant le code de mon go.bat:

    En lançant mon programme Launcher.java, je n'ai pas d'erreur à l'exécution mais rien ne se passe... je ne vois vraiment pas d'où vient l'erreur!

    Par contre, le fait de faire java.io.BufferedReader out = new java.io.BufferedReader( new java.io.InputStreamReader( proc.getInputStream() ) ); doit me donner quelque chose ou pas?

    Bref, je suis perdu là!!! Au secours et désolé pour mon ignorance sur le sujet!

  5. #5
    Membre du Club
    Inscrit en
    Février 2006
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 87
    Points : 55
    Points
    55
    Par défaut
    Bon il me semble que j'avance un peu... je viens d'apprendre que l'on ne pouvait pas tout lancer avec la méthode Runtime.getRuntime().exec("blabla") mais uniquement lancer des .exe et des .bat (ce que j'essaie de lancer d'ailleurs mais toujours sans succès).

    Il me vient une nouvelle question: peut-on écrire ce que l'on veut dans les fichiers .bat que l'on lance grâce à la méthode que j'ai cité plus haut? En d'autres termes, ai-je le droit de faire appel à des méthodes telles que javac ou java maClasse?

    J'ai l'impression d'avancer mais de repousser le problème plus loin à chaque fois... je commence à désespérer!!!

  6. #6
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 813
    Points : 7 641
    Points
    7 641
    Par défaut
    Citation Envoyé par rprom1
    mais uniquement lancer des .exe et des .bat (ce que j'essaie de lancer d'ailleurs mais toujours sans succès).
    Juste pour préciser que tu ne cherches pas à lancer un .bat, contrairement à ce que tu penses, mais à lancer cmd avec comme argument un .bat. Ce n'est pas tout à fait la même chose pour Java.

    Lance le .bat directement, ça sera aussi simple, et ça marchera beaucoup mieux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Process proc = rt.exec("go.bat");
    Et fais gaffe aux chemins. Avec juste un nom de fichier pour le lancement, tu as plutôt intérêt d'être sûr du répertoire courant...

    Et ne t'inquiète pas si tu n'as pas de fenêtre de commande qui s'affiche, poursi jamais tu faisais afficher quelque chose. Ca va être à toi de gérer les input/ouput/errorStream du process.
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  7. #7
    Membre du Club
    Inscrit en
    Février 2006
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 87
    Points : 55
    Points
    55
    Par défaut
    Je stocke mon .bat dans le même répertoire que mon Launcher.java et d'ailleurs tout est stocké dans ce même répertoire!

    Et sinon, pour ce qui est de lancer un .bat ou un cmd avec un .bat en argument, cela ne change pas grand chose pour moi puisque rien ne se produit dans les deux cas!

    Par contre, je ne m'inquiète pas de ne pas avoir d'invite de commande qui s'ouvre mais il devrait y avoir une JFrame qui s'ouvre puisque c'est ce qu'est censer faire ma classe Test (que j'ai testé en lançant le go.bat directement dans une invite de commande!)

  8. #8
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 813
    Points : 7 641
    Points
    7 641
    Par défaut
    En modifiant ta classe Launcher:

    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
     
    import java.io.*;
     
    public class Launcher2 {
     
    	public static void main(String[] args) {
    		try
    		{
    			final Runtime rt = Runtime.getRuntime();
                            Process proc = rt.exec("go.bat");
    		} catch (IOException e) 
                    {
    			e.printStackTrace();
    		}
    	}
    }
    ça marche... j'ai changé le nom, et virer ta gestion des streams...

    Par contre pourquoi ça plante avec "Launcher", et pas avec "Launcher2" comme nom de classe, là..... je sèche!
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  9. #9
    Membre du Club
    Inscrit en
    Février 2006
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 87
    Points : 55
    Points
    55
    Par défaut
    OK, merci beaucoup... la première partie de mon problème est règlée!

    Maintenant, je voudrais pouvoir mettre ce que je veux dans mon .bat et là c'est tout autre chose! En fait, je voudrais lancer une ligne de commande qui lance un outil de couverture de code et pour ce faire, il faut que j'utilise la syntaxe demandée par l'outil et là hop, à nouveau le même souci, rien ne se passe!!!

    Voici pour info ce que je voudrais mettre dans mon go.bat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cobertura-instrument.bat --destination C:\MyProject\build\instrumented C:\MyProject\build\classes
    Cette commande est censée m'instrumentaliser mes classes compilées contenues dans le répertoire C:\MyProject\build\classes mais là rien ne se passe alors que si je le fais directement en ligne de commande, il n'y a aucun problème!


    EDIT: ça y est, plus de problème... ça marche très bien! J'avais juste un petit problème de chemin relatif pour l'appel au fichier .bat dans mon go.bat!

  10. #10
    Membre expérimenté Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Points : 1 371
    Points
    1 371
    Par défaut
    Le probleme vient surment du faite qu'il ne trouve pas ton .bat.

    Essaye un ca :

    Process p = Runtime.exec("cmd.exe /c chemin_ton_fichier/nom_de_ton_fichier.bat");

    ou simplement

    Runtime.exec("chemin_ton_fichier/nom_de_ton_fichier.bat")

    Bonne chance
    Une solution a été apporté pour résoudre votre problème alors vous aussi faites en profitez les autres grâce au tag qui se trouve tout en bas de la page....

    Merci de ne pas utiliser les messages privés pour un problème sauf si je vous l'ai explicitement demandé.

    -- Maxf1 --

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/03/2005, 23h09
  2. Lancer les prog en ligne de commande
    Par meufeu dans le forum Applications et environnements graphiques
    Réponses: 9
    Dernier message: 06/09/2004, 17h13
  3. [Debutant(e)]Lancer un exe en ligne de commande
    Par MASSAKA dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 18/05/2004, 14h54
  4. Création d'une connexion en ligne de commande
    Par Drahu dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 10/05/2004, 15h19
  5. Lancer une serie de ligne de commande en un coup
    Par dzincou dans le forum Linux
    Réponses: 2
    Dernier message: 15/03/2004, 17h15

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