Répertoire actuel en Java en 2025 : 3 méthodes et pièges

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Où suis-je ? Ou comment ne pas se perdre dans le système de fichiers d'une application Java

\n\n

Chaque développeur Java s'est posé au moins une fois la question : « Mais où, exactement, mon code s'exécute-t-il ? » Apparemment, on lance le programme depuis l'IDE, tout fonctionne. Mais dès qu'on le déplace sur un serveur ou dans un conteneur Docker, les fichiers qui devaient se trouver à côté du fichier jar se retrouvent quelque part dans les profondeurs de /opt/app ou /tmp. Une situation familière ?

\n\n

La question « How to get the current working directory in Java? » est l'une des plus populaires sur Stack Overflow. Et ce n'est pas sans raison : la réponse semble évidente, mais en pratique, elle cache de nombreux pièges. Dans cet article, nous analyserons les meilleures pratiques de 2025 : comment obtenir de manière fiable le current working directory, quand lui faire confiance, et quand il est préférable de chercher des alternatives.

\n\n
Avertissement : l'article est écrit pour Java 17+ (LTS), mais les exemples sont compatibles avec Java 11 et versions ultérieures. Si vous êtes encore sur Java 8, mettez à jour d'urgence, mais le code fonctionnera aussi.

\n\n

La méthode classique : System.getProperty("user.dir")

\n\n

La méthode la plus simple et la plus largement utilisée consiste à accéder à la propriété système user.dir. C'est ce que vous verrez dans 90% des réponses sur Stack Overflow :

\n\n
public class WorkingDirectoryExample {\n    public static void main(String[] args) {\n        String cwd = System.getProperty("user.dir");\n        System.out.println("Répertoire actuel : " + cwd);\n    }\n}
\n\n

Qu'obtiendrez-vous en sortie ? Le chemin vers le dossier à partir duquel la JVM a été lancée. Si vous lancez depuis la racine du projet, ce sera /Users/you/projects/my-app. Si vous lancez depuis target/, ce sera target/.

\n\n

Pourquoi ce n'est pas toujours fiable ?

\n\n

Problème n°1 : Les IDE et les systèmes de build trompent. IntelliJ IDEA définit par défaut le working directory comme la racine du module. Maven — la racine du projet. Gradle — la racine du module. Mais cela peut être redéfini dans la configuration de lancement. Résultat : le code fonctionne en local, mais pas sur le serveur.

\n\n

Problème n°2 : Les tests unitaires. Lors de l'exécution via JUnit ou TestNG, le working directory peut être la racine du projet, ou bien le dossier de build. Cela dépend des paramètres du runner.

\n\n

Problème n°3 : Les applications web et les microservices. Dans les conteneurs (Tomcat, Jetty), le working directory est souvent égal à $CATALINA_HOME/bin ou /. Cela n'a rien à voir avec votre fichier WAR.

\n\n

L'approche moderne : java.nio.file.Paths

\n\n

Depuis Java 7, nous avons une méthode plus « java-esque » via l'API NIO.2 :

\n\n
import java.nio.file.Paths;\n\npublic class NioWorkingDirectory {\n    public static void main(String[] args) {\n        String cwd = Paths.get("").toAbsolutePath().toString();\n        System.out.println("Répertoire actuel (NIO) : " + cwd);\n    }\n}
\n\n

Que se passe-t-il ici ? Paths.get("") crée une référence vers un chemin vide, qui est interprété comme un chemin relatif vers le répertoire actuel. La méthode toAbsolutePath() le résout en chemin absolu. Le résultat est le même que user.dir, mais avec un typage plus strict.

\n\n

Avantages :

\n
    \n
  • Fonctionne avec des objets Path, pas avec des chaînes (moins d'erreurs avec les séparateurs)
  • \n
  • Peut être utilisé directement dans les API modernes
  • \n
  • Multi-plateforme (Windows vs Linux)
  • \n
\n\n

Inconvénients : les mêmes — il s'agit toujours du working directory du processus.

\n\n

Alternative : File("")

\n\n

Pour ceux qui ne veulent pas passer à NIO (bien que ce soit dommage) :

\n\n
import java.io.File;\n\npublic class FileWorkingDirectory {\n    public static void main(String[] args) {\n        String cwd = new File("").getAbsolutePath();\n        System.out.println("Répertoire actuel (File) : " + cwd);\n    }\n}
\n\n

Exactement la même chose que Paths.get("").toAbsolutePa

Blogs

Book Recommendations