私の春のブートアプリケーション(バージョン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によると、それが思わ機能であり、バグではありません。しかし、私はこのライブラリを変更することはできませんし、それは春のブートでそれを使用しようとする前に完全に働いた。
この制限を回避するにはどうすればよいですか?
のlibがで展開さをしかし、org.springframework.boot.loader.jar.JarURLConnectionはリソースをロードするために使用されるため、相対パスのためにFileNotFoundExceptionが発生して失敗します。 – Jcs
それは驚くべきことです。 jarファイルは、fat jarから抽出されると、 'file:' URLを持つ必要があります。サードパーティライブラリへの変更のようなサウンドが必要になります。この問題がSpring Bootに固有なものではないように、Maven Shadeプラグインを使ってuber jarファイルを作成すると失敗することにも注意してください。 –
jarがfat jarから抽出されたとしても(jarがtmpディレクトリに抽出されたことを確認した)、リソースにはまだ "jar:file" URLがあり、相対パスをサポートしないカスタムSpring URLHandlerが使用されます。 – Jcs