C:
.
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft
PATH
(echo %PATH%
).HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft
PATH
.But principal : la portabilité
« Write once, run anywhere » (voir l’article Wikipedia)
Très versatile, mais un peu lourd (plateforme, syntaxe et performances)
C:\Program Files\Java\jdk...
JDK
dans cette présentationJava Platform JDK
pour le télécharger).dev tools
(désactiver les deux autres, inutiles ici).HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft
PATH
.tp_java
, puis :
G:\tp_java>java.exe
'java.exe' n'est pas reconnu en tant que commande interne
ou externe, un programme exécutable ou un fichier de commandes.
java.exe
dansC:\Windows\System32
. Mauvaise pratique ! Suppression !G:\tp_java>echo %JDK%
%JDK%
G:\tp_java>set JDK="C:\Program Files (x86)\Java\jdk1.7.0_45"
G:\tp_java>echo %JDK%
"C:\Program Files (x86)\Java\jdk1.7.0_45"
G:\tp_java>%JDK%\bin\java.exe
Syntaxe : java [-options] class [args...]
(pour l'exÚcution d'une classe)
ou java [-options] -jar jarfile [args...]
(pour l'exÚcution d'un fichier JAR)
...
tp_java
.
class hello {
public static void main(String args[]) {
System.out.println("Hello World!");
}
}
hello.class
.%JDK%\bin\javac.exe hello.java
(attention au c
).hello.class
.%JDK%\bin\java.exe hello
(sans c
ni .class
).hello.class
avec un éditeur adéquat.hello.java
Hello World!
planque
dans %JDK%
et y mettre tous les fichiers
qu’il contient.planque
sera le seul sous-dossier de %JDK%
.%JDK%\bin %JDK%\planque\bin
\jre deviendra \jre
\lib \lib
... ...
%JDK%
n’interfèrera pas avec notre JDK minimal.tp_java
, construire l’arborescence suivante (à coups de mkdir
) :
G:\tp_java> tree jdk
Structure du dossier pour le volume...
Le numéro de série du volume est...
G:\TP_JAVA\JDK
+---jdk
+---bin
+---jre
¦ +---bin
¦ ¦ +---client
¦ +---lib
¦ +---i386
+---lib
G:\tp_java>mkdir jdk
G:\tp_java>mkdir jdk\bin
G:\tp_java>mkdir jdk\jre
G:\tp_java>mkdir jdk\jre\bin
G:\tp_java>mkdir jdk\jre\bin\client
G:\tp_java>mkdir jdk\jre\lib
G:\tp_java>mkdir jdk\jre\lib\i386
G:\tp_java>mkdir jdk\lib
Copier javac.exe
et java.exe
dans jdk\bin
.
G:\tp_java>copy %JDK%\planque\bin\java.exe jdk\bin
1 fichier(s) copié(s).
G:\tp_java>copy %JDK%\planque\bin\javac.exe jdk\bin
1 fichier(s) copié(s).
del hello.class
jdk\bin\javac.exe hello.java
.bin/jli.dll
, le copier et retenter.
G:\tp_java>copy %JDK%\planque\bin\jli.dll jdk\bin
1 fichier(s) copié(s).
G:\tp_java>jdk\bin\javac.exe hello.java
Error: opening registry key 'Software\JavaSoft\Java Runtime Environment'
Error: could not find java.dll
Error: Could not find Java SE Runtime Environment.
G:\tp_java>copy %JDK%\planque\jre\bin\java.dll jdk\jre\bin
javac
a besoin du JRE
pour fonctionner :jre\lib\i386\jvm.cfg
Error: could not open 'G:\tp_java\jdk\jre\lib\i386\jvm.cfg'
jre\bin\client\jvm.dll
Error: missing 'client' JVM at 'G:\tp_java\jdk\jre\bin\client\jvm.dll'.
Please install or use the JRE or JDK that contains these missing components.
JRE
.jre\bin\verify.dll
Error occurred during initialization of VM
Unable to load native library: Can't find dependent libraries
jre\bin\zip.dll
Error occurred during initialization of VM
Unable to load ZIP library: G:\tp_java\jdk\jre\bin\zip.dll
Plus difficile…
`Error occurred during initialization of VM`
`java/lang/NoClassDefFoundError: java/lang/Object`
jre\lib\rt.jar
qui nous manque.rt
pour runtime, contient par exemple :java.lang.String
, java.io
, …lib
, comme library
, bibliothèque,%JDK%\src
ou %JDK%\src.zip
…classes.jar
..jar
est l’extension des Java ARchivesunzip
,.jar
en .zip
,.zip
en .jar
.jar
.%JDK%\planque\bin\jar.exe
dans jdk\bin
.META-INF
, contenant le fichier MANIFEST.MF
.Autres types similaires :
.war
(Web Application aRchive),.ear
(Enterprise ARchive),.jar
avec des composants Entreprise,.rar
(Resource Adapter aRchive),Dernière difficulté :
Erreur : impossible de trouver ou charger la classe principale
com.sun.tools.javac.Main
lib\tools.jar
.META-INF
déclare des services
, le manifeste est quasi vide.Remarque : pour un JDK vraiment minimal,
* on pourrait s’amuser à enlever des classes de rt.jar
et tools.jar
.
hello
en ello
et compiler.ello.class
..java
contient deux classes,.class
..java
.javac
a deux options importantes :-d
: indique le répertoire où les .class
seront écrits-cp
: indique le répertoire où les bibliothèques nécessaires à la
compilation sont cherchéestp_java
.TestCompteur.java
. Que se passe-t-il ?Compteur.java
a aussi été compilée.cp
.planque
) le fichier
Compteur.java
et supprimer Compteur.class
.java.lang.NoClassDefFoundError
.java.exe -cp .;planque TestCompteur
..
pour le répertoire courant,;
est un séparateur (attention, si ;
est votre séparateur
d’instructions, il faut peut-être utiliser :
),planque
permet d’atteindre la classe Compteur
..
du classpath ?, et si
on supprime planque
?d
.planque
en out
. Ce répertoire va stocker les .class
.javac.exe -d out TestCompteur.java
Compteur.java
compilé aussi.TODO: packages et chemins
.jar
.mon_jar
META-INF
Manifest.MF
, avec le texte Manifest-Version: 1.0
Compteur.class
META-INF
et Compteur.class
pour créer un .zip
..jar
..class
.java.exe -cp Compteur.jar TestCompteur
..jar
dans la nature (TTS) et l’utiliser.Manifest-Version: 1.0
Main-Class: TestCompteur