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 :

Exécution des programmes console: ne fonctionnent qu'avec une ligne de commande


Sujet :

avec Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Exécution des programmes console: ne fonctionnent qu'avec une ligne de commande
    Bonjour,

    Je rencontre un problème au niveau de l’exécution de mes jar par Windows. Depuis un moment déjà pour une raison qui m'est inconnue, il m'est impossible de lancer des programmes consoles. En revanche, les programmes fenêtrés fonctionnent sans problème. Après quelques recherches, j'ai réussi à faire marcher mes programmes consoles avec la commande "java -jar nomProgramme.jar".

    Ce qui m'étonne c'est que la commande "java nomProgramme.jar" me donne "Erreur : impossible de trouver ou de charger la class principale nomduProgramme.jar" alors que la précédente fonctionne et que mon manifest.mf est valable. D'autant plus que je ne comprend pas que Windows puisse lancer les programmes fenêtrés et pas les programmes console. Y'a t-il un moyen pour que Windows exécute correctement les programmes consoles sans avoir à passer par la commande "java -jar nomProgramme.jar" ?

    Je suis sur Windows 8.1, mon Jdk et Jre sont en version 1.8.0_45 (Version 64 bits). J'utilise Eclipse Kepler. Mes variables d'environnement pointent de la façon suivante :
    PATH : Sur mon Jdk\bin (Entre autre)
    JAVA_HOME : Sur mon Jdk
    CLASSPATH : Sur mon Jdk\lib\tools.jar, le répertoire courant et mon dossier JInput

    J'ai effectué des tests avec 2 programmes détaillés ici :

    TestConsole :
    Arborescence sur Eclipse:

    Adresse de la main class au sein du .jar : testConsole\TestConsoleMain.class
    Contenu du manifest.mf :
    Manifest-Version: 1.0
    Class-Path: .
    Main-Class: testConsole.TestConsoleMain
    Class principale: TestConsoleMain
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    package testConsole;
     
    public class TestConsoleMain {
     
    	public static void main(String[] args) {
    		System.out.println("Fonctionner ou ne pas fonctionner, telle est la question.");
    	}
     
    }

    TestFenetre :
    Arborescence sur Eclipse:

    Adresse de la main class sein du .jar : testFenetre\TestFenetreMain.class
    Contenu du manifest.mf :
    Manifest-Version: 1.0
    Class-Path: .
    Main-Class: testFenetre.TestFenetreMain
    Classe principale : TestFenetreMain
    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
    package testFenetre;
     
    import javax.swing.JFrame;
     
    public class TestFenetreMain {
     
    	public static void main(String[] args) {
     
    		JFrame fenetre = new JFrame();
    		fenetre.setLocationRelativeTo(null);
    		fenetre.setSize(300, 300);
    		fenetre.setResizable(true);
    		fenetre.setTitle("Test fenetre");
    		fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		fenetre.setVisible(true);
     
    	}
     
    }
    Ceux-ci ont été exportés depuis Eclipse (en tant que Runnable). Voici ce que j’obtiens :

    Dans le cas d'un programme java fenêtré (TestFenetre.jar):
    -Double-clic : Lancement sans problèmes.
    -Ligne de commande "TestFenetre.jar" : Lancement sans problèmes.
    -Ligne de commande "java TestFenetre.jar" : "Erreur : impossible de trouver ou de charger la classe principale TestConsole.jar"
    -Ligne de commande "java -jar TestFenetre.jar" : Lancement sans problèmes.

    Dans le cas d'un programme java console (TestConsole.jar):
    -Double-clic : Rien ne se passe
    -Ligne de commande "TestConsole.jar" : La commande est prise en compte (saut de ligne, pas de message d'erreur) mais rien ne se passe.
    -Ligne de commande "java TestConsole.jar" : "Erreur : impossible de trouver ou de charger la classe principale TestConsole.jar"
    -Ligne de commande "java -jar TestConsole.jar" : Lancement sans problèmes.

    J'ai également tenté de compiler mes classes en ligne de commande ("javac nomClass.java") mais j'obtiens des erreurs similaires :

    TestConsole :
    "java TestConsoleMain" : "Erreur : impossible de trouver ou de charger la classe principale TestConsoleMain"

    TestFenetre :
    "java TestFentreMain" : "Erreur : impossible de trouver ou de charger la classe principale TestFenetreMain"

    Je ne comprends pas qu'il me dise qu'il ne trouve pas la classe principale lors des commandes "java nomProgramme.jar" alors que l’arborescence et le manifest.mf sont justes. Le plus étrange reste cette différenciation entre les programmes console et les programmes fenêtrés.

    En vous remerciant pour vos lumières sur ce problème =)

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Korodule Voir le message
    Bonjour,

    Je rencontre un problème au niveau de l’exécution de mes jar par Windows. Depuis un moment déjà pour une raison qui m'est inconnue, il m'est impossible de lancer des programmes consoles. En revanche, les programmes fenêtrés fonctionnent sans problème. Après quelques recherches, j'ai réussi à faire marcher mes programmes consoles avec la commande "java -jar nomProgramme.jar".
    java -jar est effectivement la commande pour lancer un jar.


    Citation Envoyé par Korodule Voir le message
    Ce qui m'étonne c'est que la commande "java nomProgramme.jar" me donne "Erreur : impossible de trouver ou de charger la class principale nomduProgramme.jar" alors que la précédente fonctionne et que mon manifest.mf est valable.
    Sans le -jar, tu lance un .class présent dans le classpath (donc en général le dossier courant). Ce sont des commandes différentes donc.
    Citation Envoyé par Korodule Voir le message
    D'autant plus que je ne comprend pas que Windows puisse lancer les programmes fenêtrés et pas les programmes console. Y'a t-il un moyen pour que Windows exécute correctement les programmes consoles sans avoir à passer par la commande "java -jar nomProgramme.jar" ?
    Il exécute correctement les 2. C'est juste que la commande liée par défaut aux .jar n'ouvre pas de console. Donc ton programme attends sur une console qui n'existe pas. Si tu veux ouvrir une console en cliquant sur tes .jar, tu dois changer la commande associée aux jars sous windows. Au lieu de javaw.exe, il faut les lier à java.exe (sans oublier le -jar bien sûr).
    http://jmdoudoux.developpez.com/cour...p#outils-jdk-2

  3. #3
    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 Korodule Voir le message
    Y'a t-il un moyen pour que Windows exécute correctement les programmes consoles sans avoir à passer par la commande "java -jar nomProgramme.jar" ?
    Bah... C'est la syntaxe pour lancer un jar. En quoi cela te gêne-t-il ?

    Citation Envoyé par Korodule Voir le message
    Je suis sur Windows 8.1, mon Jdk et Jre sont en version 1.8.0_45 (Version 64 bits). J'utilise Eclipse Kepler. Mes variables d'environnement pointent de la façon suivante :
    PATH : Sur mon Jdk\bin (Entre autre)
    JAVA_HOME : Sur mon Jdk
    CLASSPATH : Sur mon Jdk\lib\tools.jar, le répertoire courant et mon dossier JInput
    JAVA_HOME est inutile, sauf pour certains outils spécifique.
    CLASSPATH est déconseillé, et complètement inutile lorsqu'on utile -jar...

    Citation Envoyé par Korodule Voir le message
    Dans le cas d'un programme java fenêtré (TestFenetre.jar):
    -Double-clic : Lancement sans problèmes.
    -Ligne de commande "TestFenetre.jar" : Lancement sans problèmes.
    -Ligne de commande "java TestFenetre.jar" : "Erreur : impossible de trouver ou de charger la classe principale TestConsole.jar"
    -Ligne de commande "java -jar TestFenetre.jar" : Lancement sans problèmes.
    - Normal par défaut les jar sont associé à la commande "javaw -jar %1", ce qui produira la bonne syntaxe "javaw -jar TestFenetre.jar".
    - Normal cela équivaut à un double-click.
    - Erreur normale car la syntaxe est incorrect, c'est "java -jar Fichier.jar" ou "java nomDesPackages.NomDeLaClasse"
    - Normal car c'est la bonne syntaxe.


    Citation Envoyé par Korodule Voir le message
    Dans le cas d'un programme java console (TestConsole.jar):
    -Double-clic : Rien ne se passe
    -Ligne de commande "TestConsole.jar" : La commande est prise en compte (saut de ligne, pas de message d'erreur) mais rien ne se passe.
    -Ligne de commande "java TestConsole.jar" : "Erreur : impossible de trouver ou de charger la classe principale TestConsole.jar"
    -Ligne de commande "java -jar TestConsole.jar" : Lancement sans problèmes.
    - Tu touches là une spécificité de Windows. Un programme est soit en mode "console" soit en mode "window".
    Java fournit donc deux version du programme : java qui est associé à une console, et javaw qui est en mode "window" sans association console.
    Dans ce dernier cas tout ce qui est écrit dans la console est "perdu".
    Par défaut l'association utiliser javaw... donc ton programme est bien lancé mais tu ne le vois pas car il n'est associé à aucune console.
    - Idem, même si tu lance depuis une console existante (Windows gère vraiment très mal cela).
    - Erreur normal car la syntaxe n'est toujours pas bonne...
    - Enfin cela marche car tu utilises "java" et non pas "javaw".

    Citation Envoyé par Korodule Voir le message
    TestConsole :
    "java TestConsoleMain" : "Erreur : impossible de trouver ou de charger la classe principale TestConsoleMain"

    TestFenetre :
    "java TestFentreMain" : "Erreur : impossible de trouver ou de charger la classe principale TestFenetreMain"
    Ici ta syntaxe est mauvaise car tu ne précises pas le nom complet de la classe (il manque le package).
    De plus dans ce cas là il faudrait préciser le classpath via -cp ou -classpath et non pas la variable d'environnement...


    a++

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Oh. Oui en effet je comprend mieux maintenant. Merci à vous deux pour vos réponses.

    Donc pour résumer, dans le cas de jar par exemple TestFentre.jar on utilise: "java -cp TestFenetre.jar testFenetre.TestFenetreMain" ou "java -jar TestFenetre.jar". Et dans le cas d'une classe, par exemple TestConsoleMain, en étant dans un dossier contenant testFenetre lui même contenant TestFenetreMain.class, on utilise: "java testFenetre.TestFenetreMain". J'avais dût zappé quelque chose sur ce chapitre.

    Encore merci =)

  5. #5
    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 Korodule Voir le message
    Donc pour résumer, dans le cas de jar par exemple TestFentre.jar on utilise: "java -cp TestFenetre.jar testFenetre.TestFenetreMain" ou "java -jar TestFenetre.jar".
    Tu peux faire les deux, mais il vaut mieux utiliser -jar si tu as un fichier MANIFEST car ce dernier défini déjà la classe principale et le classpath...

    Citation Envoyé par Korodule Voir le message
    Et dans le cas d'une classe, par exemple TestConsoleMain, en étant dans un dossier contenant testFenetre lui même contenant TestFenetreMain.class, on utilise: "java testFenetre.TestFenetreMain". J'avais dût zappé quelque chose sur ce chapitre.
    On utilise toujours le nom de la classe au complet (donc package.Nom).
    Ensuite la JVM va utiliser le ClassPath pour rechercher ta classe et l’exécuter.
    Le ClassPath de la JVM correspond :
    • Soit à la valeur du paramètre -cp ou -classpath passé à java.
    • Soit à la valeur de la variable d'environnement CLASSPATH si -cp/-classpath n'est pas utilisé.
    • Soit au répertoire courant si -cp/-classpath ni CLASSPATH ne sont pas utilisés.



    Perso je te conseillerais de supprimer la variable d'environnement CLASSPATH et de toujours utiliser le paramètre -cp ou -classpath.


    a++

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 10/11/2014, 16h47
  2. Réponses: 2
    Dernier message: 17/05/2014, 13h08
  3. Réponses: 4
    Dernier message: 14/08/2009, 12h22
  4. execute un programe avec une ligne de commande
    Par Babylonne dans le forum C++Builder
    Réponses: 4
    Dernier message: 19/09/2006, 12h36
  5. Réponses: 2
    Dernier message: 21/05/2006, 09h30

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