2009-04-14 7 views
15

Je sais que nous pouvons faire quelque chose comme ceci:Comment parcourir les ressources de classe Java?

Class.class.getResourceAsStream("/com/youcompany/yourapp/module/someresource.conf") 

pour lire les fichiers qui sont emballés dans notre fichier jar. Je l'ai beaucoup googlé et je n'utilise sûrement pas les termes appropriés; ce que je veux faire est de lister les ressources disponibles, quelque chose comme ceci:

Class.class.listResources("/com/yourcompany/yourapp") 

qui devrait renvoyer une liste de ressources qui sont à l'intérieur du paquet com.yourcompany.yourapp.*

Est-ce possible? Des idées sur la façon de le faire au cas où cela ne pourrait pas être fait aussi facilement que je l'ai montré?

Note: Je sais qu'il est possible de savoir où se trouve votre pot, puis l'ouvrir et inspecter son contenu pour y parvenir. Mais, je ne peux pas le faire dans l'environnement dans lequel je travaille maintenant.

+0

Est-ce que quelque chose comme ServiceLoader est une option? http://stackoverflow.com/questions/251336 En d'autres termes, au lieu de répertorier un "répertoire" sur le chemin de classe lors de l'exécution, vous fournissez une liste de ressources explicitement au moment de la compilation et vous la stockez sur le chemin de classe dans un emplacement connu. . – erickson

Répondre

9

Pour les ressources dans un fichier JAR, quelque chose comme cela fonctionne:

URL url = MyClass.class.getResource("MyClass.class"); 
String scheme = url.getProtocol(); 
if (!"jar".equals(scheme)) 
    throw new IllegalArgumentException("Unsupported scheme: " + scheme); 
JarURLConnection con = (JarURLConnection) url.openConnection(); 
JarFile archive = con.getJarFile(); 
/* Search for the entries you care about. */ 
Enumeration<JarEntry> entries = archive.entries(); 
while (entries.hasMoreElements()) { 
    JarEntry entry = entries.nextElement(); 
    if (entry.getName().startsWith("com/y/app/")) { 
    ... 
    } 
} 

Vous pouvez faire la même chose avec des ressources « explosé » sur le système de fichiers ou dans beaucoup d'autres dépôts, mais ce n'est pas aussi facile. Vous avez besoin d'un code spécifique pour chaque schéma d'URL que vous voulez prendre en charge.

+0

Merci pour l'exemple , Utilise-t-il le chargeur de classe pour atteindre les ressources? Ou il agit comme un assistant pour ouvrir le fichier jar et inspecter ses contentes manuellement? –

+0

C'est un mélange des deux.Il utilise le chargeur de classe pour localiser la ressource. Ensuite, vous devez lister manuellement le contenu. Je n'ai pas montré cela, mais une fois que vous avez la liste des contenus, vous pouvez retourner au chargeur de classe pour le chargement si vous le désirez, ou les charger directement depuis l'archive. – erickson

+0

Hmm, vous êtes dans la mise en œuvre appengine java vm. Il ne vous permettra pas d'ouvrir le fichier. C'était plus ou moins le but. Donc je pense que c'est la bonne réponse, mais ce que je voulais faire n'est pas possible. Il peut avoir des implications de préoccupations de sécurité pour ne pas le permettre :( Merci erickson –

0

J'utilise habituellement

getClass().getClassLoader().getResourceAsStream(...) 

mais je doute que vous pouvez lister les entrées du chemin de classe, sans les connaître a priori.

+0

Pouvez-vous montrer s'il vous plaît une référence qui pointe ce que vous dites comme un fait? –

2

Je cherchais un moyen de lister le contenu d'un fichier jar en utilisant les classloaders, mais cela semble malheureusement impossible. Au lieu de cela, vous pouvez ouvrir le fichier en tant que fichier zip et obtenir le contenu de cette façon. Vous pouvez utiliser les méthodes standard (here) pour lire le contenu d'un fichier jar, puis utiliser le classloader pour lire le contenu.

4

En général, vous ne pouvez pas obtenir une liste de ressources comme celle-ci. Certains chargeurs de classe ne peuvent même pas être en mesure de supporter cela - imaginez un chargeur de classe qui peut récupérer des fichiers individuels à partir d'un serveur web, mais le serveur web n'a pas besoin de supporter la liste du contenu d'un répertoire. Pour un fichier jar, vous pouvez charger le contenu du fichier jar explicitement, bien sûr.

(This question est similaire, btw.)

+0

Il sera agréable de comprendre pourquoi les classloaders ne le permettent pas ou pourquoi le jre ne fournit pas un moyen facile de le faire :( –

+0

@David: J'ai donné un exemple de pourquoi ce n'est pas toujours possible - la situation où le seul l'accès que vous avez dans le magasin sous-jacent (le web) est "récupérer ce fichier" –

+0

Je suis désolé, maintenant je l'ai eu.C'était mon mauvais anglais et probablement le manque d'attention.Maintenant je vous comprends.Merci –

Questions connexes