在我的春季启动应用程序(版本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>
因此,加载器构建了一个新的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,它似乎是一个功能,而不是一个错误。但是我无法更改此库,并且在尝试将其与spring boot一起使用之前它完美地工作。
关于如何解决这个限制的任何想法?
答案 0 :(得分: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']
}