Programmation Java/JDK
Le est un ensemble d'outil permettant de développer en Java.
Pour obtenir la liste des options d'un outil, il suffit de lancer l'outil sans aucun argument.
Compiler le code.
javac est le compilateur qui convertit le code source .java en fichier .class (contenant le bytecode Java).
Supposons que vous avez :
Si la compilation échoue parce que votre code utilise des classes que javac ne connait pas (erreur ""), vous devez préciser à javac un classpath comme expliqué plus loin.
Lancer l'application.
codice_1 permet une dans lancer une application java en ligne de commande, il faut passer en paramètre le nom complet ("pleinement qualifié") de la classe.
La ligne de commande ci-dessus appel la méthode public static void main(String[] args) de la classe Exemple du package org.wikibooks.fr avec args, un tableau à deux éléments : "argument_1" et argument_2".
javaw permet une application Java sans console (interface graphique seule).
Une archive java (*.jar) avec l'option codice_2, un petit fichier (appelé « Manifest ») contenu dans le jar indique lui-même le nom de la classe principale à lancer.
Préciser le CLASSPATH.
Dans toutes les commandes ci-dessus, il faut permettre à java de trouver tous les fichiers compilés nécessaire à l'exécution du code (les fichiers codice_3 générés avec codice_4). Pour cela, il faut préciser à codice_1 les répertoires ou celui-ci pourra trouver les classes et les packages nécessaires à l'application.
Pour cela, il faut définir ce qu'on appelle le « CLASS PATH », c'est une simple chaîne qui définit plusieurs chemins pour trouver des .class séparés par ":" sous Linux ou ";" sous Windows. Les chemins peuvent être des chemins vers des fichiers .jar ou vers des répertoires contenant des fichiers codice_6. Il y a deux façons de préciser le CLASSPATH à java, la première est d'utiliser le paramètre codice_7 de ligne de commande.
Sous Linux, les chemins sont séparés par le caractère deux-points :
Sous Windows, les chemins sont séparés par le caractère point-virgule :
Ici, java essaiera de trouver le fichier Exemple.class dans les deux jars donnés puis dans le dossier bin. Si le fichier n'est trouvé dans aucun de ces éléments, il y aura une erreur ("").
La seconde façon de préciser le CLASSPATH est de définir une variable d'environnement système.
Sous Linux :
Sous Windows :
Attention à ne pas confondre codice_8 et codice_9, la première commande permet de lancer le programme qui se trouve dans "fichier.jar" et fonctionne ; la seconde précise que des classes peuvent être chargée depuis "fichier.jar" mais oublie de préciser quelle classe il faut lancer : </code>java</code> indiquera qu'un paramètre est manquant. Enfin, sachez que vous pouvez remplacer « -classpath » par « -cp ».
jar.
L'outil codice_10 permet de regrouper les classes (fichiers codice_3) et ressources d'une application en une seule archive exécutable.
Cette archive est au format ZIP mais possède l'extension codice_12.
Dans cette archive, un répertoire spécial situé à la racine nommé codice_13 contient des fichiers d'information et de configuration pour la machine virtuelle Java, dont notamment le fichier codice_14 (fichier manifest, "MF = Meta File").
Une archive JAR peut être exécutable si la classe principale (contenant une méthode statique nommée codice_15) de l'application est spécifiée dans ce fichier codice_14.
Dans ce cas, l'application peut se lancer avec la commande suivante :
 java -jar chemin_de_l_archive.jar ...arguments passés à l'application si besoin...
Ce fichier manifest est au format texte. Exemple :
 Manifest-Version: 1.0
 Ant-Version: Apache Ant 1.7.1
 Created-By: 19.1-b02 (Sun Microsystems Inc.)
 Main-Class: org.wikibooks.fr.ApplicationExemple
 Class-Path: .
Il possède différents champs.
Chaque champ possède un nom, suivi de deux-points et de sa valeur.
Si une valeur est longue, elle peut être répartie sur plusieurs lignes, chaque ligne additionnelle commençant alors par au moins un caractère espace.
Pour plus de détails sur les fichiers manifest voir http://docs.oracle.com/javase/tutorial/deployment/jar/manifestindex.html
Pour créer une archive JAR à partir d'un répertoire contenant les classes et ressources (les sous-répertoires devant correspondre aux packages), et d'un fichier texte pour le fichier manifest :
 jar cfm "mon_archive.jar mon_manifest.txt" -C "répertoire" .
Quel que soit le nom et l'extension du fichier source pour le manifest, il sera nommé codice_14 dans l'archive.
Les arguments de la commande sont décrits ci-dessous :
Eclipse possède une interface interactive pour générer un fichier JAR à partir des classes d'un projet Java, ou d'une configuration d'exécution.
javadoc.
L'outil codice_19 est le générateur de documentation, qui génère automatiquement de la documentation à partir des commentaires du code source.
Voir le chapitre sur les commentaires pour plus de détails sur l'outil et son utilisation.
jdb.
Le JDK fournit un débogueur nommé codice_20 (Java DeBugger) utilisable depuis la ligne de commande.
Mode interactif.
Lancez la ligne de commande codice_20 pour accéder au débogueur interactif :
Ligne de commande.
Pour les options de la ligne de commande, entrez la commande codice_25
Déboguer une classe.
Cette section montre le débogage d'une classe simple :
Après compilation de la classe, la ligne de commande pour lancer de débogueur est la suivante, en supposant que les fichiers sources dans un sous-répertoire nommé codice_26 et le code compilé dans un sous-répertoire nommé codice_27 :
 jdb -classpath bin -sourcepath src org.wikibooks.fr.Addition
