Frage

In meiner Web-Anwendung habe ich E-Mail Satz vordefinierter Benutzer wie finance@xyz.com zu senden, damit ich, dass auf eine .properties Datei hinzufügen möchte und es den Zugriff, wenn erforderlich. Ist das ein richtiges Verfahren, wenn ja, dann wo soll ich diese Datei platzieren? Ich benutze Netbeans IDE, die zwei separate Ordner für Quelle und JSP-Dateien ist mit.

War es hilfreich?

Lösung

Sie haben die Wahl. Grundsätzlich gibt es drei Möglichkeiten, in einem Java-Webanwendung-Archiv (SIND):


1. Legen Sie es in Classpath

Damit Sie es von ClassLoader#getResourceAsStream() mit einem classpath-relativen Pfad:

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("foo.properties");
// ...
Properties properties = new Properties();
properties.load(input);

Hier foo.properties soll in eine der Wurzeln platziert werden, die von der Standard-Classpath eines Webapp abgedeckt sind, beispielsweise Webapp des /WEB-INF/lib und /WEB-INF/classes, Server /lib oder JDK / JRE /lib. Wenn die propertiesfile Webapp-spezifisch ist, ist am besten, es in /WEB-INF/classes zu platzieren. Wenn Sie ein Standard-WAR-Projekt in einer IDE zu entwickeln, legen Sie es in src Ordner (Quellordner des Projekts). Wenn Sie ein Maven-Projekt verwenden, legen Sie es in /main/resources Ordner.

Sie können alternativ auch außerhalb des Standard-Classpath setzen irgendwo und fügen Sie den Weg zu dem Classpath des appserver. In zum Beispiel Tomcat Sie es als shared.loader Eigenschaft Tomcat/conf/catalina.properties konfigurieren können.

Wenn Sie die foo.properties es in einer Java-Paketstruktur wie com.example platziert haben, dann müssen Sie es laden, wie unter

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("com/example/foo.properties");
// ...

Beachten Sie, dass dieser Pfad eines Kontextes Class Loader nicht mit einem / beginnen soll. Nur wenn Sie einen „relativen“ Class-Loader wie SomeClass.class.getClassLoader() verwenden, dann müssen Sie in der Tat mit einem / starten.

ClassLoader classLoader = getClass().getClassLoader();
InputStream input = classLoader.getResourceAsStream("/com/example/foo.properties");
// ...

Allerdings hängt die Sichtbarkeit der Eigenschaften-Datei dann auf den Klassenlader in Frage. Es ist nur sichtbar für den gleichen Klassenlader als das, die die Klasse geladen. Also, wenn die Klasse geladen wird, beispielsweise durch Server gemeinsame Klassenlader statt Webapp Classloader und die Eigenschaften Datei sich in Webapp selbst, dann ist es unsichtbar. Der Kontext Class Loader ist Ihre sicherste Wette, so dass Sie die Eigenschaften Datei „überall“ platzieren können in dem Classpath und / oder Sie beabsichtigen, auf einen Server bereitgestellte einen von der Webapp zu können, außer Kraft zu setzen.


2. Legen Sie es in webcontent

Damit Sie es von ServletContext#getResourceAsStream() mit einem webcontent-relativen Pfad:

InputStream input = getServletContext().getResourceAsStream("/WEB-INF/foo.properties");
// ...

Beachten Sie, dass ich unter Beweis gestellt haben, die Datei in /WEB-INF Ordner zu platzieren, sonst wäre es von jedem Web-Browser Öffentlichkeit zugänglich gewesen. Beachten Sie auch, dass der ServletContext in jeder HttpServlet Klasse ist nur erreichbar durch die ererbten GenericServlet#getServletContext() und in Filter von FilterConfig#getServletContext() . Falls Sie sich in einer Servlet-Klasse nicht, es ist in der Regel nur injizierbare über @Inject.


3. Legen Sie es in der lokalen Festplatte Dateisystem

Damit Sie es die übliche Art und Weise java.io mit einem absoluten lokalen Festplatte Dateisystempfad können geladen werden:

InputStream input = new FileInputStream("/absolute/path/to/foo.properties");
// ...

Beachten Sie die Bedeutung einen absoluten Pfad zu verwenden. Relative lokale Festplatte Dateisystempfade sind ein absoluter no-go in einer Java EE Web-Anwendung. Siehe auch die erste „Siehe auch“ Link unten.


Was soll ich wählen?

Nur wiegen die Vorteile / Nachteile in Ihre eigene Meinung Wartbarkeit.

Wenn die Eigenschaften von Dateien „statisch“ und muss nie während der Laufzeit zu ändern, dann könnte man sich im Krieg halten.

