Wo und wie Lesen der Konfiguration-Ressource-Dateien in servlet-basierten Anwendung?
In meinem web-Anwendung, die ich senden E-Mail an vordefinierte Benutzer wie [email protected]
, so möchte ich hinzufügen, dass eine .properties
Datei zugreifen, wenn erforderlich. Ist dies eine korrekte Vorgehensweise, wenn ja dann wo soll ich diese Datei? Ich bin mit Netbeans IDE, die mit zwei unterschiedlichen Ordnern für Quelle und JSP-Dateien.
- JNDI vielleicht eine Lösung?
InformationsquelleAutor sansknwoledge | 2010-01-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist Ihre Wahl. Es gibt grundsätzlich drei Möglichkeiten, in eine Java web application archive (war):
1. Legen Sie es in den classpath
So dass Sie laden Sie es von
ClassLoader#getResourceAsStream()
mit classpath-relativen Pfad:Hier
foo.properties
soll in einer der Wurzeln, die bedeckt sind von den default-classpath eine webapp, z.B. webapp ist/WEB-INF/lib
und/WEB-INF/classes
, server/lib
oder JDK/JRE ist/lib
. Wenn die propertiesfile ist webapp-spezifische, am besten ist es/WEB-INF/classes
. Wenn Sie die Entwicklung eines standard-KRIEGS-Projekt in einer IDE, legen Sie es insrc
Ordner (Quellordner des Projekts befinden). Wenn Sie ein Maven-Projekt, legen Sie es in/main/resources
Ordner.Alternativ können Sie auch legen Sie Sie irgendwo außerhalb der Standard-classpath und den path den Klassenpfad des appserver. Beispielsweise In Tomcat können Sie es konfigurieren, als
shared.loader
Eigenschaft vonTomcat/conf/catalina.properties
.Wenn die
foo.properties
es in einem Java-package-Struktur wiecom.example
, dann müssen Sie es zu laden, wie untenBeachten Sie, dass dieser Pfad des context-class-loader nicht starten sollte mit einem
/
. Nur wenn Sie eine "relative" class-loader wieSomeClass.class.getClassLoader()
, dann sind Sie wirklich brauchen, um es zu starten mit einem/
.Jedoch die Sichtbarkeit der Eigenschaften-Datei hängt sich dann auf den class loader in Frage. Es ist nur sichtbar für den gleichen class loader als diejenige, die die Klasse geladen. Also, wenn die Klasse geladen wird, indem z.B. der server common-classloader statt webapp-classloader, und die properties-Datei innerhalb webapp selbst, dann ist es unsichtbar. Der context-class-loader ist Ihre sicherste Wette, so können Sie die Eigenschaften der Datei "überall" in den Klassenpfad und/oder Sie wollen in der Lage sein zu überschreiben einer server-sofern man von der webapp auf.
2. Legen Sie es in webcontent
So dass Sie laden Sie es von
ServletContext#getResourceAsStream()
mit einem webcontent-relativen Pfad:Beachten Sie, dass ich bewiesen haben, um die Datei in
/WEB-INF
Ordner, sonst wäre es öffentlich zugänglich von jedem webbrowser. Beachten Sie auch, dass dieServletContext
ist in jedemHttpServlet
Klasse nur zugänglich durch die übernommenenGenericServlet#getServletContext()
und inFilter
durchFilterConfig#getServletContext()
. Im Falle dass, wenn Sie nicht in einem servlet-Klasse, die in der Regel nur injizierbaren über@Inject
.3. Legen Sie es in der lokalen Festplatte die Datei-system
So dass Sie laden können, ist es der übliche
java.io
Weise mit einem absoluten lokalen Festplatte die Datei-system-Pfad:Beachten Sie die Bedeutung der mit einem absoluten Pfad. Relativ lokaler Datenträger Dateisystem-Pfade sind ein absolutes no-go in einer Java-EE web-Anwendung. Siehe auch die ersten "Siehe auch" - link unten.
, Die zu wählen?
Nur Wiegen die Vorteile/Nachteile in Ihre eigene Meinung Wartbarkeit.
Wenn die properties-Dateien sind "static" und muss nie ändern während der Laufzeit, dann konnte Sie halten Sie in den KRIEG.
Wenn Sie es vorziehen zu können, Bearbeiten Sie die properties-Dateien, die von außerhalb der web-Anwendung ohne die Notwendigkeit, neu zu erstellen, und implementieren Sie den KRIEG alle Zeit, dann legen Sie es in den classpath außerhalb des Projekts (falls notwendig, fügen Sie das Verzeichnis, im classpath).
Wenn Sie es vorziehen zu können, Bearbeiten Sie die properties-Dateien programmgesteuert aus dem inneren der web-Anwendung mit
Properties#store()
Methode, legen Sie es außerhalb der web-Anwendung. Als dieProperties#store()
erfordert eineWriter
können Sie nicht gehen, um mit einem disk-Dateisystem-Pfad. Dieser Weg kann wiederum an die web-Anwendung als VM-argument oder system-Eigenschaft. Als Vorsichtsmaßnahme, nie verwenden SiegetRealPath()
. Alle änderungen in den deploy-Ordner verloren, auf eine Umschichtung aus dem einfachen Grund, dass die änderungen nicht zurück in die original-KRIEG-Datei.Siehe auch:
Er meint wahrscheinlich einen neuen Ordner erstellen, setzen alle Ihre benutzerdefinierte Konfigurations-Dateien gibt es, und fügte hinzu, dass Ordner in den classpath. Also: 1) Erstellen Sie einen Ordner namens 'appconfs' irgendwo (vielleicht sogar
/etc/appconfs
2) Fügen Sie den Ordner dem Klassenpfad der app-server / domain. Der zweite Schritt ist das app-server-spezifische, ich glaube nicht, dass es generisches Beispiel.Re : 2 : Warum würden beide
"WEB-INF/filename.properties"
und"/WEB-INF/filename.properties"
(beachten Sie die/
am Anfang)? Gibt es irgendeinen Grund bevorzugen einen über den anderen ?Ich habe Fehler in diesem Problem für Sie die Vergangenheit eines Tages. Ich bin nicht in der Lage zu laden meine properties-Datei. Ich bin in der Lage, es zu laden von zwei stellen aus. Ein system-Verzeichnis und eine ist die lokale Festplatte. Es funktioniert mit localhost. Aber ich will stellen Sie Sie auf amazon.
Ich bin mit netbeans IDE und halten Sie die properties-Datei in Web-Seiten/Ressourcen. Ich versuchen, darauf zuzugreifen "./Web-Seiten/resources/config.Eigenschaften". Ich bin nicht in der Lage, darauf zuzugreifen. Bitte helfen Sie mir.
InformationsquelleAutor BalusC
Wort der Warnung: wenn du config-Dateien in Ihrem
WEB-INF/classes
Ordner, und IDE, sagen, Eclipse, funktioniert ein clean/rebuild, es wird nuke deine conf-Dateien, es sei denn, Sie wurden in der Java-Quell-Verzeichnis. BalusC tolle Antwort, deutet, dass in option 1, aber ich wollte noch hinzufügen Wert.Ich die harte Tour gelernt, dass, wenn Sie "kopieren" ein web-Projekt in Eclipse, es macht einen clean/rebuild von einem source-Ordner. In meinem Fall habe ich eine "verknüpfte Datenquelle dir" von unserer POJO java-Bibliothek, die es zusammenstellen würde, um die
WEB-INF/classes
Ordner. Mache ein clean/rebuild in das Projekt (nicht die web-app-Projekt) verursacht das gleiche problem.Ich dachte, es darum, meine confs in der POJO-src-Ordner, aber diese confs sind alle für 3rd-party-libs (wie Quarz oder URLRewrite), die in der
WEB-INF/lib
Ordner, so dass nicht sinnvoll. Ich Plane zu testen, indem Sie in der web-Projekte "src" - Ordner, wenn ich dazu komme, aber dieser Ordner ist momentan leer und conf-Dateien in es scheint unelegant.Also ich vote für die Umsetzung conf-Dateien in
WEB-INF/commonConfFolder/filename.properties
, nächsten zu den classes-Ordner, die Balus option 2.ok das funktioniert, setzen die property-Datei unter 'Java Resources/src/' funktioniert es nicht innerhalb von einem meiner Pakete und muss an der Wurzel des src. Ihre Warnung über die Klassen-Ordner immer schob ist ein berechtigtes Anliegen.
InformationsquelleAutor Ed Pike
Ex: web.xml Datei das tag
Und chat.Eigenschaften Sie können erklären, Ihre Eigenschaften wie dieses
Ex :
InformationsquelleAutor Subhash Pavuskar
Er muss nur im Klassenpfad (aka stellen Sie sicher, es landet unter /WEB-INF/classes in der .Krieg als Teil des build).
InformationsquelleAutor Taylor Leese
Können Sie Sie mit Ihrem Quell-Ordner, so dass, wenn Sie bauen, werden diese Dateien automatisch kopiert und an die Klassen-Verzeichnis.
Anstelle der Verwendung von properties-Datei, verwenden Sie die XML-Datei.
Wenn die Daten zu klein ist, können Sie sogar verwenden web.xml für den Zugriff auf die Eigenschaften.
Bitte beachten Sie, dass dieser Ansatz verlangt, dass der app-server neu starten, damit änderungen übernommen werden.
wenn Sie Ihre Datei landet im WEB-INF/classes-Ordner, wird es automatisch in den classpath
InformationsquelleAutor Kalpak
Davon aus, dass Ihr code sucht die Datei app sagen.Eigenschaften. Kopieren Sie diese Datei auf alle dir, und fügen Sie das Verzeichnis an, classpath, durch die Schaffung einer setenv.sh in das bin Verzeichnis des tomcat.
In Ihrem setenv.sh von tomcat( falls diese Datei nicht existiert, erstellen Sie eines , tomcat lädt diese setenv.sh Datei.
#!/bin/sh
CLASSPATH="$CLASSPATH:/home/user/config_my_prod/"
Sollten Sie sich nicht über Ihre properties-Dateien in ./webapps//WEB-INF/classes/app.Eigenschaften
Tomcat-class-loader überschreiben mit dem aus WEB-INF/classes/
Gut zu Lesen:
https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html
InformationsquelleAutor Thar