Beaucoup de commandes ne sont pas disponibles tant que la JVM n'est pas lancée :
Lancez la classe spécifiée en ligne de commande :
L'application a été exécutée et s'est terminée, et le débogueur a quitté également.
Le débogueur n'est utilisable que durant l'exécution de l'application, que son exécution soit active ou suspendue soit par un point d'arrêt soit par une exécution pas à pas.
Point d'arrêt et pas à pas.
La pose d'un point d'arrêt peut se faire par la commande codice_28 qui a besoin du nom de la classe (paquetage inclus) et de la méthode.
 jdb -classpath bin -sourcepath src org.wikibooks.fr.Addition
Posez ensuite un point d'arrêt à l'entrée de la méthode codice_15 et lancez l'exécution :
Les commandes testées auparavant sont désormais disponibles :
Exécutez ensuite l'application pas à pas avec la commande codice_30 pour exécuter la ligne de code suivante en entrant dans les méthodes appelées, ou la commande codice_31 pour ne pas entrer dans les méthodes appelées.
À chaque pas, vous pouvez afficher la valeur des variables locales, évaluer une expression, ...
Après un point d'arrêt ou un pas d'exécution, pour continuer l'exécution jusqu'à la fin ou le prochain point d'arrêt, utiliser la commande codice_34 ("continue").
javah.
javah permet de générer un fichier d'en-tête C (*.h) contenant la déclaration des fonctions correspondantes aux méthodes natives de la classe compilée spécifiée.
 javah -classpath "directory-list" "classname"
javap.
javap permet de lister les membres et désassembler la classe compilée spécifiée.
 javap -c -classpath "directory-list" "classname"
Exemple avec désassemblage du code.
La classe désassemblée dans cet exemple est produite à partir de ce fichier source :
package org.wikibooks.fr;
 * Une classe simple à désassembler.
 * @author fr.wikibooks.org
public class Addition
 public static Integer somme(Integer a, Integer b)
 if (a==null) return b;
 if (b==null) return a;
 return a + b;
 public static void main(String[] args)
 // null équivaut à 0 pour la méthode somme
 System.out.println("Somme 1+2 = "+somme(1,2)); // -> 3
 System.out.println("Somme +2 = "+somme(null,2)); // -> 2
L'option verbose permet d'afficher toutes les informations sur le fichier .class :
 > javap -cp W:\Programme\TestJava\bin -v org.wikibooks.fr.Addition
Informations générales.
La première partie indique la version de java utilisée pour compiler la classe (52.0 supportée par Java 8).
La classe est publique (ACC_PUBLIC) et a une classe de base (ACC_SUPER) ; seule la classe java.lang.Object n'en a pas.
Pool de constantes.
Les constantes litérales sont regroupées en un seul endroit du fichier de classe et numérotées.
Elles proviennent du code source mais aussi des constantes implicites utilisées en interne, comme par exemple le nom de la classe de base codice_54 quand aucune n'est spécifiée explicitement.
Chaque constante a un type (Class, Utf8, Methodref) et une ou deux valeurs associés.
La valeur peut faire référence à d'autres constantes définies ailleurs, auquel cas la référence est suivi d'un commentaire donnant la valeur référencée.
Code des méthodes.
Le code de chaque méthode ("bytecode") de la classe est affiché, comme celui du constructeur de la classe pour l'exemple ci-dessous :
Aucun constructeur n'est pourtant déclaré dans le code source de l'exemple plus haut, mais le compilateur en a généré un par défaut.
Le nom du constructeur en interne est en fait codice_55.
L'indicateur d'accès codice_56 signifie que ce constructeur est public.
Le descripteur codice_57 indique que le constructeur n'a pas d'argument (parenthèses vides) et ne retourne rien (V = void).
Le code a besoin d'un élément de pile, d'une variable locale, et utilise un argument implicite (this) référençant l'objet créé à initialiser.
Le constructeur effectue dans l'ordre :
L'instruction à l'adresse 0 correspond à la ligne 7 dans le code source, mais comme ce constructeur a été généré implicitement, la ligne source correspond à la déclaration de la classe.
Une option du compilateur permet de ne pas générer la table des lignes source codice_60.
Le constructeur utilise une variable locale (slot 0) nommée "this", dont le scope va de l'adresse 0 à l'adresse 5, de type codice_61.
Pour la méthode codice_62 :
La méthode est publique et statique (pas de référence this en argument implicite), prend deux arguments de type codice_63 et sa valeur de retour est du même type, comme indiqué par la signature de méthode codice_64.
La méthode utilise deux emplacements dans la pile, deux variables locales, et a deux arguments.
En regroupant par ligne de code source :
La méthode utilise deux variables locales nommées a et b dont la portée va des adresses 0 à 25 (tout le code de la méthode).
L'attribut de méthode codice_65 facilite la vérification des types des valeurs dans les tables de variables locales et la pile lorsque le code contient des sauts d'instructions comme dans cet exemple.
Sans cette information, la vérification de code, ne pouvant pas se fier aux instructions qui précédent seulement pour vérifier la cohérence, doit parcourir tous les chemins d'exécution possible, ce qui prendrait du temps.