2016-03-25 8 views
0

Obwohl ich seit einiger Zeit in Java arbeite, gibt es viele kleine Dinge, die ich ignoriert habe, die manchmal Engpaß in der Produktivität geworden sind. Ich habe Schwierigkeiten, dies zu verstehen:Notwendigkeit, Klassenpfad in Ressourcenstandort und Variablenwertsatz zu verstehen

Dies ist eine der bean.xml, die in der endgültigen .war-Datei (in einer Webanwendung, mit Spring-Framework gebaut) platziert wird.

<context:property-placeholder 
    location="classpath:/${deploy.env}/com.example.config/db.properties" 
    ignore-resource-not-found="false" /> 

Ich habe folgende Zweifel:

1) Zu dem Zeitpunkt, den Code zu bauen, habe ich so für den Wert des deploy.env

vorbei
mvn clean install -Ddeploy.env=local 

ich die MVN in Debug lief Modus und könnte dies auf lokal festgelegt sehen. Nun, die Sache ist, in der .war, die generiert wird, ist es immer noch $ {deploy.env} (siehe oben). Wird das im finalen .war nicht ersetzt? Wenn nicht, wie gehen wir dann den Wert durch, den wir setzen wollen?

2) Was bedeutet "classpath:/${deploy.env}/com.example.config/db.properties"? Wer legt den Wert von Klassenpfad fest? Kann classpath auch den Speicherort von Ressourcendateien bereitstellen?

Unter der Annahme, deploy.set -> lokal, so würde dies erhalten übersetzt:

classpath:"/local/com.example.config/db.properties" 

So bedeutet das db.properties gegenwärtig sein würde: /local/com.example.config/db.properties

Irgendwelche Eingaben, dies zu verstehen würde eine große Hilfe sein.

+1

würde ich die Tags ersetzen Sie mit "Maven" – LinuxDisciple

+0

Vielen Dank für Ihre wertvollen Vorschlag haben, getan. – CuriousMind

Antwort

1

deploy.env ist entweder Umgebungsvariable oder Systemeigenschaft, die der JVM zur Laufzeit zur Verfügung steht.

Die classpath:/${deploy.env}/com.example.config/db.properties wird zur Laufzeit aufgelöst, wenn Ihr Krieg im Container ausgeführt wird.

Set deploy.env=whatever in der Shell von wo Sie den Tomcat starten oder in der Umgebung des Benutzers, der den Tomcat startet.

mvn clean install -Ddeploy.env=local Hier ist die Systemeigenschaft deploy.env zum Zeitpunkt der Erstellung verfügbar. Dies ersetzt nicht den Wert Ihrer Federkonfiguration.

classpath Hier finden Sie all Ihre Klassen und Bibliotheken, die im Krieg gebündelt sind, zusammen mit den Tomcat-Bibliotheken. Der Federeigenschaftskonfigurierer sucht nach der Datei db.properties im Klassenpfad am Ort, z. /local/com.example.config

Spring documentation to learn more Some explanation on my blog post

+0

Ich habe diese Anwendung in tomcat implementiert. Muss dies also von Tomcat bereitgestellt werden? – CuriousMind

+0

ja, aber Sie müssten den Wert übergeben, siehe aktualisierte Antwort –

+0

Also würde es für die Datei auf "absolute" Pfad oder den Pfad zu Classpath angefügt suchen? Das ist Pfad -> /local/com.example.config/ oder dieser Pfad relativ zum Pfad des Klassenpfads? – CuriousMind

1

Wie auf der Oracle-Website angegeben: Die CLASSPATH-Variable ist eine Möglichkeit, Anwendungen, einschließlich der JDK-Tools, mitzuteilen, wo nach Benutzerklassen gesucht werden soll.

Das classpath: bezieht sich speziell auf diesen Ort, egal, was es ist, so dass es beginnt, nach den Ressourcen zu suchen, die von Spring an diesem Ort definiert wurden, bis es die erste Übereinstimmung findet.

Auch wenn Sie das als eine Eigenschaft in Maven haben, kann der Wert mit dem richtigen Plug-in und der richtigen Konfiguration ersetzt werden; nicht sehr nützlich, wenn Sie ein Build wollen, das mit vielen Werten innerhalb dieser .properties Dateien für verschiedene Umgebungen verwendet werden kann. Sie können andere Präfixe wie file:, http:, usw. verwenden. Aber Sie wundern sich nur über classpath:.

+0

Vielen Dank für Ihre Antwort. Ich interessiere mich mehr für Classpath, da ich den Eindruck habe, dass der Classpath nur zum Auffinden von .class-Dateien verwendet wird. – CuriousMind

+1

Nicht in diesem Fall. Es ist nur der Ort, an dem Sie nach dem suchen, was Sie in Ihrer Spring-Konfiguration als "Ressource" definieren. –