2011-01-24 4 views
10

J'ai un gros problème à faire quelque chose de vraiment stupide. C'est-à-dire ouvrir un flux vers un fichier de ressources dans mon dossier META-INF. Je travaille sur un outil de pot et de faire ceci:ne peut pas lire un fichier de META-INF

InputStream schemaIS = this.getClass().getClassLoader().getResourceAsStream("/META-INF/schema.xsd"); 

je simplement obtenir un nul! Le projet est construit en utilisant maven et le fichier xsd se retrouve dans le dossier META-INF, mais cela ne fonctionnera toujours pas.

Ce que je ne comprends pas est la théorie derrière cela? Comment ClassLoader exécute la recherche dans le système de fichiers? Comment puis-je mettre la main sur le fichier?

+3

est une application web? – Bozho

Répondre

23

Essayez de supprimer la première barre oblique:

InputStream schemaIS = this.getClass().getClassLoader().getResourceAsStream("META-INF/schema.xsd"); 

Vous avez besoin d'une barre oblique si vous appelez la méthode getResourceAsStream sur un objet Class. Sur un objet ClassLoader, le chemin est toujours absolu et la barre oblique n'est pas nécessaire.

+0

S'il s'agit d'un META-INF normal qui réside à la racine du chemin de classe, la barre oblique est nécessaire. – Bozho

+2

@Bozho barre oblique est nécessaire si vous appelez la méthode getResourceAsStream sur un objet Class, pas sur un chargeur de classe. – dogbane

+0

il n'est pas nécessaire si vous appelez le classloader, mais cela ne fait certainement pas de différence. Qu'est-ce que 'class.gerResourceAsStream()' fait est de résoudre le chemin par rapport à lui-même, puis le passer à getResourceAsStream de son chargeur de classe. – Bozho

2

essayer ce chemin: META-INF/schema.xsd (premier / omis)