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 :

Compiler et executer un autre programme


Sujet :

Entrée/Sortie Java

  1. #1
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    190
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2004
    Messages : 190
    Points : 88
    Points
    88
    Par défaut Compiler et executer un autre programme
    Salut a tous!

    Je voudrais faire un programme qui va prendre en entré un fichier *.java contenant un "main". Ensuite ce programme va modifier le fichier (rajout de code), le compiler et enfin l'executer.

    J'ai essayé de trouver dans la Javadoc et la FAQ de Developpez.com mais j'ai rien trouvé.

    Il me faudrait une fonction du style:
    System.Compile(cheminFichier);
    System.Run(cheminFichierClass);

    Merci d'avance.

  2. #2
    Membre chevronné
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Points : 2 011
    Points
    2 011
    Par défaut
    Salut

    Citation Envoyé par MinsK Voir le message
    Salut a tous!

    Je voudrais faire un programme qui va prendre en entré un fichier *.java contenant un "main". Ensuite ce programme va modifier le fichier (rajout de code), le compiler et enfin l'executer.

    J'ai essayé de trouver dans la Javadoc et la FAQ de Developpez.com mais j'ai rien trouvé.

    Il me faudrait une fonction du style:
    System.Compile(cheminFichier);
    Si tu utilises Java 6, il y a la Java Compiler Api qui sert justement à ça. Voir la Javadoc de Java 6.

    Citation Envoyé par MinsK Voir le message
    System.Run(cheminFichierClass);
    Si ça ne te dérange pas que le programme appelé tourne dans la même JVM que le programme appelant, tu peux tout simplement appeler la méthode main de la classe à appeler.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    LaClasseAAppeler.main(new String[]{});
    Le cas échéant tu peux appeler ta classe dans un nouveau thread.

    -"Tout ça me paraît très mal organisé. Je veux déposer une réclamation. Je paye mes impôts, après tout!"
    -"JE SUIS LA MORT, PAS LES IMPÔTS! MOI, JE N'ARRIVE QU'UNE FOIS".

    Pieds d'argile (1996), Terry Pratchett 1948 - 2015
    (trad. Patrick Couton)

  3. #3
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    190
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2004
    Messages : 190
    Points : 88
    Points
    88
    Par défaut
    Citation Envoyé par Deadpool Voir le message
    Salut



    Si tu utilises Java 6, il y a la Java Compiler Api qui sert justement à ça. Voir la Javadoc de Java 6.
    Ok je vais essayer de faire comme ca. J'ai trouve un exemple d'utilisation qui devrait bien m'aider je pense: http://mindprod.com/jgloss/javacompiler.html

    Citation Envoyé par Deadpool Voir le message
    Si ça ne te dérange pas que le programme appelé tourne dans la même JVM que le programme appelant, tu peux tout simplement appeler la méthode main de la classe à appeler.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    LaClasseAAppeler.main(new String[]{});
    Le cas échéant tu peux appeler ta classe dans un nouveau thread.
    Ca serait vraiement pratique de pouvoir faire ca. Mais je ne connais pas le nom du fichier *.java a l'avance et donc pas celui du fichier *.class.

    Si je renomme le fichier *.class en un nom standard comme "maClass.class", et si je rentre en dur dans mon programme "maClass.main(new String[]{});" , ca va pas marcher?! Non?

  4. #4
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    190
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2004
    Messages : 190
    Points : 88
    Points
    88
    Par défaut
    Je viens de voir un autre moyen de compiler apparemment:
    sun.tools.javac.Main > http://mindprod.com/jgloss/javacmain.html

    Ca m'a l'air plus simple d'utilisation, non?

  5. #5
    Membre chevronné
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Points : 2 011
    Points
    2 011
    Par défaut
    Citation Envoyé par MinsK Voir le message
    Ca serait vraiement pratique de pouvoir faire ca. Mais je ne connais pas le nom du fichier *.java a l'avance et donc pas celui du fichier *.class.

    Si je renomme le fichier *.class en un nom standard comme "maClass.class", et si je rentre en dur dans mon programme "maClass.main(new String[]{});" , ca va pas marcher?! Non?
    Le truc, c'est que le nom d'un fichier java doit correspondre au nom de la classe publique qui est définie dedans. Donc si la classe définie à l'intérieur de ton fichier java ne s'appelle pas MaClass, ça ne fonctionnera pas (à moins de le changer à la volée mais ça peut vite fait devenir lourd).

    Tu n'as vraiment aucune info sur le fichier que tu compiles?


    Citation Envoyé par MinsK Voir le message
    Je viens de voir un autre moyen de compiler apparemment:
    sun.tools.javac.Main > http://mindprod.com/jgloss/javacmain.html

    Ca m'a l'air plus simple d'utilisation, non?
    Attention si tu utilises cette Api. Il s'agit d'une Api propriétaire Sun privée uniquement présente dans les Jvm de Sun ce qui fait que ce n'est pas du tout portable sur d'autres Jvm.

    De plus, cette Api pourrait très bien disparaitre de manière inopinée vu qu'elle n'est pas censée être publique et n'est pas documentée dans la Javadoc.

    -"Tout ça me paraît très mal organisé. Je veux déposer une réclamation. Je paye mes impôts, après tout!"
    -"JE SUIS LA MORT, PAS LES IMPÔTS! MOI, JE N'ARRIVE QU'UNE FOIS".

    Pieds d'argile (1996), Terry Pratchett 1948 - 2015
    (trad. Patrick Couton)

  6. #6
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    190
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2004
    Messages : 190
    Points : 88
    Points
    88
    Par défaut
    Citation Envoyé par Deadpool Voir le message
    Tu n'as vraiment aucune info sur le fichier que tu compiles?
    En fait l'utilisateur choisit le fichier java de son choix sur l'ordinateur via une interface. Ensuite il peut y appliquer des modifications qui vont modifier le le code dans le fichier. Et ensuite le fichier va etre compile puis executer.
    Donc oui ca peut etre n'importe quel fichier (il faut juste qu'il contienne un main).

    Citation Envoyé par Deadpool Voir le message
    Attention si tu utilises cette Api. Il s'agit d'une Api propriétaire Sun privée uniquement présente dans les Jvm de Sun ce qui fait que ce n'est pas du tout portable sur d'autres Jvm.

    De plus, cette Api pourrait très bien disparaitre de manière inopinée vu qu'elle n'est pas censée être publique et n'est pas documentée dans la Javadoc.
    Ok je prend pas le risque alors

  7. #7
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    190
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2004
    Messages : 190
    Points : 88
    Points
    88
    Par défaut
    Bon j'essaye de compiler mes j'obtiens une erreur

    Voici le 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
    public boolean CompExecFile(File filename){
     
    		boolean compRes = false;
     
    		try {
     
    			JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    			StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null); //Ligne provoquant l'erreur
    			Iterable<? extends JavaFileObject> compilationUnits2 = fileManager.getJavaFileObjects(filename);
    			compRes = compiler.getTask(null, fileManager, null, null, null, compilationUnits2).call();
    			fileManager.close();
    	        if (compRes) {
    	            System.out.println ("Compilation was successful");
    	        } else {
    	            System.out.println ("Compilation failed");
    	        }
     
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
     
     
    		return compRes;
    L'erreur obtenu sur la line "StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);"
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    ...
    Ce "null,null,null" en paramètre me parait bizarre mais c'est ce qui est utilisé dans les exemples que j'ai trouvé.

Discussions similaires

  1. [z/OS] Compilation et execution d'un programme Cobol
    Par elajjouri dans le forum Cobol
    Réponses: 7
    Dernier message: 09/08/2018, 02h02
  2. Executer un autre programme
    Par Flynet dans le forum C++
    Réponses: 2
    Dernier message: 27/12/2010, 17h22
  3. compilation et execution d'un programme
    Par sakura.haruno dans le forum Linux
    Réponses: 3
    Dernier message: 07/03/2008, 17h51
  4. compilation et execution de ce programme
    Par madjid17 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 08/06/2007, 16h48
  5. Compiler et executer un petit programme sous windows
    Par nistelsof dans le forum Langage
    Réponses: 6
    Dernier message: 30/05/2007, 17h31

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