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

Entrée/Sortie Java Discussion :

Problème dans execution de processus


Sujet :

Entrée/Sortie Java

  1. #1
    Membre éclairé
    Inscrit en
    Mars 2005
    Messages
    226
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 226
    Par défaut Problème dans execution de processus
    Bonjour,

    Je créé une application qui génére du code java à partir de code XML. Je voudrais mettre dans mon menu une option "compiler et executer" qui dès que l'utilisateur choisi celui ci, l'application compile et excute le code java venant d'être généré.

    J'ai utilisé les processus dans cet ordre:
    - cd cheminDuRepertoire (ou se trouve le code java)
    - javac nomFichier.java
    - java Lanceur (car le main se trouve toujorus dans cette classe)

    Le chemin du repertoire peux changer tout le temps. Quand j'essais d'excuter mon code, il met une IOExecption pour la commande "cd". J'ai utilisé un processus différent à chaque fois. Est ce que quelqu'un aurai une idée de ce qui provoque cette exception (sachant que le chemin donné est correct et existe). Il faudrait que cette fonction marche sur Window, Unix, et MAC

    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
    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
     
    //	listener for "Compiler et executer" in the menu "Outils"
     
    	class ListenerCompile implements ActionListener {
     
    		public void actionPerformed( ActionEvent e ) {
     
    			String error = "";
     
    			String nameFile = "";
     
    			String chemin = "";
     
    			if( writePanel.getPathFileJava().equals( "" ) ) {
     
    				errorPanel.fctPrintError( "Erreur: Vous devez deja generer un fichier java" );
     
    				return;
     
    			}
     
    			try {
     
    				int index = writePanel.getPathFileJava().lastIndexOf( "/" );
     
    				chemin = writePanel.getPathFileJava().substring(0, index + 1 );
     
    				System.out.println( chemin );
     
    				nameFile = writePanel.getPathFileJava().substring(index + 1, writePanel.getPathFileJava().length() );
     
    				System.out.println( nameFile );
     
    				//Allez dans le repertoire
     
    				Process proc = Runtime.getRuntime().exec( "cd " + chemin );
     
    				try {
     
    					//lancement de la compilation
     
    					Process proc1 = Runtime.getRuntime().exec( "javac " + nameFile );
     
    					//pour recuperer le message
     
    					InputStream is_Error = proc1.getErrorStream();
     
    					index = is_Error.read();
     
    					if( index == -1 ) {
     
    						error = "Le fichier java est compile" + newline;
     
    						//execution
     
    						try {
     
    							//lancement de la compilation
     
    							Process proc2 = Runtime.getRuntime().exec("java Lanceur" );
     
    							//pour recuperer le message
     
    							is_Error= proc2.getErrorStream();
     
    							index = is_Error.read();
     
    							if( index == -1 ) {
     
    								error += "Le fichier java est execute";
     
    							}
     
    							else {
     
    								error = "Erreur a l'execution: ";
     
    								while( index != -1 ) {
     
    									error += (char)index;
     
    									index = is_Error.read();
     
    								}
     
    							}
     
    						}
     
    						catch( IOException IOe ) {
     
    							error = "Erreur: Impossible d'executer le fichier java";
     
    						}
     
    					}
     
    					else {
     
    						error = "Erreur a la compilation: ";
     
    						while( index != -1 ) {
     
    							error += (char)index;
     
    							index = is_Error.read();
     
    						}
     
    					}
     
    				}
     
    				catch( IOException IOe ) {
     
    					error = "Erreur: Impossible de compiler le fichier java";
     
    				}
     
    			}
     
    			catch( IOException IOe ) {
     
    				error = "Erreur: Impossible d'accÈder au fichier";
     
    			}
     
    			errorPanel.fctPrintError( error );
     
    		}
     
    	}
    Merci de votre aide

  2. #2
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 819
    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 819
    Par défaut
    Salut,

    exec permet de lancer un programme, or "cd" n'est pas un programme mais une commande du shell système.

    Le mieux serait encore pour toi, soit de générer un fichier script à lancer (mais ça sera en fonction du système utilisé, bat sous windows, sh sous linux) en mettant dedans la suite de commandes à lancer, soit d'utiliser les flags des commandes javac et java pour préciser où se trouvent les sources et les classes (flag -sourcepath de javac si nécessaire, et -classpath de java) ce qui permet de se passer de l'appel à "cd". Ca sera aussi simple.

    Pour javac, tu définis dans -sourcepath où se trouvent les sources nécessaires à la compilation, et tu appelles javac en donnant le chemin complet vers la main classe.
    Pour java, tu indiques le classpath, et tu appelles java en donnant le nom de la main classe (et surtout pas le chemin complet!)
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  3. #3
    Membre éclairé
    Inscrit en
    Mars 2005
    Messages
    226
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 226
    Par défaut
    J'ai essayer d'appliquer la deuxieme solution que vous m'avez proposé. Il est vrai que je prefere eviter de créé des bat et tout cela.

    Le resultat de ce changement : La compilation se fait sans problème (je trouve bien les .class dans le repertoire). Par contre il y a encore un problème au point de vue de l'execution. J'ai un message qui s'affiche disant que l'excution c'est bien passé, sauf que la fenetre (car le XMl sert à créé des interfaces graphique) ne s'affiche pas à l'ecran.

    voici mon code modifié:
    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
     
    //	listener for "Compiler et executer" in the menu "Outils"
     
    	class ListenerCompile implements ActionListener {
     
    		public void actionPerformed( ActionEvent e ) {
     
    			String error = "";
     
    			String nameFile = "";
     
    			String chemin = "";
     
    			if( writePanel.getPathFileJava().equals( "" ) ) {
     
    				errorPanel.fctPrintError( "Erreur: Vous devez deja generer un fichier java" );
     
    				return;
     
    			}
     
    			try {
     
    				//COMPILATION
     
    				int index = writePanel.getPathFileJava().lastIndexOf( "/" );
     
    				chemin = writePanel.getPathFileJava().substring(0, index + 1 );
     
    				System.out.println( chemin );
     
    				nameFile = writePanel.getPathFileJava().substring(index + 1, writePanel.getPathFileJava().length() );
     
    				System.out.println( nameFile );
     
    				//lancement de la compilation
     
    				Process proc1 = Runtime.getRuntime().exec( "javac " + chemin + nameFile );
     
    				//pour recuperer le message
     
    				InputStream is_Error = proc1.getErrorStream();
     
    				index = is_Error.read();
     
    				if( index == -1 ) {
     
    					//EXECUTION
     
    					try {
     
    						//lancement de la compilation
     
    						Process proc2 = Runtime.getRuntime().exec("java -classpath "+ chemin + "Lanceur" );
     
    						//pour recuperer le message
     
    						is_Error= proc2.getErrorStream();
     
    						index = is_Error.read();
     
    						if( index != -1 ) {
     
    							error = "Erreur a l'execution: ";
     
    							while( index != -1 ) {
     
    								error += (char)index;
     
    								index = is_Error.read();
     
    							}
     
    							errorPanel.fctPrintError( error );
     
    						}
     
    						else {
     
    							errorPanel.fctPrintError( "Le fichier est compile et execute" );
     
    						}
     
    					}
     
    					catch( IOException IOe ) {
     
    						errorPanel.fctPrintError( "Erreur: Impossible d'executer le fichier java" );
     
    					}
     
    				}
     
    				else {
     
    					error = "Erreur a la compilation: ";
     
    					while( index != -1 ) {
     
    						error += (char)index;
     
    						index = is_Error.read();
     
    					}
     
    					errorPanel.fctPrintError( error );
     
    				}
     
    			}
     
    			catch( IOException IOe ) {
     
    				errorPanel.fctPrintError( "Erreur: Impossible de compiler le fichier java" );
     
    			}
     
    		}
     
    	}

  4. #4
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 819
    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 819
    Par défaut
    Citation Envoyé par Edta
    Par contre il y a encore un problème au point de vue de l'execution. J'ai un message qui s'affiche disant que l'excution c'est bien passé, sauf que la fenetre (car le XMl sert à créé des interfaces graphique) ne s'affiche pas à l'ecran.
    Dans ce cas, il y a peut-être un soucis dans le code généré avec ton xml...

    As-tu essayé de lancé directement le fichier compilé?
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  5. #5
    Membre éclairé
    Inscrit en
    Mars 2005
    Messages
    226
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 226
    Par défaut
    oui, j'ai deja essayer.

    Si dans un shell , je me deplace dans mon repertoire que je compile et que j'execute j'ai bien se qu'il faut. Cela ne vient pas du code mais bien de l'ecriture de mon actioner.

    Quand j'essayer de compiler à partir d'un autre endroit que mon repertoire, j'ai ici un probleme, j'ai une mauvaise ecriture de la commande 'java". le probleme vient surement de la.

    par exemple si je fait
    home> javac Documents/Projet/boutons.java //comple sans probleme
    home> java Documents/Projet/Lanceur // il me dit que la commande n'existe pas
    J'ai essayer plusieurs solutions sans succes....

  6. #6
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 819
    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 819
    Par défaut
    Citation Envoyé par Edta
    Si dans un shell , je me deplace dans mon repertoire que je compile et que j'execute j'ai bien se qu'il faut. Cela ne vient pas du code mais bien de l'ecriture de mon actioner.
    Dans ce cas, au lieu de ne rien faire du flux d'erreur, essaye d'afficher ce qu'il te sort.
    Encore mieux, récupères déjà l'InputStream du process, et affiche ce qu'il écrit. J'ai un léger doute sur ta commande "java". Surtout que tu compiles un fichier "namefile", et que tu lances une classe "Lanceur". A mon avis, ça doit planter là... déjà...


    Citation Envoyé par Edta
    Quand j'essayer de compiler à partir d'un autre endroit que mon repertoire, j'ai ici un probleme, j'ai une mauvaise ecriture de la commande 'java". le probleme vient surement de la.

    par exemple si je fait
    home> javac Documents/Projet/boutons.java //comple sans probleme
    home> java Documents/Projet/Lanceur // il me dit que la commande n'existe pas
    Tu compiles boutons.java, et tu lances Lanceur????


    Citation Envoyé par Edta
    J'ai essayer plusieurs solutions sans succes....
    Lesquelles?
    Et précise ton environnement de travail (système, logiciels, etc)


    Pour info, la manip marche très bien chez moi...
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  7. #7
    Membre éclairé
    Inscrit en
    Mars 2005
    Messages
    226
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 226
    Par défaut
    Citation Envoyé par plegat
    Dans ce cas, au lieu de ne rien faire du flux d'erreur, essaye d'afficher ce qu'il te sort.
    Encore mieux, récupères déjà l'InputStream du process, et affiche ce qu'il écrit. J'ai un léger doute sur ta commande "java".
    Je recupere deja se qu'il y a dans le Inputstream du process. en fait si la taille est differente de "-1" alors j'affiche "fichier compile" ou "fichier execute" sinon j'affiche le message le message d'erreur.

    Pour ma part le message d'erreur et que la commande n'existe pas et il me donne les different option possible azu moment ou il fait le "java chemin/Lanceur"

    Surtout que tu compiles un fichier "namefile", et que tu lances une classe "Lanceur". A mon avis, ça doit planter là... déjà...
    Oui c'est normal car le fichier Java à plusieurs classes et que c'est la classe Lanceur qui possede le main. Structure du fichier java généré:
    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....;
    class MonApp extends JFrame {
    //declaration
    public MonApp() {
    //constructeur
    }
    }
     
    class MonApp2 extends JFrame {
    //declaration
    public MonApp2() {
    //constructeur
    }
    }
     
    class Lanceur {
    public static void main(String[] args) {
    //avec la construction de mon deux JFrame
    }

    Lesquelles?
    Et précise ton environnement de travail (système, logiciels, etc)
    j'ai essayé:
    java -classpath Documents/Projet/Lanceur
    java -classpath Documents/Projet/Lanceur.class
    java Documents/Projet/Lanceur
    java Documents/Projet/Lanceur.class

    Un peu tout en fait. Mais l'option "-classpath" existe car je la fvoit dans les options qu'il me propose.

    Pour l'enviroment:
    Je suis sur MACOS 10.4

    J'utilise XCode ( car j'aime pas eclipse) c'est style de SCite (qui par dommage n'existe pas sur MAC :-()

    Et voici se que j'obtien quand je fait un Java version :
    java version "1.4.2_07"
    Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_07-215)
    Java HotSpot(TM) Client VM (build 1.4.2-50, mixed mode)

  8. #8
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 819
    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 819
    Par défaut
    Citation Envoyé par Edta
    Je recupere deja se qu'il y a dans le Inputstream du process
    Non, tu récupères ce qu'il y a dans l'ErrorStream.
    Remplace ton getErrorStream par un getInputStream, et rajoute des
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.print((char)index);
    après chaque ligne où tu fais un
    Normalement tu devrais récupérer un joli message comme quoi tu utilises mal la commande java (ou disant que le commande java n'est pas reconnue plutôt, pour le moment )


    Citation Envoyé par Edta
    Pour ma part le message d'erreur et que la commande n'existe pas et il me donne les different option possible azu moment ou il fait le "java chemin/Lanceur"
    Tu récupères quoi exactement?
    Un message qui dit que la commande java n'existe pas?
    Ou un message qui dit qu'elle ne s'utilise pas comme ça?




    Citation Envoyé par Edta
    Un peu tout en fait.
    Euh... l'informatique, ce n'est pas de la cuisine!
    Il vaut mieux un peu de rigueur...

    Citation Envoyé par Edta
    java -classpath Documents/Projet/Lanceur
    Manque la classe à lancer...

    Citation Envoyé par Edta
    java -classpath Documents/Projet/Lanceur.class
    Manque la classe à lancer...

    Citation Envoyé par Edta
    java Documents/Projet/Lanceur
    Là, tu lances la classe Lanceur du package Documents.Projet...

    Citation Envoyé par Edta
    java Documents/Projet/Lanceur.class
    Là, ça devrait gueuler... un nom avec .class, ça aime pas...

    Si tu es sûr du répertoire de base de ton application (ce dont je doute, vu qu'on ne le sait jamais vraiment quand on passe par un EDI...), tu peux mettre le chemin relatif dans le classpath. Sinon, il vaut mieux mettre le chemin absolu. Au moins pour débugguer...

    Donc, le format:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java -classpath leCheminAbsoluVersLeRepertoireDeBase Lanceur
    Une fois que ça, ça marche, on continuera plus en avant...
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  9. #9
    Membre éclairé
    Inscrit en
    Mars 2005
    Messages
    226
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 226
    Par défaut
    C'est bon ca marche, je savais que c'etait parce que j'utilisais mal la commande java -classpath que ca allait pas mais j'ai pas reussi a comprendre la syntaxe decrit dans la options possible de la commande "java"

    J'y arrivais pas car je mettais le nom de la classe collée au chemin alors qu'il faut un espace.

    Merci pour ton aide.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/04/2008, 11h29
  2. Exécution de processus (format elf, a.out)
    Par b4u dans le forum Administration système
    Réponses: 2
    Dernier message: 19/03/2006, 17h59
  3. executer un processus a partir d'un programme source
    Par sofiane44 dans le forum Threads & Processus
    Réponses: 2
    Dernier message: 08/01/2006, 14h20
  4. Inclure un DLL dans executable
    Par nico33410 dans le forum Langage
    Réponses: 9
    Dernier message: 01/09/2005, 15h17
  5. Contrôle d'exécution de processus
    Par TB38570 dans le forum Linux
    Réponses: 3
    Dernier message: 07/12/2004, 09h39

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