2017-06-20 6 views
2

Ich verwende Netbeans 8.2, um Spring-Anwendungen zu entwickeln. Diese spezielle App, mit der ich Probleme habe, ist eine Spring Boot 1.5.3 App. Ich habe eine Spring-XML-Datei und eine application.properties, die ich in/config im Stammverzeichnis des Projekts aufbewahre.Spring Boot fügen Dateien zu Klassenpfad von der Befehlszeilenausführung

Ich übermittle die Spring-XML-Datei an mein Projekt über die @ImportResource Annotation und eine Werteigenschaft wie @ImportResource(value="${config.xmlfile}").

Wenn ich in Netbeans auf die Schaltfläche "Projekt ausführen" klicke, wird meine Spring App gestartet und die Datei application.properties im Ordner/config korrekt gefunden. Alle Klassenpfadverweise auf andere Dateien in diesem Ordner gehen jedoch verloren. Wenn Sie beispielsweise die Datei config.xml auf classpath:config/file.xml oder classpath:file.xml festlegen, kann die Datei nicht gefunden werden, aber file:config/file.xml funktioniert.

Wenn in ähnlicher Weise von der Kommandozeile ausgeführt habe ich folgendes als meine Struktur:

app/ 
|-- bin 
| `-- app-run.sh 
|-- config 
| |-- application.properties 
| |-- log4j2.xml 
| |-- file.xml 
`-- app-exec.jar 

Ich bin die spring-boot-maven-plugin mit dem Glas zu machen, 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 Skript führt die folgenden:

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 Repres Gibt den Ort an, an dem ich Java installiert habe. Der Klassenpfad in -cp scheint hier nicht zu funktionieren. Ähnlich wie beim Ausführen der IDE kann die Datei config.xml nicht in classpath: config/file.xml oder classpath: file.xml gefunden werden, aber die Datei: ../ config/file.xml funktioniert.

Ich würde gerne in der Lage sein, den Klassenpfad sowohl in der IDE und von der Befehlszeile aus zu setzen, so dass ich im Frühling mit Klassenpfad Verweis auf Dateien zugreifen kann, um Dinge einfacher zu machen. Ich möchte sie nicht alle in src/main/resources setzen und sie in das Glas verpackt haben, wie ich diese nach dem Verpacken und der Bereitstellung bearbeiten muss.

Hat jemand irgendwelche Ideen oder hilfreiche Hinweise? Danke im Voraus!

Antwort

4

Nach einiger Forschung, und dank @ TuyenNguyen die hilfreiche Antwort konnte ich die folgende Funktion erhalten:

Ich habe folgendes meine Feder-boot-Maven-Plugin, so dass, wenn ich von der Kommandozeile es nutzt die PropertiesLauncher anstelle des JarLauncher:

<configuration> 
    <mainClass>${mainClass}</mainClass> 
    <layout>ZIP</layout> //THIS IS THE IMPORTANT PART 
</configuration> 

Siehe here und here für mehr über die PropertiesLauncher Optionen.Sie können unter anderem den Klassenpfad festlegen. Siehe here, here und here für wo ich die Antwort auf dieses Problem gefunden habe. Im Format ZIP wird PropertiesLauncher verwendet.

Von dort konnte ich diesen Befehl verwenden, um die Anwendung zu starten, wie ich gedacht:

java -Dloader.path=../config,../ -Dloader.config.location=classpath:application.properties -jar ../app-exec.jar 

Noch ein wichtiger Hinweis: Wenn die -Dloader.path Angabe stellen Sie sicher, durch Komma getrennte Werte und nur Verzeichnisse und Dateien zu verwenden, , wie beschrieben here. Stellen Sie außerdem sicher, dass Sie die Argumente -D-vor der Angabe von -jar jar setzen, sonst werden sie nicht gesetzt.

Wenn jemand Vorschläge oder Änderungen hat, um diese Antwort oder die ursprüngliche Frage weiter zu verbessern, um weitere Benutzer zu unterstützen, lassen Sie es mich wissen oder nehmen Sie die Änderungen selbst vor!

+1

Danke für die detaillierten Notizen. Es funktioniert, nachdem ich den Speicherort von -Downloader.path in dem Befehl geändert habe. – Silentbang

+1

@Silentbang froh, dass diese Antwort geholfen hat, nahm mich ein bisschen, um die Dinge herauszufinden. Die Dokumentation zu diesem Themenbereich von Spring war anständig, aber es kam an einigen Stellen zu Konventionen, wie man den Pfad bei der Übergabe an '-Dloader.path' festlegt – wrslatz

1

Wenn Sie Ihre Dateien nicht in src/main/resources setzen, können Sie sie in einen beliebigen Ordner stellen, ABER Sie müssen Ihren Ordner als Ressourcenordner festlegen. Weil classpath immer auf Ressourcenordner zeigt. Sobald Sie Ihren Ordner als Ressourcenordner erstellt haben, wird er in das Jar gepackt. Wenn Sie Ihre Ressourcendatei bearbeiten möchten, verwenden Sie einfach 7 zip tool, um Ihr jar zu öffnen -> Dateien bearbeiten -> speichern -> es wird Ihre Änderung im jar aktualisieren.

Eine andere Lösung ist ein Ordner erstellen, legen Sie alle Dateien, die Sie bearbeiten möchten und nicht verpackt, dann legen Sie Classpath bei jeder Ausführung manuell auf diesen Ordner, aber die oben beschriebene Vorgehensweise ist nicht korrekt, versuchen Sie this Lösung für Klassenpfad richtig einstellen.

+0

danke, die zweite Option, die Sie zur Verfügung gestellt, sieht aus wie die geeignete Lösung. Da es sich jedoch um eine neu gepackte Spring-Boot-App handelt, habe ich keinen so leichten Zugriff auf die inneren Klassen des Jars. Meine Klasse mit main() wurde neu gepackt, so dass ich nicht darauf zugreifen kann, wie in diesem zweiten Beispiel. Ich werde nachsehen und sehen, ob ich einen 'PropertiesLauncher' wie hier dokumentiert verwenden kann (https://docs.spring.io/spring-boot/docs/current/reference/html/executable-jar.html#executable -jar-property-launcher-features) – wrslatz

Verwandte Themen