一个jar内的classpath资源通过sbt打包

时间:2013-12-17 13:33:21

标签: jar classloader sbt onejar

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

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

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

3 个答案:

答案 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");