2010-03-31 10 views
8

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.

+0

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

Répondre

0
this.getClass().getClassLoader().getResourceAsStream(location); 
+1

Bien sûr, je peux utiliser getResourceAsStream (emplacement) au lieu de getResources (emplacement) mais cela ne m'aide pas à résoudre ou à comprendre mon problème à moins d'avoir manqué quelque chose? – Brabster

1

Bien que j'ai beaucoup de questions à vous demander de suggérer précisément une solution, je peux vous demander d'essayer cette étape simple qui peut vous aider à trouver les ressources. Je crois que le chargeur de classe que vous utilisez pour trouver les ressources est incapable de trouver les ressources. Ainsi, vous pouvez essayer comme ci-dessous (plus d'un travail autour):

  1. Créer une simple classe vide (par exemple, ResourceGetter.class)
  2. Ensemble de la classe ainsi que les autres ressources du JAR. Laissez cette classe au même niveau de hiérarchie de dossiers que les autres ressources. A l'intérieur JAR, par exemple:

    /resources/ResourceGetter.class

    /resources/myprop.properties ....

  3. Utilisez ResourceGetter.class.getClassLoader() getResourceAsStream() ou getResources.() dans votre code où vous voulez ces fichiers de ressources.

Si vous pouvez accéder aux ressources, vous pouvez trouver le chargeur de classe qui l'a chargé et vous pouvez là pour résoudre votre problème.

+0

Hey @sugaGenius, j'ai posté cela il y a six ans, je ne me souviens pas pourquoi j'étais intéressé par ce problème à l'époque, ou même ce que le conteneur était! +1 pour essayer d'aider si! – Brabster