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