2017-05-30 186 views
0

在我的spring啓動應用程序(版本1.5.1.RELEASE)中,我使用第三方庫加載存儲在jar文件中的資源。我創建了一個胖jar來運行這個應用程序。使用相對路徑加載資源

在圖書館有資源的這種層次結構,看起來像這樣:

com/third/party/package/resources/ 
\ 
\- v1 
| \ spec_v1.xml 
\- v2 
| \ spec_v2.xml 
\- v3 
| \ spec_v3.xml 
| 
\- commons.xml 

當我使用的庫我執行那種代碼

Resource res = com.third.party.ResourceLoader.load("v1"); 

的V1/spec_v1.xml資源文件被加載並通過ResourceLoader類檢查spec_v1.xml的內容,以確定是否有其他還有一些其他的依賴性來加載。在這種情況下,XML文件中包含論文行:

<imports> 
    <import>../commons.xml</import> 
    <!-- other imports --> 
<imports> 

因此裝載機建立了一個新的URL加載commons.xml資源,此異常被拋出:

com.third.party.ResourceInitializationException: Import failed. Could not read from URL jar:file:/my_.fat_jarjar!/BOOT-INF/lib/my-dependency-1.2.2.jar!/com/third/party/resources/v1/../commons.xml. 

根據that ticket似乎是一個功能,而不是一個錯誤。但我不能改變這個庫,並試圖與春天開機使用它之前完美。

我如何能變通方法,限制任何想法?

回答

1

對於來自脂肪罐子中運行時,使那些不是真實的假設庫,你可以configure Spring Boot's launcher to unpack the library's jar from the executable archive on launch

如果你使用Maven的,這將是這個樣子:如果你使用的搖籃

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-maven-plugin</artifactId> 
      <configuration> 
       <requiresUnpack> 
        <dependency> 
         <groupId>com.third.party</groupId> 
         <artifactId>example</artifactId> 
        </dependency> 
       </requiresUnpack> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

,它會是這個樣子:

springBoot { 
    requiresUnpack = ['com.third.party:example'] 
} 
+0

的LIB在解壓運行時,但是org.springframework.boot.loader.jar.JarURLConnection仍然用於加載資源,因此由於相對路徑而導致FileNotFoundException失敗。 – Jcs

+0

令人驚訝。一旦從fat jar中提取出來,jar應該有一個'file:'URL。聽起來像是對第三方庫的更改將是必需的。請注意,我相信,如果你使用Maven的陰影插件創建一個超級罐子所以這個問題是不特定於春季啓動也將失敗。 –

+0

即使jar是從fat jar中提取的(我確認jar被解壓到tmp目錄中),資源仍然有一個「jar:file」URL,並且使用了不支持相對路徑的自定義Spring URLHandler。 – Jcs