Section courante

A propos

Section administrative du site

Fiche technique
Nom : classpath
Type d'élément : Variable système

Introduction

Le classpath désigne l'ensemble des chemins (répertoires et fichiers JAR) que la machine virtuelle Java (JVM) parcourt pour localiser les classes et les ressources nécessaires à l'exécution d'un programme. Lorsqu'une application Java est lancée, la JVM consulte le classpath pour trouver les fichiers .class, les bibliothèques externes et parfois des ressources comme des fichiers de configuration. Le classpath peut être défini de différentes manières : via une variable d'environnement (CLASSPATH), en ligne de commande avec l'option -classpath ou -cp, ou encore automatiquement par des outils comme Maven ou Gradle. Une mauvaise configuration du classpath est une cause fréquente d'erreurs telles que ClassNotFoundException ou NoClassDefFoundError.

Qu'est-ce que le classpath, conceptuellement ?

Le classpath est le mécanisme de localisation des classes et des ressources utilisé par la JVM (Java Virtual Machine) et par les outils Java (compilateur javac, lanceur java, outils de test, serveurs applicatifs,...).

Contrairement à d'autres langages où les fichiers sont référencés explicitement par chemin, Java ne charge jamais une classe par son chemin de fichier direct.

Il charge une classe par son nom pleinement qualifié (Fully Qualified Class Name), par exemple :

  1. java.util.ArrayList

La JVM doit donc répondre à la question suivante :

   « Où se trouve le fichier ArrayList.class correspondant à java.util.ArrayList ? »

La réponse dépend entièrement du classpath.

De nom de classe à fichier .class

Nom logique vs emplacement physique

Une classe Java possède :

Le classpath fournit une liste de racines de recherche.

Pour chaque racine, la JVM :

Exemple de classpath :

/app/classes
/app/lib/utils.jar

Recherche de com.example.app.Main :

/app/classes/com/example/app/Main.class /app/lib/utils.jar!/com/example/app/Main.class

Important : La première occurrence trouvée est utilisée.

Ce que peut contenir un classpath

Un classpath est une liste ordonnée de :

Répertoires

/bin
/classes
/target/classes

Fichiers JAR

Archives ZIP contenant des .class

Peuvent inclure un META-INF/MANIFEST.MF

commons-lang3-3.14.0.jar
spring-core.jar

Caractères génériques (depuis Java 6)

lib/*

Important : inclut tous les JARs du dossier.

Pas récursif : lib/* ≠ lib/**/*.jar

Comment définir le classpath

En ligne de commande

Compilation :

javac -classpath lib/utils.jar src/Main.java

Exécution :

java -cp classes:lib/utils.jar com.example.Main

Sous Windows :

java -cp classes;lib\utils.jar com.example.Main

Le séparateur dépend du système d'exploitation :

Variable d'environnement CLASSPATH

export CLASSPATH=classes:lib/utils.jar

Fortement déconseillée aujourd'hui :

Via le manifeste d'un JAR

Dans META-INF/MANIFEST.MF :

Main-Class: com.example.Main
Class-Path: lib/utils.jar lib/logging.jar

Utilisé avec :

java -jar app.jar

Important : Les chemins sont relatifs au JAR, pas au dossier courant.

Via des outils de build

Maven

Gradle

Important : En pratique, les développeurs ne gèrent presque jamais le classpath à la main.

Classpath et chargement des classes

ClassLoader : le vrai moteur

Le classpath n'est pas lu directement par la JVM.

Il est utilisé par les ClassLoaders.

Principaux chargeurs :

Délégation parent-first

Lorsqu'une classe est demandée :

Important : Empêche de remplacer java.lang.String

Classpath vs Modules (Java 9+)

Depuis Java 9, Java introduit le système de modules (JPMS).

Différence clef

Classpath Module path
Non structuré Structuré
Tout est visible Accès contrôlé
Conflits possibles Dépendances explicites
Legacy Moderne

Le classpath existe toujours et reste :

Un projet peut mixer :

--class-path lib/*
--module-path mods

Classpath et ressources (fichiers non-Java)

Le classpath ne sert pas seulement aux classes.

On peut y entreposer :

Chargement via :

  1. InputStream is =
  2.   getClass().getClassLoader()
  3.             .getResourceAsStream("config/app.properties");

Attention : Le chemin est relatif à la racine du classpath, pas au système de fichiers.

Problèmes classiques liés au classpath

ClassNotFoundException

NoClassDefFoundError

Conflits de versions

Bug subtil et dangereux

Ordre du classpath : détail critique

Le classpath est ordonné.

Exemple :

lib/v1.jar:lib/v2.jar

v1.jar masque v2.jar

Certains cadres d'applications (Tomcat, OSGi) modifient cet ordre.



Dernière mise à jour : Mercredi, le 3 juin 2015