Avant-propos : Compilation et exécution de programmes Java

publicité
Avant-propos : Compilation et exécution de
programmes Java
V.Marangozova-Martin
1
Qu’est-ce Java ?
Java n’est pas uniquement un langage. En effet, Java dispose d’un ensemble
de classes prédéfinies (une bibliothèque) qui sont rassemblés dans le JDK = Java
Development Kit. Pour exécuter des programmes Java, un utilisateur a besoin
d’un environnement spécial qui est le JRE = Java Runtime Environment. Entre
autres, le JRE contient l’exécutable java pour lancer les programmes.
Pour créer un programme Java, un développeur a besoin de compiler un ensemble de classes. La compilation se fait par javac=java compiler. La compilation d’une classe Java produit du code dans un format spécial qui est propriétaire à Java et qui s’appele le bytecode. Le bytecode est un langage machine
pour une machine spéciale : la machine virtuelle Java.
En effet, si vous travaillez sur une machine (votre PC, par exemple) et si
vous exécutez un programme Java, votre programme s’exécutera à l’intérieur
d’un processus Java qui interprêtera les instructions du bytecode. Ce processus
"simule" le fonctionnement d’un ordinateur : il lit une instruction, récupère les
données la concernant et l’exécute. Vu que les instructions machine ne sont pas
vraiment exécutées par un "vrai" processeur, nous parlons de machine virtuelle.
Dans le cas de Java, le langage machine Java est différent du langage machine
de la machine utilisée.
Quel est l’intérêt ? Vous avez certainement entendu le slogan de Java qui est
"Compile once, run everywhere". Effectivement, un programme Java compilé
peut s’exécuter sur n’importe quelle machine qui dispose du JRE. Petit bémol
quand même, le JRE est implémenté différemment selon les plates-formes mais
ceci est transparent pour l’utilisateur.
Quel est l’intérêt des machines virtuelles en général ? Elles permettent (liste
non exhaustive et non vraiment triée...) :
– De se partager de manière sécurisée une machine.
– De donner l’impression que l’on dispose de la machine entière. Il suffit de
1
Miage3, 2009-2010
2
lancer plusieurs instances de machine virtuelle qui seront mutliplexées sur
la machine réelle.
– De faire tourner Windows alors qu’on a installé Linux
– De tester du nouveau matériel 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 fichiers. Typiquement, vous allez écrire une classe Hello et
allez l’enregistrer dans un fichier qui s’appelle Hello.java. Pour compiler, vous
pouvez simplement faire :
> javac Hello . java
Le résultat, que vous pouvez vérifier avec ls est la création du fichier Hello.class
> ls
Hello . java
Hello . class
Donc, par défaut, si vous ne donnez pas d’options à la commande javac, les
classes sont générés dans le répertoire courant.
Pour exécuter un programme Java, vous devez indiquer une classe qui contient
la méthode main.
Si votre classe Hello est la suivante :
class Hello {
public static void main ( String [] a ) {
System . out . println ( " Hello ␣ world ! " );
}
}
vous pouvez lancer le programme en faisant :
> java Hello
Malheureusement, dans la plupart des cas, quand vous essaierez d’exécuter
un programme Java, vous aurez l’erreur suivante :
> java Hello
Exception in thread " main "
java . lang . NoClassDe fFoundError : Hello
Miage3, 2009-2010
3
Java vous dit simplement qu’il ne trouve pas de classe Hello.
Pour éviter ce problème, il va falloir diriger le compilateur et l’exécution Java.
En effet, il faut comprendre que Java utilise une variable CLASSPATH pour savoir
où chercher les classes compilées. 1 . Donc, si votre classe compilée (Hello.class)
se trouve dans le répertoire /users/mmollet/Java/classes vous avez deux
possibilités.
La première est de positionner la variable CLASSPATH dans votre environnement et de lancer javac sans options (l’exemple suivant marche sous bash, les
autres shells ont des syntaxes différentes).
> 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 répertoire ? Tout simplement parce que, pendant la compilation, nous avons du dire au compilateur où
mettre les classes qu’il crée. Ceci se fait à l’aide de l’option -d (d pour destination)
> javac -d / users / mmollet / Java / classes Hello . java
Et si pendant la compilation nous avons une dépendance 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 définissent des groupes de classes qui sont liés, dans la plupart
des cas, par leur fonctionnalité. Les paquetages définissent également ds règles
de visibilité (par exemple, des classes et des variables peuvent être utilisées dans
une classe du même paquetage mais pas en dehors).
1 C’est
comme la variable PATH qui indique où chercher les exécutables sous Linux
Miage3, 2009-2010
4
Java maintient un lien fort entre la définition des paquetages et l’arborescence de fichiers 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 ( " Hello ␣ world ! " );
}
}
la copilation de cette classe résultera en la création d’un répertoire de nom
hello qui va contenir Hello.class. Voici un exemple (en supposant que nous
nous trouvons dans le répertoire 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 exécuter 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 !
Téléchargement