Spring Boot-Dateien hinzufügen zum Klassenpfad von der Ausführung über die Befehlszeile
Ich bin mit Netbeans 8.2 zu entwickeln, Spring-Anwendungen. Dieses spezielle app, mit dem ich bin Probleme ist eine Spring-Boot-1.5.3-app. Ich habe eine spring-xml-Datei und eine Anwendung.Eigenschaften, die ich halten in /config unter dem root-Verzeichnis der Projekte.
Bin ich vorbei an der spring-xml-Datei in mein Projekt über die @ImportResource
annotation und eine value-Eigenschaft, wie @ImportResource(value="${config.xmlfile}")
.
Wenn ich auf das "Projekt Ausführen" - button in Netbeans meine Feder-app startet und es richtig findet Anwendung.Eigenschaften Datei in meinem /config-Ordner. Jedoch keine classpath-Referenzen auf andere Dateien in diesem Ordner sind verloren. Zum Beispiel, die Einstellung der config.xml Datei classpath:config/file.xml
oder classpath:file.xml
beide nicht zu finden die Datei aber file:config/file.xml
funktioniert.
Ähnlich, beim ausführen von der Kommandozeile habe ich Folgendes als meine Struktur:
app/
|-- bin
| `-- app-run.sh
|-- config
| |-- application.properties
| |-- log4j2.xml
| |-- file.xml
`-- app-exec.jar
Ich bin mit der spring-boot-maven-plugin
um das Glas wie folgt:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring.boot.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<classifier>exec</classifier>
</configuration>
</execution>
</executions>
</plugin>
und meine app-run.sh script führt Folgendes aus:
exec /bin/java -cp :.:../config/*:../app-exec.jar
-Dlogging.config=../config/log4j2.xml
-Dspring.config.location=../config/application.properties
-jar ../app-exec.jar
wo /bin/java repräsentiert den Ort, wo ich java installiert haben. Die classpath-Einstellung der cp scheint nicht zu sein, hier zu arbeiten. Ähnlich wie bei der Ausführung über die IDE einstellen config.xml Datei classpath:config/file.xml oder classpath:file.xml beide scheitern, die Datei zu finden aber file:../config/file.xml funktioniert.
Ich würde gerne in der Lage sein, um die classpath sowohl in der IDE und von der Kommandozeile aus, so dass ich Zugriff auf die Dateien im Frühjahr mit classpath Referenz Dinge einfacher zu machen. Ich will NICHT, um Sie alle in src/main/resources
haben und Sie werden verpackt in das Glas, wie ich brauche, um diese zu Bearbeiten, nachdem die Verpackung und Bereitstellung.
Hat jemand irgendwelche Ideen oder hilfreiche Tipps? Vielen Dank im Voraus!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aktualisiert Antwort:
Können Sie die Praxis in meiner ursprünglichen Antwort, aber wir haben vor kurzem ließ dies für eine einfachere und umweltfreundlichere option, die mehr standard ("Java" Weg). Wir die änderung vorgenommen, weil wir brauchten, um dynamisch geladen, abhängige Bibliotheken zur Laufzeit nicht verfügbar waren zur compile-Zeit (die genaue version). In unserem Fall wollten wir von der Auslastung abhängig-Gläser nur aus separaten Ordner(s) und nicht aus einem ausführbaren jar. Wir landeten mit doppelten Abhängigkeiten in der ausführbaren jar-Dateien und in separaten Ordner(s), so dass wir beschlossen, drop die ausführbare jar-Datei-Eigenschaften-Launcher und stattdessen nur laden von Abhängigkeiten aus separaten Ordnern. Dies ist oft NICHT die beste option und bewertet werden sollten für Ihren Anwendungsfall. Ich bevorzuge das Lesen der standard-Java-classpath.
Ausführen, um eine Spring-Boot-app, ohne eine ausführbare jar-Datei, die wir verwendet Maven-Assembly zu setzen, die abhängigen jars in /libs Verzeichnis und ließ die spring-boot-maven-plugin. Die Schritte und einige code für dieses sind unter:
Fügen Sie den folgenden, um Ihre assembly-XML -
<dependencySets>
<dependencySet>
<outputDirectory>where you want the libs to go</outputDirectory>
<useProjectArtifact>whether you want to include the project
artifact here</useProjectArtifact>
</dependencySet>
</dependencySets>
Ausführen von code aus der main-Klasse und umfassen die abhängigen jar-Ordner(N) auf dem Klassenpfad. Verwenden Sie die standard-Klassenpfad-notation auf Ihrem OS und nicht der Brauch, unangenehm PropertiesLauncher loader Pfad-syntax
java -cp <standard-classpath> <main-class>
Ein Beispiel für einen tatsächlichen Anruf:
java -cp $CLASSPATH:./lib/*:./cfg/*:my-app.jar Application.class
In dieser Weise führen Sie die Spring-Boot-app über die standard-java-Ausführung Anruf, keine custom Federbelastung syntax. Sie müssen nur sicherstellen, dass alle Abhängigkeiten sind auf den Klassenpfad zur Laufzeit. Wir fanden diese viel leichter zu pflegen und dies der standard für alle unsere apps.
Original Antwort:
Nach einigen Recherchen und Dank @TuyenNguyen die hilfreiche Antwort ich war in der Lage, um die folgenden arbeiten:
Ich habe Folgendes in meiner spring-boot-maven-plugin, so dass, wenn ich von der Befehlszeile aus ausgeführt es nutzt die
PropertiesLauncher
statt derJarLauncher
:Sehen hier und hier, um mehr über die
PropertiesLauncher
Optionen. Es erlaubt das setzen des classpath, unter anderem.Sehen hier, hier, und hier für gefunden, wo ich die Antwort auf dieses problem. Mit ZIP-format macht die
PropertiesLauncher
verwendet werden.Von dort aus, ich war in der Lage, verwenden Sie diesen Befehl, um die Anwendung zu starten, als ich gedacht:
Ein weiterer wichtiger Hinweis: bei der Angabe der
-Dloader.path
stellen Sie sicher, dass Sie Komma-getrennte Werte, und es werden nur die Verzeichnisse und Dateien, wie beschrieben hier. Auch, sicher sein, um die -D args, bevor Sie-jar jar oder Sie werden nicht eingestellt.Wenn jemand irgendwelche Vorschläge oder änderungen zur weiteren Verbesserung dieser Antwort oder die ursprüngliche Frage, um zu helfen, zusätzliche Nutzer, bitte lassen Sie mich wissen, oder nehmen Sie die änderungen selbst!
-Dloader.path
Wenn Sie nicht legen Sie Ihre Dateien in
src/main/resources
dann können Sie legte es in einen beliebigen Ordner, den Sie wollen, ABER Sie müssen Ihre Ordner als Ordner Ressourcen. Daclasspath
ist immer auf Ressourcen-Ordner. Sobald Sie Ihre Ordner als eine Ressource-Ordner, es werden verpackt in das Glas. Wenn Sie möchten, Bearbeiten Sie die Ressourcendatei, nur mit 7-zip-tool öffnen Sie Ihr Glas -> edit files -> speichern -> es wird aktualisieren Sie Ihre änderung in das Glas.Andere Lösung ist, erstellen Sie einen Ordner, alle Dateien, die Sie Bearbeiten möchten, und nicht verpackt ist, dann ist set classpath manuell zu diesem Ordner jedes mal, wenn Sie laufen, aber der Weg, den Sie nicht korrekt ist, versuchen Sie diese Lösung für set classpath richtigen Weg.
PropertiesLauncher
dokumentiert hier