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) {'
[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,
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.
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 .
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).
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é.
=> 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
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, ) :
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.
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?
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
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
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).
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: