Le classpath est un paramètre qui définit une liste de répertoires, d'archives JAR et ZIP dans lesquels la machine Java et le compilateur cherchent des classes et des ressources lors du lancement d'une application.
Historique de la question :
Depuis l'apparition de Java, il y a eu un besoin d'organiser le chargement d'un grand nombre de classes, qui se trouvent souvent dans différents répertoires. C'est pourquoi le classpath a été inventé, permettant de spécifier de manière flexible les lieux de recherche des dépendances.
Problème :
Si le classpath est mal configuré, l'application ne trouvera pas les classes nécessaires, ce qui entraînera des erreurs de chargement (par exemple, ClassNotFoundException ou NoClassDefFoundError).
Solution :
Le classpath peut être défini via la variable d'environnement CLASSPATH, le paramètre de ligne de commande -cp ou -classpath. Il est important de spécifier explicitement tous les répertoires et fichiers JAR nécessaires au fonctionnement de l'application. Exemple de lancement avec classpath :
java -cp ".;lib/*" com.example.Main
Caractéristiques clés :
; (Windows) ou : (Linux/macOS)lib/* — tous les JAR dans le dossier libJava peut-elle trouver des classes toute seule si elles ne sont pas spécifiées dans le classpath ?
Non, Java ne recherche pas automatiquement des classes en dehors du classpath spécifié. Chaque chemin doit être explicitement inscrit ou ajouté lors de l'étape de construction ou de lancement.
Le ordre des chemins dans le classpath affecte-t-il le chargement des classes ?
Oui, en cas de noms de classes identiques, la première classe trouvée sera celle du premier chemin spécifié. L'ordre est important pour éviter les conflits de versions.
Peut-on ajouter un nouveau JAR au classpath "à la volée" après le lancement de l'application ?
Non, le mécanisme standard du classpath est statique après le démarrage de la JVM. Le chargement dynamique de nouvelles classes nécessite des ClassLoader spéciaux.
Une application Java est lancée avec le paramètre -cp lib/mylib.jar, oubliant d'ajouter le dossier avec la configuration de test. En conséquence, l'application plante avec une erreur, bien que la bibliothèque semble être présente.
Avantages :
Inconvénients :
Maven/Gradle est utilisé, qui forme lui-même le classpath sur la base des dépendances. Le lancement se fait via un script wrapper.
Avantages :
Inconvénients :