Comportement de Class.getResource
Lorsque le chemin spécifié commence par une barre oblique (ex. : /a/b/c.properties), la recherche s'fefectue à partir du répertoire racine du classpath. Si le chemin ne commence pas par une barre oblique (ex. : c.properties), la recherche est relative au package de la classe appelante.
package demo;
import java.net.URL;
public class CheminDemo {
public static void main(String[] args) {
URL cheminRelatif = CheminDemo.class.getResource("");
URL cheminAbsolu = CheminDemo.class.getResource("/");
System.out.println("Chemin relatif : " + cheminRelatif);
System.out.println("Chemin absolu : " + cheminAbsolu);
}
}
La méthode getResourceAsStream de la classe Class suit les mêmes règles pour les chemins d'accès.
Utilisation de ClassLoader.getResource
Avec le ClassLoader, le chemin ne doit pas commencer par une barre oblique et la recherche se fait à la racine du classpath.
package demo;
import java.net.URL;
public class ChargeurDemo {
public static void main(String[] args) {
ClassLoader chargeur = ChargeurDemo.class.getClassLoader();
URL racine = chargeur.getResource("");
URL invalide = chargeur.getResource("/"); // Retourne null
System.out.println("Ressource racine : " + racine);
System.out.println("Test avec barre oblique : " + invalide);
}
}
La méthode getResourceAsStream du ClassLoader applique les mêmes conventions de chemin.
Exemple pratique dans une application web
Pour accéder à un fichier de configuration, comme config.xml dans un package, différentes approches peuvent être utilisées :
package controleur;
import java.io.File;
import java.net.URL;
import java.net.URLDecoder;
public class ChargeurRessource {
public String obtenirCheminAbsolu() throws Exception {
URL urlBase = this.getClass().getResource("/");
String cheminBase = urlBase.getPath();
return cheminBase + "com" + File.separator + "config" + File.separator + "config.xml";
}
public String obtenirCheminRelatif() throws Exception {
URL urlRelative = this.getClass().getResource("");
String cheminRelatif = urlRelative.getPath();
return cheminRelative + "com" + File.separator + "config" + File.separator + "config.xml";
}
public String obtenirCheminViaClassLoader() throws Exception {
URL urlChargeur = this.getClass().getClassLoader().getResource("");
String cheminChargeur = urlChargeur.getPath();
return cheminChargeur + "com" + File.separator + "config" + File.separator + "config.xml";
}
}
Points d'attention techniques
Si le chemin contient des caractères spéciaux comme des espaces ou des dièses, ils seront encodés (par exemple, # devient %23). Dans ce cas, utilisez URLDecoder.decode pour obtenir le chemin correct.
File.separator retourne le séparateur de fichier du système (par exemple, \\ sous Windows, / sous Linux), mais l'tuilisation de la barre oblique (/) est généralement portable entre les systèmes.