Es ist deine Wahl. Grundsätzlich gibt es in einem Java-Webanwendungsarchiv (WAR) drei Möglichkeiten:
1. Legen Sie es in den Klassenpfad
Damit Sie es ClassLoader#getResourceAsStream()
mit einem klassenpfadbezogenen Pfad laden können :
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("foo.properties");
// ...
Properties properties = new Properties();
properties.load(input);
Hier foo.properties
soll in einer der Wurzeln platziert werden, die durch den Standardklassenpfad einer Webanwendung abgedeckt sind, z. B. Webanwendungen /WEB-INF/lib
und /WEB-INF/classes
Server /lib
oder JDK / JREs /lib
. Wenn die Eigenschaftendatei webapp-spezifisch ist, platzieren Sie sie am besten in /WEB-INF/classes
. Wenn Sie ein Standard-WAR-Projekt in einer IDE entwickeln, legen Sie es im src
Ordner (dem Quellordner des Projekts) ab. Wenn Sie ein Maven-Projekt verwenden, legen Sie es im /main/resources
Ordner ab.
Alternativ können Sie es auch außerhalb des Standardklassenpfads platzieren und seinen Pfad zum Klassenpfad des Anwendungsservers hinzufügen. In beispielsweise Tomcat können Sie es als shared.loader
Eigenschaft von konfigurieren Tomcat/conf/catalina.properties
.
Wenn Sie foo.properties
es in einer Java-Paketstruktur wie platziert haben com.example
, müssen Sie es wie folgt laden
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("com/example/foo.properties");
// ...
Beachten Sie, dass dieser Pfad eines Kontextklassenladers nicht mit a beginnen sollte /
. Nur wenn Sie einen "relativen" Klassenlader wie verwenden SomeClass.class.getClassLoader()
, müssen Sie ihn tatsächlich mit einem starten /
.
ClassLoader classLoader = getClass().getClassLoader();
InputStream input = classLoader.getResourceAsStream("/com/example/foo.properties");
// ...
Die Sichtbarkeit der Eigenschaftendatei hängt dann jedoch vom jeweiligen Klassenladeprogramm ab. Es ist nur für denselben Klassenlader sichtbar wie derjenige, der die Klasse geladen hat. Wenn die Klasse also von einem allgemeinen Server-Klassenlader anstelle eines Webapp-Klassenladers geladen wird und sich die Eigenschaftendatei in der Webapp selbst befindet, ist sie unsichtbar. Der Kontextklassenlader ist Ihre sicherste Wahl, damit Sie die Eigenschaftendatei "überall" im Klassenpfad platzieren können und / oder beabsichtigen, eine vom Server bereitgestellte Datei aus der Webanwendung zu überschreiben.
2. Legen Sie es in Webinhalt
Damit Sie es von laden können ServletContext#getResourceAsStream()
mit einem webinhaltsbezogenen Pfad :
InputStream input = getServletContext().getResourceAsStream("/WEB-INF/foo.properties");
// ...
Beachten Sie, dass ich demonstriert habe, die Datei in einem /WEB-INF
Ordner abzulegen, da sie sonst für jeden Webbrowser öffentlich zugänglich gewesen wäre. Beachten Sie auch, dass das ServletContext
in jeder HttpServlet
Klasse nur für die geerbten GenericServlet#getServletContext()
und in Filter
von zugänglich istFilterConfig#getServletContext()
. Wenn Sie nicht in einer Servlet-Klasse sind, kann diese normalerweise nur über injiziert werden @Inject
.
3. Legen Sie es in das lokale Datenträger-Dateisystem
Damit Sie es wie gewohnt java.io
mit einem absoluten lokalen Datenträger-Dateisystempfad laden können :
InputStream input = new FileInputStream("/absolute/path/to/foo.properties");
// ...
Beachten Sie, wie wichtig es ist, einen absoluten Pfad zu verwenden. Relative lokale Datenträger-Dateisystempfade sind in einer Java EE-Webanwendung ein absolutes No-Go. Siehe auch den ersten Link "Siehe auch" unten.
Welche soll ich wählen?
Wägen Sie einfach die Vor- und Nachteile in Ihrem eigenen Meinung zur Wartbarkeit ab.
Wenn die Eigenschaftendateien "statisch" sind und zur Laufzeit nie geändert werden müssen, können Sie sie in der WAR behalten.
Wenn Sie es vorziehen, Eigenschaftendateien von außerhalb der Webanwendung bearbeiten zu können, ohne die WAR jedes Mal neu erstellen und erneut bereitstellen zu müssen, fügen Sie sie in den Klassenpfad außerhalb des Projekts ein (fügen Sie gegebenenfalls das Verzeichnis dem Klassenpfad hinzu).
Wenn Sie es vorziehen, Eigenschaftendateien mithilfe der Properties#store()
Methode programmgesteuert aus der Webanwendung heraus bearbeiten zu können , legen Sie sie außerhalb der Webanwendung ab. Da dies Properties#store()
erforderlich ist Writer
, können Sie keinen Datenträger-Dateisystempfad verwenden. Dieser Pfad kann wiederum als VM-Argument oder Systemeigenschaft an die Webanwendung übergeben werden. Verwenden Sie vorsichtshalber niemalsgetRealPath()
. Alle Änderungen im Bereitstellungsordner gehen bei einer erneuten Bereitstellung verloren, da die Änderungen nicht in der ursprünglichen WAR-Datei wiedergegeben werden.
Siehe auch: