2010-07-13 6 views
6

Hallo,getResourceAsStream schlägt unter neuer Umgebung fehl?

ich habe folgende Codezeile:

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

und ich weiß, dass Glas mit com/thinkplexx/lang/en/general.xml in Classpath ist.

Es funktionierte unter "vorherige Umgebung", die maven2 build ist.

Jetzt bewerte ich Maven3 und es funktioniert nicht! Ich weiß, dass, wenn ich den Code ändern sein:

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

es funktioniert gut (ich nur den ersten Schrägstrich aus dem Ressourcenpfad entfernt).

Btw, ich benutze Linux. Der erste Schrägstrich im Pfad bedeutet normalerweise "aus dem Wurzelverzeichnis", wenn also diese Logik auch für Java-Ressourcen geladen ist, hätte das erste Beispiel niemals funktionieren sollen !?

Fragen: ist etwas falsch mit dem ersten Codebeispiel, das heißt mit /com/ und nicht com/? Ist es nur schlechter Code oder bedeutet es etwas anderes?

danke!

+0

Devons Antwort funktioniert für mich. Ich fand auch in http://download.oracle.com/docs/cd/E17476_01/javase/1.5.0/docs/guide/lang/resources.html dass: " Die Methoden in ClassLoader verwenden den angegebenen String als Name der Ressource ohne Anwendung einer absoluten/relativen Transformation (siehe Methoden in Klasse). Der Name sollte kein vorangestelltes "/" haben. " –

Antwort

7

Es hängt davon ab, wie Sie die Ressource erhalten. Wenn Sie ein ClassLoader wie in verwenden:

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

Die führenden '/' ist bedeutungslos. Die korrekte Form lautet also "com/thinkplexx/lang/de/general.xml".

Wenn stattdessen verwenden Sie eine 'Klasse', wie in:

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

Sie ein anderes Verhalten zu bekommen. Die Class.getResourceAsStream berücksichtigt Klassen ohne ein führendes '.' relativ zu dem Paket sein, das die Klasse enthält. Ressourcen, die mit einem führenden '.' sind absolut oder relativ zur Wurzel des Jar aufgelöst.

Also, wenn this ein Verweis auf com.example.SomeThing ist, dann ist das erwartete Verhalten ist:

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 wurde lax und damit die letzte Form.

Verwandte Themen