【问题标题】:Classpath resources inside one-jar packaged via sbt通过 sbt 打包的 one-jar 中的类路径资源
【发布时间】:2014-01-05 07:09:03
【问题描述】:

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

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

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

【问题讨论】:

    标签: jar classloader sbt onejar


    【解决方案1】:

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

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

    使用 One-JAR 时加载资源为documented here

    【讨论】:

    • 感谢您将我指向资源文档。我终于让它工作了。在 3 个可能的位置中,我的资源位于 main/main.jar 中。我的意图是使用 MainClass.getClass.getResource("/dirname") 将目录(文件)打包到 main.jar 中并迭代它的子项(文件)。那没有成功。但是,我能够使用 MainClass.getClass.getResourceAsStream("/dirname/filename.json") 加载该目录中每个文件的内容
    【解决方案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下的所有资源...

    【讨论】:

      【解决方案3】:

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

      PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
      resolver.getResources("classpath*:some/package/name/**/*.xml");
      

      【讨论】:

        猜你喜欢
        • 2015-08-01
        • 2010-12-26
        • 2014-10-08
        • 2013-04-21
        • 2013-04-18
        • 1970-01-01
        • 2016-11-02
        • 2020-09-02
        • 1970-01-01
        相关资源
        最近更新 更多