Vous êtes sur la page 1sur 4

Avant-propos : Compilation et excution de

programmes Java
V.Marangozova-Martin
1 Quest-ce Java ?
Java nest pas uniquement un langage. En eet, Java dispose dun ensemble
de classes prdnies (une bibliothque) qui sont rassembls dans le JDK = Java
Development Kit. Pour excuter des programmes Java, un utilisateur a besoin
dun environnement spcial qui est le JRE = Java Runtime Environment. Entre
autres, le JRE contient lexcutable java pour lancer les programmes.
Pour crer un programme Java, un dveloppeur a besoin de compiler un en-
semble de classes. La compilation se fait par javac=java compiler. La com-
pilation dune classe Java produit du code dans un format spcial qui est pro-
pritaire Java et qui sappele le bytecode. Le bytecode est un langage machine
pour une machine spciale : la machine virtuelle Java.
En eet, si vous travaillez sur une machine (votre PC, par exemple) et si
vous excutez un programme Java, votre programme sexcutera lintrieur
dun processus Java qui interprtera les instructions du bytecode. Ce processus
"simule" le fonctionnement dun ordinateur : il lit une instruction, rcupre les
donnes la concernant et lexcute. Vu que les instructions machine ne sont pas
vraiment excutes par un "vrai" processeur, nous parlons de machine virtuelle.
Dans le cas de Java, le langage machine Java est dirent du langage machine
de la machine utilise.
Quel est lintrt ? Vous avez certainement entendu le slogan de Java qui est
"Compile once, run everywhere". Eectivement, un programme Java compil
peut sexcuter sur nimporte quelle machine qui dispose du JRE. Petit bmol
quand mme, le JRE est implment diremment selon les plates-formes mais
ceci est transparent pour lutilisateur.
Quel est lintrt des machines virtuelles en gnral ? Elles permettent (liste
non exhaustive et non vraiment trie...) :
De se partager de manire scurise une machine.
De donner limpression que lon dispose de la machine entire. Il sut de
1
Miage3, 2009-2010 2
lancer plusieurs instances de machine virtuelle qui seront mutliplexes sur
la machine relle.
De faire tourner Windows alors quon a install Linux
De tester du nouveau matriel sans vraiment le produire
etc.
2 La compilation en Java
Quand vous crivez des programmes Java, vous crivez des classes que vous
placez dans des chiers. Typiquement, vous allez crire une classe Hello et
allez lenregistrer dans un chier qui sappelle Hello.java. Pour compiler, vous
pouvez simplement faire :
>javac Hello.java
Le rsultat, que vous pouvez vrier avec ls est la cration du chier Hello.class
> ls
Hello.java Hello.class
Donc, par dfaut, si vous ne donnez pas doptions la commande javac, les
classes sont gnrs dans le rpertoire courant.
Pour excuter un programme Java, vous devez indiquer une classe qui contient
la mthode main.
Si votre classe Hello est la suivante :
class Hello {
public static void main(String [] a) {
System.out.println("Helloworld!");
}
}
vous pouvez lancer le programme en faisant :
> java Hello
Malheureusement, dans la plupart des cas, quand vous essaierez dexcuter
un programme Java, vous aurez lerreur suivante :
> java Hello
Exception in thread "main"
java.lang.NoClassDefFoundError: Hello
Miage3, 2009-2010 3
Java vous dit simplement quil ne trouve pas de classe Hello.
Pour viter ce problme, il va falloir diriger le compilateur et lexcution Java.
En eet, il faut comprendre que Java utilise une variable CLASSPATH pour savoir
o chercher les classes compiles.
1
. Donc, si votre classe compile (Hello.class)
se trouve dans le rpertoire /users/mmollet/Java/classes vous avez deux
possibilits.
La premire est de positionner la variable CLASSPATH dans votre environne-
ment et de lancer javac sans options (lexemple suivant marche sous bash, les
autres shells ont des syntaxes direntes).
> CLASSPATH =/ users/mmollet/Java/classes
> export CLASSPATH
> javac Hello
Hello world!
Si vous positionnez pas votre variable globalement, vous pouvez indiquer
Java quelle valeur utiliser chaque lancement.
> javac -cp /users/mmollet/Java/classes Hello
Hello world!
Comment se fait-il que la classe se trouve dans ce rpertoire ? Tout simple-
ment parce que, pendant la compilation, nous avons du dire au compilateur o
mettre les classes quil cre. Ceci se fait laide de loption -d (d pour destina-
tion)
> javac -d /users/mmollet/Java/classes Hello.java
Et si pendant la compilation nous avons une dpendance entre classes, il va
falloir indiquer o sont les classes et o on met les nouvelles classes ce qui donne
des commandes de la forme :
> javac -d /users/mmollet/Java/classes
-cp /users/mmollet/Java/classes Hello.java
3 La compilation des paquetages (package)
Les paquetages dnissent des groupes de classes qui sont lis, dans la plupart
des cas, par leur fonctionnalit. Les paquetages dnissent galement ds rgles
de visibilit (par exemple, des classes et des variables peuvent tre utilises dans
une classe du mme paquetage mais pas en dehors).
1
Cest comme la variable PATH qui indique o chercher les excutables sous Linux
Miage3, 2009-2010 4
Java maintient un lien fort entre la dnition des paquetages et larbores-
cence de chiers contenant les classes des paquetages. Ainsi, si vous avez une
classe qui est de la forme :
package hello;
class Hello {
public static void main(String [] a) {
System.out.println("Helloworld!");
}
}
la copilation de cette classe rsultera en la cration dun rpertoire de nom
hello qui va contenir Hello.class. Voici un exemple (en supposant que nous
nous trouvons dans le rpertoire qui contient Hello.java) :
> javac -d /u/m/marangov/SR/TP1/classes
-cp /u/m/marangov/SR/TP1/classes Hello.java
> ls /u/m/marangov/SR/TP1/classes
hello/
> ls /u/m/marangov/SR/TP1/classes/hello
Hello.class
Pour excuter cette classe, la commande change galement. Il faut donner le
nom "complet" de la classe qui est <nom de paquetage>.<nom de classe> :
> java -cp /u/m/marangov/SR/TP1/classes hello.Hello
Hello World !