Wenn Sie lieber die Lage zu bearbeiten Eigenschaften Dateien von außerhalb der Web-Anwendung ohne die Notwendigkeit für den Wiederaufbau und dem Krieg jedes Mal erneut bereit, es dann außerhalb des Projektes in dem Classpath setzen (wennerforderlich Fügen Sie das Verzeichnis auf dem Classpath).

Wenn Sie auf Eigenschaften bearbeiten Dateien in der Lage bevorzugen programmatisch aus dem Inneren der Web-Anwendung Properties#store() Methode verwenden, sollten Sie es außerhalb der Web-Anwendung. Da die Properties#store() eine Writer erfordert, können Sie nicht ein Plattendateisystempfad gehen um mit. Dieser Weg kann wiederum an die Web-Anwendung als VM-Argument oder Systemeigenschaft übergeben werden. Als Vorsichtsmaßnahme nie Verwendung getRealPath() . Alle Änderungen in deploy Ordnern auf einem redeploy aus dem einfachen Grunde verloren gehen, dass die Änderungen nicht zurück in ursprünglicher WAR-Datei wiedergegeben werden.

Siehe auch:

Andere Tipps

Ein Wort der Warnung: Wenn Sie Konfigurationsdateien in Ihrem WEB-INF/classes Ordner abgelegt, und Ihre IDE, sagen Eclipse tut ein sauberes / neu zu erstellen, wird es Ihre conf Dateien nuke, wenn sie nicht in der Java-Quellverzeichnis waren. BalusC die große Antwort Anspielung auf die in Option 1, aber ich wollte Betonung hinzuzufügen.

ich die harte Tour gelernt, dass, wenn Sie „kopieren“ ein Webprojekt in Eclipse, es macht einen sauberen / rebuild aus beliebigen Quellordner. In meinem Fall hatte ich eine „verknüpfte Quelle dir“ aus unserer POJO Java-Bibliothek hinzugefügt, wäre es für die WEB-INF/classes Ordner kompiliert. Doing einen sauberen / rebuild verursachte in diesem Projekt (nicht das Web-App-Projekt) das gleiche Problem.

Ich dachte an meine confs im POJO src Ordnern setzen, aber diese confs sind alle für 3rd-Party-Libs (wie Quarz oder UrlRewrite), die im WEB-INF/lib Ordner befinden, so dass kein Sinn. Ich plane, zu testen es in dem Web-Projekten „src“ -Ordner setzen, wenn ich, um es herum, aber der Ordner ist derzeit leer und conf-Dateien, die in es unelegant scheint.

Also ich Abstimmung für die Umsetzung conf Dateien in WEB-INF/commonConfFolder/filename.properties, weiter zu den Klassen-Ordner, die Balus Option 2

Ex: In Web.xml die Tag-Datei

<context-param>
        <param-name>chatpropertyfile</param-name>
        <!--  Name of the chat properties file. It contains the name and description                   of rooms.-->     
        <param-value>chat.properties</param-value>
    </context-param>

Und chat.properties können Sie Ihre Eigenschaften wie diese

erklären

Beispiel:

Jsp = Discussion about JSP can be made here.
Java = Talk about java and related technologies like J2EE.
ASP = Discuss about Active Server Pages related technologies like VBScript and JScript etc.
Web_Designing = Any discussion related to HTML, JavaScript, DHTML etc.
StartUp = Startup chat room. Chatter is added to this after he logs in.

Es muss nur in dem Classpath sein (auch bekannt als sicher, es endet unter / WEB-INF / classes in der .war als Teil des Build).

Sie können Sie mit Ihrem Quellordner so, wenn Sie bauen, werden diese Dateien automatisch in das Verzeichnis Klassen kopiert.

Anstelle der Verwendung von Eigenschaftendatei, die Verwendung von XML-Datei.

Wenn die Daten zu klein ist, können Sie auch web.xml für den Zugriff auf die Eigenschaften verwenden können.

Bitte beachten Sie, dass jede dieser Ansatz App Server-Neustart erforderlich für Änderungen berücksichtigt werden.

Angenommen, Ihr Code sucht die Datei etwa app.properties. Kopieren Sie diese Datei in einem beliebigen Verzeichnis und stell 'das dir zu Classpath, durch eine setenv.sh im Binärverezichnis von Kater zu schaffen.

In Ihrem setenv.sh von Kater (wenn diese Datei nicht existiert, erstellen, wird tomcat diese setenv.sh Datei laden. #!/bin/sh CLASSPATH="$CLASSPATH:/home/user/config_my_prod/"

Sie sollten nicht Ihre Eigenschaften Dateien in ./webapps//WEB-INF/classes/app.properties

Tomcat Klassenlader die mit dem aus WEB-INF überschreiben / classes /

Ein gut lesen: https://tomcat.apache.org/tomcat-8.0- doc / Klasse-loader-HOWTO.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top