4

我有一个使用 SBT 构建的项目,它使用 one-jar 插件打包单个 jar。该项目在 src/main/resources/fixture 中包含一堆 json 文件,我曾经通过

new java.io.File(App.getClass.getResource("/fixture").getFile

不幸的是,这不再起作用,因为没有返回资源。我认为 one-jar 使用了一种特殊的类加载机制?解决这个问题的最佳方法是什么?

4

3 回答 3

2

one-jar 将您的资源打包main到输出 jar 中的目录下。在使用sbt的时候,我觉得最好自己配置资源的打包。通常,我会做这样的事情:

unmanagedResources in Compile := Seq() //we don't want to add resources from "src/main/resources" to inner jar

mappings in oneJar += (file("src/main/resources/filename.json"),"path/to/resource/in/onejar")

所以你的资源filename.json将被打包到你想要的地方,放在一个罐子里。当您在运行时需要资源时,只需使用:

Thread.currentThread.getContextClassLoader.getResourceAsStream("path/to/your/resource")

看看这篇文章。它可能有助于如何将所有资源打包src/main/resources...

于 2014-04-08T14:26:51.053 回答
2

我认为 one-jar 使用了一种特殊的类加载机制?

是的,这一定是正确的,因为没有标准化的方法来加载打包到依赖 jar中的类,而依赖 jar 又被打包到您的应用程序 jar中。这通常是通过额外的类加载器技巧来实现的。

此处记录了使用 One-JAR 时加载资源。

于 2013-12-17T14:31:56.620 回答
0

我发现 Spring 的核心 PathMatchingResourcePatternResolver 可以做到这一点。它也可以根据模式查找文件。

PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
resolver.getResources("classpath*:some/package/name/**/*.xml");
于 2015-02-25T05:48:57.800 回答