Java-exécuter-une-"class"-et-PATH

Bonjour,
Je me lance dans Java avec le tutoriel de Oracle. (docs.oracle.com/javase/tutorial/ … /unix.html)

Voici le petit texte qui pose problème:

[code]/**

  • The HelloWorldApp class implements an application that
  • simply prints “Hello World!” to standard output.
    */
    class HelloWorldApp {
    public static void main(String[] args) {
    System.out.println(“Hello World!”); // Display the string.
    }
    }[/code]

J’ai bien réussi à afficher “Hello World!” une première fois mais quand j’ai repris le tutoriel je n’ai pas réussi à afficher la nouvelle “class” ni celle correspondant à “Hello World!”.

Voici où se trouvent java et javac: /home/dominique/jdk-7u9/jdk1.7.0_09/bin/javac /home/dominique/jdk-7u9/jdk1.7.0_09/bin/java
Voici où se trouvent mes fichiers: dominique@debian:~/tmp/examples/java$ ls HelloWorldApp.class HelloWorldApp.java

La compilation fonctionne.
Voici la réponse à l’exécution de java HelloWorldApp:

dominique@debian:~/tmp/examples/java$ /home/dominique/jdk-7u9/jdk1.7.0_09/bin/java HelloWorldApp /home/dominique/jdk-7u9/jdk1.7.0_09/bin/java: line 1: class : commande introuvable /home/dominique/jdk-7u9/jdk1.7.0_09/bin/java: line 2: Erreur de syntaxe près du symbole inattendu « ( » /home/dominique/jdk-7u9/jdk1.7.0_09/bin/java: line 2: ` public static void main(String[] args) {'

Merci de votre compréhension,
ciao.

[ul][li] Merci d’utiliser des balises [ code ] pour rendre les choses plus lisibles (je l’ai fait pour toi, tu peux éditer ton message pour voir comment j’ai fait comme ça la prochaine fois tu pourras le faire toi-même).[/li]
[li] Je déplace vers la section Programmation, ça y sera plus à sa place.[/li][/ul]

Bonjour,

à première vue il me semblerait que tu aies lancé

au lieu de

bonne chance

Bonjour,
Merci pour l’orientation je n’avais pas vu qu’il y avait une section programmation.
Comment active-t-on les bornes “code” et comment vérifie-t-on leur mise en action? Je sélectionne [code] et j’insère le texte entre les bornes.
L’aperçu ne montre pas la présentation que l’on observe dans les posts.
Merci de vos conseils.

java HelloWorldApp
En java ce n’est pas le nom-de-fichier que l’on exécute mais l’expression se trouvant avant .class; même sachant cela je n’ai pas réussi à refaire le test.
Le tutoriel explique les erreurs de débutant à “Lesson: Common Problems (and Their Solutions)”; je vais reprendre tout ça.

Ciao.

Je ne vois pas d’erreur dans ce que tu as fais, par contre lance la commande

pour qu’on ai un peu plus d’informations. chez moi voici ce que ça donne (oui je suis en Java 6 mais ça ne doit pas changer grand chose) :

$ file * HelloWorldApp.class: compiled Java class data, version 50.0 (Java 1.6) HelloWorldApp.java: ASCII English text

Bonsoir,
A la citation:

Voilà la réponse:

dominique@debian:~/tmp/examples/java$ file HelloWorldApp* HelloWorldApp2.class: compiled Java class data, version 51.0 HelloWorldApp2.java: ASCII English text HelloWorldApp.class: compiled Java class data, version 51.0 HelloWorldApp.java: ASCII English text

J’ai essayé depuis “root”; même résultat: commande introuvable.
Ciao

Normalement, il faut utiliser les commandes java et javac de /usr/bin/, c’est plus propre :

guest@localhost:~$ which java
/usr/bin/java
guest@localhost:~$ which javac
/usr/bin/javac
guest@localhost:~$ 

Si tu veux utiliser java et javac de ta /home/dominique/jdk-7u9/jdk1.7.0_09,
tu dois, en root, utiliser la commande update-alternatives --install <priorité>,
puis les commandes update-alternatives --config java et update-alternatives --config javac .

Ex :

update-alternatives --install /usr/bin/java java /home/dominique/jdk-7u9/jdk1.7.0_09/bin/java 1000
update-alternatives --install /usr/bin/javac javac /home/dominique/jdk-7u9/jdk1.7.0_09/bin/javac 1000

Puis tu sélectionne ta version de java et de javac:

update-alternatives --config java
update-alternatives --config javac

Ensuite tu vérifie :

java -version
javac -version

Conseil pour débutant : quand tu compile et tu exécute un script java, fait le en te plaçant dans le répertoire courant du script java (car par défaut, si tu n’as pas définit de classpath, java recherche le script dans le répertoire du script).

@fluo > Je ne pense pas que ça vienne de là. On peut vouloir utiliser une version de java pour le système et une pour développer ses propres appli.

@Tinnitus > Déplace les fichiers *.java et retente pour voir.

Bonsoir,
J’ai fait les modifications suivantes:

echo $CLASSPATH CLASSPATH:/home/dominique/tmp/examples/java echo $PATH /usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/dominique/jdk-7u9/jdk1.7.0_09/bin

Pas d’amélioration; toujours la même réponse:

dominique@debian:~/tmp/examples/java$ java HelloWorldApp Exception in thread "main" java.lang.UnsupportedClassVersionError: HelloWorldApp : Unsupported major.minor version 51.0 at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:634) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:277) at java.net.URLClassLoader.access$000(URLClassLoader.java:73) at java.net.URLClassLoader$1.run(URLClassLoader.java:212) 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) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:334) Could not find the main class: HelloWorldApp. Program will exit.

Pour ce qui est de /usr/bin/java:

[code]dominique@debian:~/tmp/examples/java$ ls
HelloWorldApp2.class HelloWorldApp.class
HelloWorldApp2.java HelloWorldApp.java
dominique@debian:~/tmp/examples/java$ /usr/bin/java HelloWorldApp
Exception in thread “main” java.lang.UnsupportedClassVersionError: HelloWorldApp : Unsupported major.minor version 51.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:634)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:277)
at java.net.URLClassLoader.access$000(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:212)
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)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:334)
Could not find the main class: HelloWorldApp. Program will exit.

[/code]

Je pense que PATH et CLASSPATH devraient permettre à java de trouver HelloWorldApp; ce que je ne comprends vraiment pas c’est comment HelloWorldApp a pu s’afficher la première fois que je l’ai lancé.

Ciao.

Unsupported major.minor version 51.0

=> t’as exécuté un fichier .class à l’aide de la commande java dont la version de jdk est supérieure ou inférieure à celle du compilateur javac.

Il vaut que les commandes java et javac aient le même jdk, sinon ça ne marchera pas.

Par exemple, si tu compile avec /home/dominique/jdk-7u9/jdk1.7.0_09/bin/javac, et que ensuite tu exécute avec java d’un autre jdk, et bien ça ne marche pas.

Le plus simple :
-tu te place dans le répertoire de ton script java :

cd /home/dominique/tmp/examples/java/

Puis tu compile avec /home/dominique/jdk-7u9/jdk1.7.0_09/bin/javac

/home/dominique/jdk-7u9/jdk1.7.0_09/bin/javac HelloWorldApp.java

Puis tu exécute le fichier compilé sans indiquer l’extension .class, avec la machine virtuelle /home/dominique/jdk-7u9/jdk1.7.0_09/bin/java (comme ça, tu sais que java et javac sont du même jdk1.7.0_09, ) :

/home/dominique/jdk-7u9/jdk1.7.0_09/bin/java HelloWorldApp

Conseil : il ne faut pas mettre /home/dominique/jdk-7u9/jdk1.7.0_09/bin/ dans la variable PATH,
parce que il peut y avoir confusion entre les java et javac de /usr/bin/java et de /home/dominique/jdk-7u9/jdk1.7.0_09/bin/, c’est pourquoi, il faut utiliser update-alternatives --config java et update-alternatives --config javac pour choisir la version de jdk que tu veux pour ton /usr/bin/java et ton /usr/bin/javac.

[quote=“fluo”]Conseil : il ne faut pas mettre /home/dominique/jdk-7u9/jdk1.7.0_09/bin/ dans la variable PATH,
parce que il peut y avoir confusion entre les java et javac de /usr/bin/java et de /home/dominique/jdk-7u9/jdk1.7.0_09/bin/, c’est pourquoi, il faut utiliser update-alternatives --config java et update-alternatives --config javac pour choisir la version de jdk que tu veux pour ton /usr/bin/java et ton /usr/bin/javac.[/quote]
Re-hum, si tu veux que le java en question soit disponible pour tout le système oui, mais alors l’installer dans /home est une mauvaise idée (dans /opt aurait était une meilleure solution).

Si tu veux juste programmer des trucs en java, le mettre dans le PATH n’est pas une mauvaise idée (parce qu sinon tu risque des incompatibilités entre les logiciels que tu as installé en java via le gestionnaire de paquet et la version de ta jvm), les paquets en question utilisent un script shell pour les lancer qui va configurer/vérifier l’environnement et ne pas utiliser directement ton PATH (en fait ils utilisent plutôt JAVA_HOME.

Pour ce qui est de la compilation comme tu le fait des classes c’est pas viable. C’est intéressant à faire une fois ou deux, mais ensuite il va falloir créer des jar (des archives zip contenant tes classes et des fichiers de descriptions). Passer au moins à ant est un minimum, passer à maven ou gradle est un vrai plus. C’est comme pour du C/C++, on utilise pas directement le compilateur, on préfère passer par make pour qu’il compile tout au petits ognons.

Les gros IDE embarquent de basent au moins ant pour faire le boulot.

Bonjour,

J’ai effacé de /home/dominique/tmp/examples/java HelloWorldApp.class puis j’ai refait toutes les commandes; suit l’affichage dans le terminal:

[code]dominique@debian:~/tmp/examples/java$ ls
HelloWorldApp2.class HelloWorldApp.class
HelloWorldApp2.java HelloWorldApp.java
dominique@debian:~/tmp/examples/java$ rm -i HelloWorldApp.class
rm : supprimer fichier « HelloWorldApp.class » ? oui
dominique@debian:~/tmp/examples/java$ ls
HelloWorldApp2.class HelloWorldApp2.java HelloWorldApp.java

dominique@debian:~/tmp/examples/java$ /home/dominique/jdk-7u9/jdk1.7.0_09/bin/javac HelloWorldApp.java
dominique@debian:~/tmp/examples/java$ ls
HelloWorldApp2.class HelloWorldApp.class
HelloWorldApp2.java HelloWorldApp.java

dominique@debian:~/tmp/examples/java$ /home/dominique/jdk-7u9/jdk1.7.0_09/bin/java HelloWorldApp
/home/dominique/jdk-7u9/jdk1.7.0_09/bin/java: line 1: class : commande introuvable
/home/dominique/jdk-7u9/jdk1.7.0_09/bin/java: line 2: Erreur de syntaxe près du symbole inattendu « ( »
/home/dominique/jdk-7u9/jdk1.7.0_09/bin/java: line 2: ` public static void main(String[] args) {’
[/code]

Même résultat.

Je vais désintaller java et tout reprendre.
Je ferai un nouveau post à la suite de cet essai.

Est-ce qu’on met la marque verte quand on interrompt un post?

Merci pour toutes les informations et à bientôt.

Intrigué j’ai repris ton tutoriel, et j’ai récupéré le jdk1.7u10 (pas le même que toi)

je suis arrivé jusqu’au bout,

user@machine:~/Développements/tmp/examples/java$ /home/user/Développements/tmp/jdk1.7.0_10/bin/javac HelloWorldApp.java user@machine:~/Développements/tmp/examples/java$ /home/user/Développements/tmp/jdk1.7.0_10/bin/java HelloWorldApp Hello World! user@machine:~/Développements/tmp/examples/java$

je pense que ta commande java est corrompue car si je donne les droits d’exécution à mon code source j’obtiens des erreurs comparables :

user@machine:~/Développements/tmp/examples/java$ chmod +x HelloWorldApp.java user@machine:~/Développements/tmp/examples/java$ ./HelloWorldApp.java ./HelloWorldApp.java: line 1: /bin : ceci est un répertoire ./HelloWorldApp.java: line 2: HelloWorldApp.class : commande introuvable ./HelloWorldApp.java: line 3: HelloWorldApp.class : commande introuvable ./HelloWorldApp.java: line 4: */: Aucun fichier ou dossier de ce type ./HelloWorldApp.java: line 5: class : commande introuvable ./HelloWorldApp.java: line 6: Erreur de syntaxe près du symbole inattendu « ( » ./HelloWorldApp.java: line 6: ` public static void main(String[] args) {'

Ce serait donc ton shell qui par une magie que je ne m’explique pas te renvoie les messages d’erreurs en omettant les commentaires, et non la machine virtuelle java.

Par curiosité tu peux essayer un ls -l de ton répertoire bin du jdk et voir si la date est différente moi j’ai une date identique pour java et javac :

-rwxr-xr-x 1 user group 5746 28 nov. 13:49 java -rwxr-xr-x 1 user group 5897 28 nov. 13:49 javac

Réinstaller le jdk devrait corriger le problème - faute de mieux à te proposer

Bonjour,

Je viens moi aussi d’installer jdk1.7.0_10 et tout a fonctionné sur deux exemples; j’ai respecté l’organisation des fichiers proposée par le tutoriel:
- /home/dominique/tmp/examples/java/
- /home/dominique/jdk-7u10/jdk1.7.0_1O/bin/java

Merci à tous.

Bonjour,
Une partie de mes problèmes venait de la lecture des chemins de java qui se trouvent sur mon ordi:

Entre autres erreurs j’avais utilisé PATH en mettant le chemin de jdk-7u10 à la fin de tous les chemins; javac pouvait être trouvé mais pas java de jdk-7u10 car le système utilisait java de /usr/bin/ qui était lu en premier (une autre version de java).

/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/dominique/jdk-7u10/jdk1.7.0_10/bin

Si je veux que dans une session le système ne lise que java et javac de jdk-7u10 je dois ajouter en tête de PATH, /home/dominique/jdk-7u10/jdk1.7.0_10/bin, soit dans le terminal utlisateur:

export PATH=/home/dominique/jdk-7u10/jdk1.7.0_10/bin:$PATH soit: dominique@debian:~/tmp/examples/java$ echo $PATH /home/dominique/jdk-7u10/jdk1.7.0_10/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

A l’arrêt de l’ordi PATH reprend sa valeur initiale donc à la prochaine session il faut reconfigurer PATH avec la commande export.

Merci encore pour votre aide.

N.B.: pour ajouter un chemin à la fin de PATH, par exemple:

Si tu mets cette commande export dans ton ~/.bashrc tu n’auras plus de problème, toutes tes sessions shell la prendront en compte.

Bonjour,

Syam a écrit:

Je viens d’ajouter à la fin du fichier ~/.bashrc à l’aide du terminal administrateur la commande suivante:

Cela fonctionne correctement.
Merci.