Si j'ai une collection de fichiers de ressources dans un répertoire de mon chemin de classe, je peux les énumérer en utilisant ClassLoader.getResources(location)
.Comment puis-je trouver des ressources dans un fichier .jar sur le classpath?
Par exemple, si j'ai /mydir/myresource.properties
sur le chemin de classe, je peux appeler getResources("mydir")
du classloader et obtenir une énumération d'URL contenant myresource.properties
.
Lorsque je compile exactement les mêmes ressources dans un fichier .jar, je n'obtiens rien dans l'énumération des URL lorsque j'appelle. J'ai seulement remplacé la structure de dossier avec un pot contenant ces dossiers (c'est une webapp, ainsi le pot va dans /WEB-INF/lib
). J'ai aussi un certain nombre d'autres appels en utilisant getResourceAsStream(location)
pour obtenir d'autres ressources individuellement par leur nom et ils fonctionnent tous très bien. En quoi consiste l'énumération des ressources lorsque les ressources sont dans un fichier .jar?
Mise à jour - J'ai reproduit (ish) le comportement à l'extérieur du conteneur. L'extrait suivant renvoie l'objet dirProperties
ayant des clés définies pour les noms de ressources dans le package, mais si le package se trouve dans un fichier .jar, il lance une exception NullPointerException pendant la méthode Properties.load (InputStream).
Properties dirProperties = new Properties();
dirProperties.load(this.getClass().getClassLoader().getResourceAsStream(location));
Le même code sur le conteneur (Tomcat 5.5) lancers francs fait pas exception, mais produit un objet vide Propriétés lorsque les fichiers sont dans un .jar.
Je n'avais jamais rencontré cette différence de comportement auparavant, mais je pouvais imaginer une situation où une implémentation de chargeur de classe donnée ne pouvait pas exprimer la ressource comme une URL lorsqu'elle était compressée dans un JAR. Les serveurs avec lesquels j'ai travaillé (Jboss/Tomcat) * peuvent cependant le faire, cependant. – skaffman