2012-08-17 7 views
11

Meine Java-Anwendung muss in der Lage, ein myconfig/ Verzeichnis zu finden, die in der gleichen JAR gebündelt werden:Wie lese ich ein Verzeichnis aus dem Klassenpfad der Laufzeit?

myjar.jar/ 
    com/ 
     me/ 
      myproject/ 
       ConfigLoader.java --> looks for myconfig/ directory and its contents 
    myconfig/ 
     conf-1.xml 
     conf.properties 
     ... etc. 

Wie dieses myconfig/ Verzeichnis aus der Laufzeit Classpath über das Lesen gehe ich eigentlich? Ich habe einige der Forschung getan und es scheint, dass die normale Methode eine Datei aus dem Classpath des Lesens nicht für Verzeichnisse funktioniert:

InputStream stream = ConfigLoader.class.getResourceAsStream("myconfig"); 

So jemand weiß, wie man ein ganzes Verzeichnis aus dem lesen Laufzeitklassenpfad (im Gegensatz zu einer einzelnen Datei)? Danke im Voraus!

Bitte beachten Sie: Es ist nicht möglich, die Dateien einzeln zu laden, myconfig ist ein Verzeichnis mit Tausenden von Eigenschaftendateien darin.

+0

Was möchten Sie tun? –

+0

Ich versuche das Problem zu vereinfachen, um es zu erklären. Es gibt eine Bibliothek namens "langdetect", die auf google [hier] gehostet wird (http://code.google.com/p/language-detection/). Die Bibliothek wird mit einem 'profiles' -Verzeichnis ausgeliefert, mit dem jede einzelne Spracheigenschaftendatei in den Klassenpfad der Laufzeit geladen wird. Zur Laufzeit müssen Sie eine 'DetectFactory.loadProfile (String) 'Methode aufrufen, um das' profiles/'Verzeichnis zu initialisieren. Dieses Verzeichnis muss also im Klassenpfad stehen. Ich kann das funktionieren, wenn ich es einen ABS-Datei-Pfad übergebe, aber letztendlich muss dies in der gleichen JAR verpackt werden. – IAmYourFaja

+0

Also, ich muss nur 'DetectFactory.loadProfiles' eine Zeichenfolge übergeben, die es auf das Verzeichnis' profiles' innerhalb derselben JAR verweist. So, während mein Beispiel 'myconfig'-Verzeichnis zeigt, sind es wirklich' Profile'. Wo es 'ConfigLoader' anzeigt, ist es wirklich' DetectFactory'. – IAmYourFaja

Antwort

10

Sie können die von Spring zur Verfügung gestellte PathMatchingResourcePatternResolver verwenden.

public class SpringResourceLoader { 

    public static void main(String[] args) throws IOException { 
     PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); 

     // Ant-style path matching 
     Resource[] resources = resolver.getResources("/myconfig/**"); 

     for (Resource resource : resources) { 
      InputStream is = resource.getInputStream(); 
      ... 
     } 
    } 
} 

Ich habe nichts Phantasie mit dem zurück Resource aber Sie erhalten das Bild.

Fügen Sie diese auf Ihre Maven Abhängigkeit (wenn Maven verwenden):

<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-core</artifactId> 
    <version>3.1.2.RELEASE</version> 
</dependency> 
4

Sie ClassLoader.getResource() nennen könnte eine bestimmte Datei im Verzeichnis (oder das Verzeichnis selbst, wenn getResource() werden Verzeichnisse zurück) zu finden. getResource() gibt eine URL zurück, die auf das Ergebnis verweist. Sie können diese URL dann in die von der anderen Bibliothek benötigte Form konvertieren.

+0

Die Methode 'getResource()' gibt tatsächlich Verzeichnisse zurück. – jaco0646

Verwandte Themen