使用相对路径加载资源

时间:2017-05-30 12:33:59

标签: spring spring-boot

在我的春季启动应用程序(版本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一起使用之前它完美地工作。

关于如何解决这个限制的任何想法?

1 个答案:

答案 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']
}