2017-06-20 174 views
2

我使用Netbeans 8.2開發Spring應用程序。我遇到麻煩的這個特定的應用程序是一個Spring Boot 1.5.3應用程序。我有一個spring xml文件和一個application.properties,它們保存在根項目目錄下的/ config中。Spring Boot將文件從命令行執行添加到類路徑

我通過@ImportResource註釋和像@ImportResource(value="${config.xmlfile}")這樣的值屬性將彈簧xml文件傳遞到我的項目。

當我點擊NetBeans中的「運行項目」按鈕時,我的Spring應用程序啓動並正確找到我的/ config文件夾中的application.properties文件。但是,對該文件夾中其他文件的任何類路徑引用都將丟失。例如,將config.xml文件設置爲classpath:config/file.xmlclasspath:file.xml都無法找到該文件,但file:config/file.xml工作。

同樣,在命令行中運行時,我有以下爲我的結構:

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

我使用spring-boot-maven-plugin使罐子如下:

<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> 

和我的APP- run.sh腳本執行以下操作:

exec /bin/java -cp :.:../config/*:../app-exec.jar 
-Dlogging.config=../config/log4j2.xml 
-Dspring.config.location=../config/application.properties 
-jar ../app-exec.jar 

where/bin/java repres發送我安裝了java的位置。在-cp中設置的類路徑在這裏似乎不起作用。同樣通過IDE中運行時,設置config.xml文件中的類路徑:配置/ file.xml或類路徑:file.xml都無法找到該文件,但文件:../配置/ file.xml作品。

我希望能夠將classpath設置在IDE和命令行,這樣我可以在Spring中使用的類路徑參照使事情更容易訪問文件。我不想將它們都放在src/main/resources中,並將它們打包在jar中,因爲我需要在打包和部署後對它們進行編輯。

有沒有人有任何想法或有幫助的提示?提前致謝!

回答

4

一些經過研究,並感謝@ TuyenNguyen的有用的答案,我能夠得到以下工作:

我說,這樣,當我在命令行中運行以下命令以我的春天啓動了Maven插件它使用PropertiesLauncher代替JarLauncher

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

更多有關PropertiesLauncher選項見herehere。它允許你設置類路徑等等。 請參閱here,herehere,我找到了解決此問題的答案。使用格式ZIP可以使用PropertiesLauncher

從那裏,我可以使用這個命令來啓動該應用程序,因爲我打算:

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

另一個重要提示:指定-Dloader.path時請務必使用逗號分隔值,只有目錄和文件如here所述。此外,請務必在指定-jar jar之前放置-D參數,否則它們將不會被設置。

如果有人有任何建議或修改,以進一步改善這個答案或原來的問題,以幫助更多的用戶,請讓我知道或編輯自己!

+1

感謝您的詳細註釋。它在命令中更改了-Dloader.path的位置之後起作用。 – Silentbang

+1

@Silentbang很高興這個答案幫了我一些忙,弄明白了。 Spring的這個主題領域的文檔很不錯,但在某些地方破壞了慣例,比如在傳遞給'-Dloader.path'時如何指定路徑 – wrslatz

1

如果你不把你的文件src/main/resources,那麼你可以把它放在任何你想要的文件夾中,但你必須設置你的文件夾作爲一個資源文件夾中。因爲classpath始終指向資源文件夾。一旦你將你的文件夾作爲資源文件夾,它將被打包到jar中。如果你要編輯的資源文件,只是用7 zip tool打開你的罐子 - >編輯文件 - >保存 - >將更新您的罐子變化。

另一種解決方法是創建一個文件夾,將所有需要編輯但未打包的文件放入該文件夾中,然後在每次運行時手動將該類路徑設置爲該文件夾,但是您上面設置的方式不正確,請嘗試this解決方案設置classpath正確的方式。

+0

謝謝,您提供的第二個選項看起來像是合適的解決方案。但是,鑑於這是一個重新包裝的Spring Boot應用程序,我沒有那麼容易訪問jar的內部類。我的main()類已經被重新打包,所以我不能像第二個例子那樣訪問它。我將查看是否可以使用[PropertiesLauncher](如此處所述)(https://docs.spring.io/spring-boot/docs/current/reference/html/executable-jar.html#executable) -jar-property-launcher-features) – wrslatz