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 d'un simple programme impossible


Sujet :

avec Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 149
    Points : 90
    Points
    90
    Par défaut Exécution d'un simple programme impossible
    salut tout le monde.

    bon alors voila, j'ai honte de présenter un problème pareil. pourtant rien de bien compliqué mais je sature la. et je suis sur que la solution est très simple. mon probleme : n'arrive pas à exécuter un simple HelloWorld. pour plus de précisions, je tourne sur ubuntu. je me suis fais une classe hello.java avec le contenu suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public class hello
    {
    	public static void Main(String[] args)
    	{
    		System.out.println("hello");
    	}
    }
    compile ca en ligne de commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    javac ./hello.java
    ce qui me donne le .class correspondant, dans le répertoire courant.

    mais lorsque je tente l'exécution, et sauf erreur de ma part, il s'agit de la commande suivante :
    ce qui me donne ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Could not find the main class: ./hello. Program will exit.
    exercice très simple, mais qui me fait peter les plombs la ... si vous pouvez m'indiquer une piste de sortie, ca serait vraiment cool !!!

    merci

  2. #2
    Membre averti Avatar de diallomad
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Mali

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 164
    Points : 364
    Points
    364
    Par défaut
    Citation Envoyé par splinternabs Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Could not find the main class: ./hello. Program will exit.
    T'as nommé la methode main avec M majuscule.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public class hello
    {
    	public static void main(String[] args)
    	{
    		System.out.println("hello");
    	}
    }

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 149
    Points : 90
    Points
    90
    Par défaut
    bien vu ... mais non lol.

    j'ai corrigé mais ca le fait pas. d'autant plus que ma classe c'est hello et non main (méthode statique).

    autre point, j'ai trouvé ceci : a priori le même souci chez d'autres personnes, qui parlent d'un souci de versions entre le JRE et leur JDK. sauf que pour ma part, il me semble avoir des versions compatibles (sauf erreur de ma part) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    javac -version
    javac 1.6.0_20
    java -version
    java version "1.6.0_20"
    OpenJDK Runtime Environment (IcedTea6 1.9.9) (6b20-1.9.9-0ubuntu1~10.04.2)
    OpenJDK Server VM (build 19.0-b09, mixed mode)
    on parle d'un "sudo update-alternatives --config java" pour faire la mise à jour (je donne ca pour ceux que ca intéresse),

    pour ma part la réponse à cette commande est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Il n'existe qu'une «*alternative*» dans le groupe de lien java*:*/usr/lib/jvm/java-6-openjdk/jre/bin/java.
    Rien à configurer.

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 567
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 635
    Points
    21 635
    Par défaut
    Le message d'erreur n'est pas du tout le même. Le leur indique des versions de bytecode incompatibles, toi il indique qu'il ne trouve pas la classe demandée. (Soit dit en passant, ça n'avait donc, en effet, rien à voir avec la méthode main. Incorrecte, certes, mais la classe n'ayant même pas été trouvée on n'en était pas là.)

    Vu que le message d'erreur indique qu'il ne trouve pas la classe ./hello, j'imagine que la commande que tu as vraiment tapée est

    Ça ne marchera pas. La bonne commande est

    c'est-à-dire ce que tu as dit, mais pas ce que tu as fait.
    Quel message as-tu dans ce cas-là ?

    Pour info, il faut être dans le même répertoire que là où se trouve le fichier hello.class (obtenu après compilation de hello.java)

    Sauf si ton fichier .java commence par des infos de package machin;
    Ce qui est mieux, mais qui complique un peu les choses.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 149
    Points : 90
    Points
    90
    Par défaut
    merci pour ta réponse. en effet ma commande sur ce coup était java ./hello, étant dans le répertoire du fichier hello.java et hello.class, normalement ca devrait marcher me semble-t-il. ceci étant j'ai aussi essayé le "java hello" qui ne donne rien non plus.

    une piste peut etre : le terminal permet une complétion des commandes, a savoir que si je tape "java h"+touche tab le terminal devrait me compléter le nom du fichier => "java hello". ce n'est pas le cas ... pourtant quand j'exécute cette manip avec le compilateur javac par exemple ca marche bien. une idée ?

    merci.

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 567
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 635
    Points
    21 635
    Par défaut
    Citation Envoyé par splinternabs Voir le message
    merci pour ta réponse. en effet ma commande sur ce coup était java ./hello, étant dans le répertoire du fichier hello.java et hello.class, normalement ca devrait marcher me semble-t-il. ceci étant j'ai aussi essayé le "java hello" qui ne donne rien non plus.
    Message d'erreur, please. Je te l'ai demandé dans mon dernier message.

    Citation Envoyé par splinternabs Voir le message
    une piste peut etre : le terminal permet une complétion des commandes, a savoir que si je tape "java h"+touche tab le terminal devrait me compléter le nom du fichier => "java hello".
    Très improbable. À moins que ton shell ait le mode sémantique lourde activé, et qu'il ait un plugin d'utilisation de java, ce qui serait assez facile mais dont je n'ai jamais entendu parler.

    (Par contre, il devrait proposer hello.java et hello.class, factorisés en hello. )

    Citation Envoyé par splinternabs Voir le message
    pourtant quand j'exécute cette manip avec le compilateur javac par exemple ca marche bien. une idée ?
    Ce sont deux choses différentes.
    - Javac pense en terme de fichiers.
    - Java pense en terme de classes disponibles dans le classpath (qui, par défaut, devrait inclure le répertoire en cours.)

    Un truc que tu peux essayer, c'est d'imposer le répertoire en cours dans le classpath :


  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 149
    Points : 90
    Points
    90
    Par défaut
    voila mon message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ridernabs@ridernabs-laptop:/usr/share/tomcat6/webapps/axis/Services/Packages$ java hello
    Exception in thread "main" java.lang.NoClassDefFoundError: hello
    Caused by: java.lang.ClassNotFoundException: hello
    	at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
    	at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
    	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
    	at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
    Could not find the main class: hello. Program will exit.
    je me suis assuré que le chemin du répertoire en question se trouve bien dans le classpath.

    voici le message d'erreur quand j'exécute la commande que tu me conseilles :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ridernabs@ridernabs-laptop:/usr/share/tomcat6/webapps/axis/Services/Packages$ java cp . hello
    Exception in thread "main" java.lang.NoClassDefFoundError: cp
    Caused by: java.lang.ClassNotFoundException: cp
    	at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
    	at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
    	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
    	at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
    Could not find the main class: cp. Program will exit.
    merci a toi pour ces infos

  8. #8
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2010
    Messages : 119
    Points : 191
    Points
    191
    Par défaut
    Question con mais on sait jamais : t'es bien dans le dossier qui contient hello.class ? (un ptit ls ne fait de mal à personne )

  9. #9
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2006
    Messages : 35
    Points : 47
    Points
    47
    Par défaut
    Bonjour.
    Citation Envoyé par splinternabs Voir le message

    voici le message d'erreur quand j'exécute la commande que tu me conseilles :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ridernabs@ridernabs-laptop:/usr/share/tomcat6/webapps/axis/Services/Packages$ java cp . hello
    Exception in thread "main" java.lang.NoClassDefFoundError: cp
    Caused by: java.lang.ClassNotFoundException: cp
    	at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
    	at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
    	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
    	at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
    Could not find the main class: cp. Program will exit.
    Il t'as conseillé java -cp . hello
    tu n'as pas mis le "-"

    cdt

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 149
    Points : 90
    Points
    90
    Par défaut
    oups, petite erreur de ma part en effet. n'ayant pas accès à mon poste en journée, je vous donnerai plus de news ce soir.

    merci pour votre aide.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 149
    Points : 90
    Points
    90
    Par défaut
    bonne nouvelle, ca marche en effet le "java -cp . hello".

    mais en revanche qu'est ce que ca veut dire ? a priori l'option -cp sert à indiquer le répertoire où se trouve la classe à rechercher si j'ai bien compris la chose, mais si tel est le cas, pourquoi est ce qu'il a besoin de cette précision étant donné qu'on est dans le répertoire même de la classe ?

  12. #12
    Modérateur

    Avatar de Robin56
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juin 2009
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juin 2009
    Messages : 5 297
    Points : 13 670
    Points
    13 670
    Par défaut
    Citation Envoyé par splinternabs Voir le message
    mais en revanche qu'est ce que ca veut dire ? a priori l'option -cp sert à indiquer le répertoire où se trouve la classe à rechercher si j'ai bien compris la chose, mais si tel est le cas, pourquoi est ce qu'il a besoin de cette précision étant donné qu'on est dans le répertoire même de la classe ?
    De mémoire si tu fais java hello, c'est comme si tu mettais java -cp CLASSPATH hello (CLASSPATH étant une variable d'environnement).
    Alors qu'avec java -cp . hello, tu vas rechercher les fichiers .class au sein du répertoire courant.

    Et tu verras, dans le futur que l'on ne met pas les fichiers java et class au même endroit pour plus de lisibilité (dans un projet le répertoire src/ contient les .java et le répertoire bin/ contient les .class). Sachant que tout ceci deviendra totalement transparent pour toi quand tu passeras à un IDE.

    PS : Plus de détails ici.

  13. #13
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 567
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 635
    Points
    21 635
    Par défaut
    Citation Envoyé par splinternabs Voir le message
    pourquoi est ce qu'il a besoin de cette précision étant donné qu'on est dans le répertoire même de la classe ?
    Je t'ai déjà dit que la commande "java" ne pense pas en terme de fichier mais en terme de classes disponibles dans le classpath.
    Par défaut le classpath devrait inclure le répertoire en cours, oui, mais ton environnement change peut-être ça. D'où l'idée de le forcer à inclure le répertoire en cours.

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 149
    Points : 90
    Points
    90
    Par défaut
    De mémoire si tu fais java hello, c'est comme si tu mettais java -cp CLASSPATH hello (CLASSPATH étant une variable d'environnement).
    Alors qu'avec java -cp . hello, tu vas rechercher les fichiers .class au sein du répertoire courant.
    et si le répertoire courant, celui dans lequel je suis était parametré dans le CLASSPATH, ca ne voudrait pas dire que "java -cp CLASSPATH hello" = "java -cp . hello" ?
    ce qui m'amene au second point, de thelvin :

    Je t'ai déjà dit que la commande "java" ne pense pas en terme de fichier mais en terme de classes disponibles dans le classpath
    étant donné que le classpath inclue le répertoire où se trouve la classe recherchée, ca devrait fonctionner non ?

    enfin je ne dis pas ca pour vous contredire, d'ailleurs votre solution marche, j'essaie de creuser pour comprendre. et justement l'architecture d'une appli m'interesse aussi parce qu'il est vrai que je m'embrouille un peu avec tous les fichiers, les répertoires etc. j'ai utilisé Eclipse, mais j'ai mis de coté en attendant de mieux prendre en main java

    merci pour vos réponses et votre aide en tout cas

  15. #15
    Modérateur

    Avatar de Robin56
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juin 2009
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juin 2009
    Messages : 5 297
    Points : 13 670
    Points
    13 670
    Par défaut
    Citation Envoyé par splinternabs Voir le message
    ca devrait fonctionner non ?
    Si tu as ta variable d'environnement :
    CLASSPATH = <ton chemin vers tes fichiers class>
    Ou même
    CLASSPATH = .

    Alors java hello devrait marcher.

    Mais la méthode : java -cp <ton chemin vers tes fichiers class> est préférable car garde l'indépendance de chaque projet. Dans le cas contraire, ça fait toucher une variable d'environnement à chaque fois, c'est pas top.

  16. #16
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 567
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 635
    Points
    21 635
    Par défaut
    Citation Envoyé par splinternabs Voir le message
    étant donné que le classpath inclue le répertoire où se trouve la classe recherchée, ca devrait fonctionner non ?
    Ton problème était justement que le classpath n'inclut pas le répertoire où se trouve la classe recherchée.
    Raison pour laquelle, le forcer dedans a résolu ton problème.

  17. #17
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2006
    Messages : 35
    Points : 47
    Points
    47
    Par défaut
    Bonjour.
    Ne serait-ce pas aussi lié à ta compilation ?
    a priori tu avais fait
    au lieu d'un
    ça pourrait expliquer que tu aies dû ajouter -cp .

  18. #18
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 567
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 635
    Points
    21 635
    Par défaut
    ... Les deux commandes font la même chose -_-°. Javac pense bel et bien en termes de fichiers.

  19. #19
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 149
    Points : 90
    Points
    90
    Par défaut
    justement les gars, le chemin de mon répertoire se trouve bel et bien dans mon classpath. c'est ca que je trouve déroutant par rapport au répertoire courant.bon mon classpath contient d'autres répertoires aussi, mais il me semble que c'est normal non ? n'est ce pas ca qui le perturbe du coup ?

    pour le coup, l'affaire est "résolue" mais ca reste que provisoire parce que je sens que je vais rencontrer tres bientot le souci, surtout que je vais avoir des packages qui vont s'en meler

    je pense qu'on peut basculer le dossier en "résolu" cette fois ci, jusqu'a nouvelle surprise !!!

    ps : comment je bascule le sujet en résolu ?

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    effacez votre variable d'environnement CLASSPATH, java n'en a pas besoin pour fonctionner. Le classpath par défaut qui contient la jvm + le répertoire courant et suffisant pour la plupart des applications.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 4
    Dernier message: 13/03/2012, 07h34
  2. exécution programme impossible
    Par yasinfo dans le forum Windows XP
    Réponses: 3
    Dernier message: 07/12/2007, 02h17
  3. erreur ds l exécution d un simple prog
    Par tenderstoune dans le forum Environnement de Développement Intégré (EDI)
    Réponses: 2
    Dernier message: 10/03/2007, 13h17
  4. Réponses: 7
    Dernier message: 18/01/2007, 13h09
  5. Simple Programme Recreateur De Script
    Par Syntax-ERROR dans le forum C++
    Réponses: 3
    Dernier message: 20/02/2006, 15h28

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