我有一个使用 SBT 构建的项目,它使用 one-jar 插件打包单个 jar。该项目在 src/main/resources/fixture 中包含一堆 json 文件,我曾经通过
new java.io.File(App.getClass.getResource("/fixture").getFile
不幸的是,这不再起作用,因为没有返回资源。我认为 one-jar 使用了一种特殊的类加载机制?解决这个问题的最佳方法是什么?
我有一个使用 SBT 构建的项目,它使用 one-jar 插件打包单个 jar。该项目在 src/main/resources/fixture 中包含一堆 json 文件,我曾经通过
new java.io.File(App.getClass.getResource("/fixture").getFile
不幸的是,这不再起作用,因为没有返回资源。我认为 one-jar 使用了一种特殊的类加载机制?解决这个问题的最佳方法是什么?
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
...
我认为 one-jar 使用了一种特殊的类加载机制?
是的,这一定是正确的,因为没有标准化的方法来加载打包到依赖 jar中的类,而依赖 jar 又被打包到您的应用程序 jar中。这通常是通过额外的类加载器技巧来实现的。
此处记录了使用 One-JAR 时加载资源。
我发现 Spring 的核心 PathMatchingResourcePatternResolver 可以做到这一点。它也可以根据模式查找文件。
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
resolver.getResources("classpath*:some/package/name/**/*.xml");