2017-05-30 8 views
0

私の春のブートアプリケーション(バージョン1.5.1.RELEASE)では、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> 

したがってローダはcommons.xmlリソースをロードするための新しいURLを構築し、このexeceptionがスローされます。

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> 

あなたはGradleのを使用している場合、それは次のようになります。

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

のlibがで展開さをしかし、org.springframework.boot.loader.jar.JarURLConnectionはリソースをロードするために使用されるため、相対パスのためにFileNotFoundExceptionが発生して失敗します。 – Jcs

+0

それは驚くべきことです。 jarファイルは、fat jarから抽出されると、 'file:' URLを持つ必要があります。サードパーティライブラリへの変更のようなサウンドが必要になります。この問題がSpring Bootに固有なものではないように、Maven Shadeプラグインを使ってuber jarファイルを作成すると失敗することにも注意してください。 –

+0

jarがfat jarから抽出されたとしても(jarがtmpディレクトリに抽出されたことを確認した)、リソースにはまだ "jar:file" URLがあり、相対パスをサポートしないカスタムSpring URLHandlerが使用されます。 – Jcs

関連する問題