2010-07-01 17 views
24

Der Speicherort der Eigenschaftendatei lautet WEB-INF/classes/auth.properties.So lesen Sie die Eigenschaftendatei in der Webanwendung?

Ich kann JSF-spezifische Wege (mit ExternalContext) nicht verwenden, weil ich eine Eigenschaftendatei in einem Servicemodul brauche, die nicht von einem Webmodul abhängig ist.

habe ich bereits versucht

MyService.class.getClassLoader().getResourceAsStream("/WEB-INF/classes/auth.properties"); 

aber es gibt null.

Ich habe auch versucht, es mit FileInputStream zu lesen, aber es erfordert den vollständigen Pfad, was nicht akzeptabel ist.

Irgendwelche Ideen?

Antwort

49

Mehrere Hinweise:

  1. Sie sollten die ClassLoader lieber als von Thread#getContextClassLoader() zurückgegeben.

    ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
    

    Dies gibt den parentmost Classloader, die den Zugang zu alle Ressourcen hat. Die Class#getClassLoader() wird nur den (untergeordneten) Klassenlader der betreffenden Klasse zurückgeben, der nicht per se Zugriff auf die gewünschte Ressource haben kann. Es funktioniert immer in Umgebungen mit einem einzelnen Klassenlader, aber nicht immer in Umgebungen mit einer komplexen Hierarchie von Klassenladern wie Webapps.

  2. Der Ordner /WEB-INF befindet sich nicht im Stammverzeichnis des Klassenpfads. Der Ordner /WEB-INF/classes ist. Sie müssen also die zugehörigen Eigenschaftendateien laden.

    classLoader.getResourceAsStream("/auth.properties"); 
    

    Wenn Sie sich die Thread#getContextClassLoader() für verwenden, entfernen Sie die führende /.

Die JSF-spezifischen ExternalContext#getResourceAsStream(), die nur zurückgibt Ressourcen aus dem webcontent (dort, wo die /WEB-INF Ordner sitzen) ServletContext#getResourceAsStream() „unter den Hauben“ verwendet, nicht aus dem Classpath.

+0

nicht in diesem Fall – unbeli

+0

@unbeli: was meinst du? – Roman

+1

@unbeli: viel Glück, wenn Sie es als JAR dann verteilen :) – BalusC

8

Versuchen Sie folgendes:

MyService.class.getClassLoader().getResourceAsStream("/auth.properties"); 

Lesen von Dateien mit getResourceAsStream sieht auf dem Classpath zu laden, die Ressource zu finden. Da sich das Verzeichnis classes im Klassenpfad für Ihre Webanwendung befindet, sollte die Bezugnahme auf die Datei /auth.properties funktionieren.

5

ResourceBundle (http://download.oracle.com/javase/6/docs/api/java/util/ResourceBundle.html) lösen die meisten Probleme mit einem relativen/absotule Pfad für Eigenschaften Dateien.

Sie verwendet die Resource-Klasse und verweist auf eine Dummy-Klasse, um auf eine Eigenschaftendatei zu verweisen.

Zum Beispiel:

  1. Sie eine Datei mit dem Namen MAINProperties.properties haben und im Inneren gibt es eine Eigenschaft: mail.host = foo.example.com
  2. Erstellen Sie eine Dummy-Klasse namens MAINProperties ohne nichts.
  3. Verwenden Sie den folgenden Code ein:.

    ResourceBundle.getBundle ("com.example.com.MAINProperties") getProperty ("mail.host")

und das ist es. Keine InputStreams erforderlich.

P.D. Apache Commons hat eine Bibliothek namens Apache Commons Configuration, die viele Funktionen (nachladbare Dateien, mehrere Domain-Typen) bietet, die in Kombination mit den oben genannten Funktionen verwendet werden können.

Verwandte Themen