On a souvent des questions sur le classpath, donc pour éviter de se répéter, voici un topic qui lui est entièrement consacré.
Si après avoir lu tout ca
vous avez encore des questions, ce topic est fait pour ca
0) quand je lance mon programme java ou que je compile, ca me mets java.lang.ClassNotFoundException ou java.lang.NoClassDefFoundError
Pas de panique, c'est une erreur classique quand on débute : ton classpath est mal configuré.
1) Ok, mais le classpath, c'est quoi ?
C'est une variable. Elle est composées de plusieurs chemin (path). Les chemins désignent soit des répertoires, soit des fichiers jar. Ces chemins peuvent être absolus ou relatifs. Le caractère utilisé pour séparer les différents chemins est dépendant de l'OS : sous windows c'est le point virgule ';', sous linux/unix c'est les deux points ':'. Attention : l'orde dans lequel vous mettez les différents chemins est important.
exemple de classpath sous windows :
.;d:\java\lib\xerces.jar;d:\java\projets\javaBot\classes;"C:\Program Files\toto.jar"
Dans cet exemple, on définit 4 chemins :
- le répertoire courant
- le fichier d:\java\lib\xerces.jar
- le répertoire d:\java\projets\javaBot\classes
- le fichier C:\Program Files\toto.jar. On mets des " autour parce qu'il y a un espace dans le chemin.
remarque : sous windows on peut utiliser '/' ou '\' comme séparateur de répertoire.
2) D'accord, mais ca sert à quoi le classpath ?
C'est utilisé par le compilateur et le machine virtuelle java pour retrouver les classes dont a besoin un programme.
Par exemple, si j'ai besoin d'utiliser un parser XML (xerces par exemple), pour que le compilateur et la JVM retrouvent les classes du parser, il va falloir ajouter la librairie xerces.jar au classpath.
En pratique, quand Java a besoin d'une classe, il va parcourir le classpath (dans l'ordre) et va chercher dans chacun des chemins du classpath si il trouve la classe. Si à la fin il n'a pas trouvé la classe en question, il balance une ClassNotFoundException (si on compile) ou une NoClassDefFoundError (si on execute)
Quand on installe le JDK de SUN, aucun classpath n'est définit !!!!! Même le répertorie courant n'est pas dedans. C'est une erreur classique de débutant : on se met dans le repertoire dans lequel se trouve les fichiers compilés, on tape java HelloWorld et on se mange un NoClassDefFoundError
. La solution : taper java -classpath . HelloWorld. Dans la partie 4, je détaille comment configurer le classpath ...
3) depuis tout à l'heure tu parles de jar, c'est quoi ??
Un fichier jar c'est un fichier compressé. Ca veut dire Java ARchive. Le format de compression est le zip : essyez, vous verrez que vous pouvez ouvrir un fichier jar avec winzip. Habituellement, les jar sont utilisés pour stocker les classes d'une API.
En fait un jar c'est un repertoire compressé. Donc quand on inclut un jar dans le classpath, ca revient au même que si on décompessait le jar et qu'on incluait dans le classpath le repertoire dans lequel on l'a décompressé.
4) Ok, bon je sais ce que c'est, je sais à quoi ca sert. Maintenant, comment je fais pour le configurer
là ca se complique : y a plusieurs solution, et ca dépend de l'environnement dans lequel tu travailles.
a) Si tu utilises un IDE : (très fortement déconseillé pour les premiers pas en Java !!! jbuilder suxor !!!)
La façon de configurer le classpath dépend de l'IDE. Je vais essayer de repertorier ici les manipulations à faire pour tous les IDE. Moi je me sers d'Eclipse => je vais commenter la façon de faire d'eclipse. Ceux qui se servent d'autres IDE, merci de me laisser la marche à suivre, je l'incluerai ici.
i) Eclipse
dans le menu project/properties/java Build Path/Librairies
Si les jars ou les repertoires à inclure sont dans l'arborescence du projet, bouton "Add JARS..." ou "Add Class Folder...". sinon, si c'est un jar => boutons "Add External JAR..." ou si c'est un repertorie "Add Variable" (ca marche aussi avec les jar)
ii) JCreator
Configure => Option => JDKProfiles
On séléctionne le jdk utilisé (en général y'en a qu'un)
pi on va dans Edit
Ensuite On a la fiche de tous les jar et dossier du "classpath" de Jcreator. Add Path pour rajouter un dossier, et Add Archive pour rajouter un jar
iii) JBuilder
Outils => configurer les JDk
Ca affiche la liste des jar et dossier du classpath
Pour en rajouter : "Ajouter" pi vou mettez vos classes, vos jars ect...
b) si on compile à la main dans un shell (conseillé pour les premiers pas : c'est chiant, mais c'est comme ca qu'on apprend)
- La 1ere solution est d'écrire le classpath à chacune des commandes de compilation ou de lancement du programme. ex sous windows :
javac -classpath .\lib\xerces.jar -d .\classes .\src\monpackage\*.java
java -classpath .\lib\xerces.jar;.\classes monpackage.MaClasse
- La 2e solution c'est de mettre le classpath en variable systeme : java et javac vont chercher cette variable lorsqu'aucun classpath n'est défini en ligne de commance.
sous windows 9x :
Dans c:\autoexec.bat, ajouter une ligne du type :
SET CLASSPATH=.;d:\java\lib\xerces.jar;%CLASSPATH%
sous windows NT/2000/XP :
démarrer/paramêtre/panneau de configuration/système/avancé/variable d'environnement
créer une variable CLASSPATH (si elle n'existe pas) et lui donner une valeur du type :
.;d:\java\lib\xerces.jar
C'est pratique : après on a plus qu'à faire java monpackage.MaClasse et ca fonctionne. Mais au bout d'un moment, quand on travaille sur bcp de projet, on finit par avoir un classpath système ENOOOOOOOOOOORME
- la 3e solution c'est un mixe des deux : utiliser un fichier batch pour configurer le classpath.
exemple sous windows (shell DOS): dans un fichier setEnv.bat :
Citation :
SET CLASSPATH=.
SET CLASSPATH=%CLASSPATH%;d:\java\lib\xerces.jar
SET CLASSPATH=%CLASSPATH%;d:\java\lib\xalan.jar
SET CLASSPATH=%CLASSPATH%;d:\java\projets\utils\classes
|
Quand on lance le shell, on execute le fichier setenv, et on a le classpath de configuré pour ce shell. On peut ensuite se servir de java et de javac sans l'option -classpath
5) j'ai rien compris ! j'ai pas envie de tout lire ! je comprend qu'avec des exemples (rayez les mentions inutiles)
L'exemple suivant est sous windows : je lis un fichier de conf XML contenant un nom et je dis bonjour à cette personne. Un helloworld remit au goût du jour quoi
On va faire les choses proprement : je créé un rep e:\java\test pour mon projet.
Dedans, je créé un repertoire src qui va contenir les fichier sources (.java), un répertoire classes qui contiendra les fichier compilés, un répertoir lib qui contiendra les jar et un répertoire conf qui contiendra les fichier de configuration (ici le fichier XML)
E:\java\test
-> src
-> classes
-> lib
-> conf
première chose, installer Java. Moi je suis en 1.4.2 ca se passe là : http://java.sun.com/j2se/1.4.2/download.html. Attention : faut prendre le SDK, pas le JRE sinon vous n'aurez pas le compilateur. L'installe est tranquille. C'est un bête exe.
Ensuite, récupérer un parser XML. Ici je vais prendre xerces : http://xml.apache.org/dist/xerces-j/ (moi c'est la version 2.5 : Xerces-J-bin.2.5.0.zip).
Faut décompresser le zip pour trouver les fichiers xercesImpl.jar et xml-apis.jar. Il faut les copier dans le repértoire e:\java\test\lib.
Voici le fichier XML dont je vais me servir : e:\java\test\conf\data.xml
<?xml version="1.0"?>
<data>
<name>Benou</name>
</data>
|
On peut maintenant ecrire le source. Je vais appeler ma classe HelloXML et la mettre dans le package hfr.benou => le fichier source est e:\java\test\src\hfr\benou\HelloXML.java
voici son contenu :
Code :
- package hfr.benou;
- import java.io.*;
- import javax.xml.parsers.*;
- import org.w3c.dom.*;
- public class HelloXML {
- public static void usage() {
- System.out.println("Usage : java hfr.benou.HelloXML xmlFile" );
- System.exit(-1);
- }
- public static void main (String[] args) throws Exception {
- if (args.length != 1) {
- usage();
- }
- DocumentBuilderFactory builderFact = DocumentBuilderFactory.newInstance();
- DocumentBuilder docBuilder = builderFact.newDocumentBuilder();
- Document doc = docBuilder.parse(new File(args[0]));
- Element node = (Element) doc.getElementsByTagName("data" ).item(0);
- node = (Element) node.getElementsByTagName("name" ).item(0);
- String name = node.getFirstChild().getNodeValue();
- System.out.println("Hello " + name + " !" );
- }
- }
|
Maintenant on fait quelques fichiers batch pour faciliter les choses :
- e:\java\test\setEnv.bat : (à lancer une fois au lancement du shell)
Citation :
SET JAVA_HOME=C:\utils\j2sdk1.4.0_02
SET PATH=%JAVA_HOME%\bin;%PATH%
SET CLASSPATH=.\lib\xercesImpl.jar
SET CLASSPATH=%CLASSPATH%;.\lib\xml-apis.jar
SET CLASSPATH=%CLASSPATH%;.\classes
|
ici je redéfinit la variable JAVA_HOME, mais je crois me souvenir que c'est fait pendant l'installe du JDK. Dans le doute, mettez le repértoire dans lequel vous avez installé le JDK.
- e:\java\test\make.bat : (pour compiler)
Citation :
javac -classpath %CLASSPATH% -d .\classes src\hfr\benou\*.java
|
- e:\java\test\run.bat : (pour lancer le prog)
Citation :
java -classpath %CLASSPATH% hfr.benou.HelloXML .\conf\data.xml
|
Maintenant faut ouvrir une fenêtre DOS, aller dans le rep e:\java\test, lancer setenv, lancer make (ca créé le fichier E:\java\test\classes\hfr\benou\HelloXML.class), et lancer run et ca affiche :
et voilà !
Voir aussi : Le topic-passage-obligé pour débutants !
Message édité par benou le 25-05-2005 à 14:25:02
---------------
ma vie, mon oeuvre - HomePlayer