2009-05-09 8 views
5

Ist es möglich, ein relatives Verzeichnis (dh foo/bar/plugh) mit dem Java-Classpath und zum HinzufügenZugabe relativ Verzeichnis java classpath und mit Classloader(). GetResourceAsStream ("")

InputStream in = getClassLoader().getResourceAsStream("xyzzy.properties"); 

Um foo/bar/plugh/xyzzy.properties zu holen?

Mein Classpath sieht wie folgt aus:

foo.jar;foo/bar/plugh;xyz.jar 

Und ich bin in der Lage Klassen und Ressourcen aus beiden foo und xyz Gläser zu verwenden, aber nicht aus dem plugh Verzeichnis. In diesen Fällen ist in immer null.

Ich kann das nicht zur Arbeit bringen und bin mir nicht sicher, ob dies nur nicht unterstützt wird, mir etwas Subtiles fehlt oder wenn ich etwas falsch mache. Muss ich einen absoluten Pfad verwenden?

+0

Wie haben Sie diesen Klassenpfad festgelegt? Wie im folgenden Beispiel? java -classpath foo.jar; foo/bar/plugh; xyz.jar –

Antwort

6

Vielleicht missverstehe ich, was Sie zu tun versuchen, aber wenn Sie einen Ordner in Ihrem Klassenpfad haben, bedeutet dies, dass alle darunter liegenden Dateien ebenfalls im Klassenpfad sein sollten. Wenn nicht, können Sie jede .properties-Datei im Klassenpfad übergeben.

Aber so oder so, da die Datei/Ordner, der die Datei enthält, in dem Classpath ist, sollten Sie nur in der Lage sein zu tun:

InputStream in = new FileInputStream("classpath:xyz.properties") 

Und da „foo/bar/plugh“ im Classpath ist Eine der Stellen, nach denen xyz.properties suchen wird, ist "foo/bar/plugh".

+0

Aus irgendeinem Grund funktioniert dies nicht für mich, wenn meine App über eine Batchdatei von Codehaus Maven Appassmebler ausgeführt wird. Absolute Pfade funktionieren, aber relative nicht. – sal

+2

Die einzige Sache, die ich mir vorstellen kann, ist, ob der relative Pfad, den Sie in Ihrem Klassenpfad haben, basierend darauf, wo das Programm ausgeführt wird, aufgelöst wird. Zum Beispiel, wenn ich die Batch-Datei im Verzeichnis C: \ myapp \ bin habe, könnte der "Basis" -Pfad C: \ myapp \ bin, nicht C: \ myapp sein. Wenn dies der Fall ist, würde versucht werden, "C: \ myapp \ bin \ foo \ bar \ plugh \ xyz.properties" aufzulösen. –

+0

Es funktionierte für mich mit dem absoluten Pfad des Verzeichnisses. Aber es ist sehr seltsam, weil ich vorher mit dem Code versucht habe: InputStream in = getClassLoader().getResourceAsStream("xyzzy.properties"); Was ist der Unterschied zwischen diesen beiden Methoden? Danke. –