2010-07-13 6 views
6

Hallo,getResourceAsStream échoue dans un nouvel environnement?

i ont la ligne de code suivante:

InputStream passoloExportFileInputStream = getClass().getClassLoader().getResourceAsStream("/com/thinkplexx/lang/de/general.xml"); 

et je sais que jar avec com/thinkplexx/lang/de/general.xml est en classpath.

Il a travaillé sous "environnement précédent", qui est maven2 build.

Maintenant, j'évalue maven3 et ça ne marche pas! Je sais que si je change le code à:

InputStream passoloExportFileInputStream = getClass().getClassLoader().getResourceAsStream("com/thinkplexx/lang/de/general.xml"); 

il fonctionne très bien (je viens enlevé la première barre oblique à partir du chemin de la ressource).

Btw, j'utilise Linux. La première barre oblique dans le chemin signifie normalement "à partir du répertoire racine", donc si cette logique est bonne pour le chargement des ressources java, le premier exemple n'aurait jamais dû marcher !?

Questions: est quelque chose de mal avec le premier exemple de code, à savoir avec /com/ et non com/? Est-ce que c'est juste du mauvais code ou ça veut dire quelque chose de différent?

merci!

+0

La réponse de Devons fonctionne pour moi. Aussi, j'ai trouvé dans http://download.oracle.com/docs/cd/E17476_01/javase/1.5.0/docs/guide/lang/resources.html que: " Les méthodes dans ClassLoader utilisent la chaîne donnée en tant que nom de la ressource sans appliquer de transformation absolue/relative (voir les méthodes de la classe) .Le nom ne doit pas avoir de "/". " –

Répondre

7

Cela dépend de la façon dont vous obtenez la ressource. Lorsque vous utilisez un ClassLoader comme dans:

InputStream stream= getClass().getClassLoader().getResourceAsStream("/com/thinkplexx/lang/de/general.xml"); 

Le leader '/' n'a pas de sens. Ainsi, le format correct est "com/thinkplexx/lang/de/general.xml".

Si, au lieu que vous utilisez une 'classe', comme dans:

InputStream stream= getClass().getResourceAsStream("/com/thinkplexx/lang/de/general.xml"); 

Vous obtenez un comportement différent. Le Class.getResourceAsStream considérera les classes sans "." être relatif au paquet contenant la classe. Ressources spécifiées avec un '.' sont absolus, ou résolus par rapport à la racine du pot.

Donc, si this est une référence à com.example.SomeThing, le comportement attendu est:

getClass().getResourceAsStream("https://stackoverflow.com/a/b/c.xml") ==> a/b/c.xml 
getClass().getResourceAsStream("a/b/c.xml") ==> com/example/a/b/c.xml 
getClass().getClassLoader().getResourceAsStream("a/b/c.xml") ==> a/b/c.xml 
getClass().getClassLoader().getResourceAsStream("https://stackoverflow.com/a/b/c.xml") ==> Incorrect 

Maven2 était d'être laxiste et permettant à la dernière forme.

Questions connexes