【问题标题】:Can't load resources file from jar无法从 jar 加载资源文件
【发布时间】:2014-10-11 08:16:57
【问题描述】:

我正在使用存储在src/test/resources/config.json 中的配置 JSON 文件。

我是这样理解的:

String configFile = this.getClass().getResources("config.json").getPath();

我有getPath()方法,因为我需要它的String值,然后检查文件是否存在,最后解析它。

在 Eclipse IDE 中一切正常,因为我解析文件 /bin/config/config.json,但是当我创建 JAR 文件时,路径是 program.jar!/config/config.json 并且函数 !Files.exists() 返回 false。

我该如何解决这个问题?

【问题讨论】:

    标签: java jar resources


    【解决方案1】:

    当您使用资源加载器时,您应该打开文件的 InputStream,而不是通过文件的路径引用文件。

    而不是.getResources("config.json").getPath();

    尝试使用this.getClass().getResourceAsStream("config.json"); 如果返回的流为空,则资源不存在。

    这样,即使资源被打包到一个 jar 中,类加载器也总是会返回正确的东西。

    【讨论】:

      【解决方案2】:

      您不能使用File-class 访问 jar 中的路径,因为它不是本机文件系统资源,并且从 jar 读取比读取普通文件(解包等)需要更多的内容。

      因此,要从 jar 加载文件,最好的方法是使用类加载器:它知道如何搜索 jar 文件、如何解压它们等等。

      所以要阅读你最好使用的文件

      InputStream configStream = this.getClass().getResourceAsStream("config.json");
      

      configStreamnull 时,您将知道该文件不存在于您的类路径中。

      现在唯一缺少的是路径的String-表示,但我想不出你真正需要它的用例 - 如果你真的真的需要它,你可以使用你的旧获取途径。

      PS:我也想不出为什么你必须在获得路径时检查文件是否存在 - 如果文件不存在 this.getClass().getResources("config.json").getPath(); 应该以 NullPointerException 失败!!

      【讨论】:

      • 谢谢,我试试。原因是我有两种可能如何加载配置文件。第一个来自资源(默认),第二个来自从命令行运行程序时用户定义的 json 文件路径(作为 args[0])。但是,如果我稍微更改代码,它就可以工作。我会看到的。
      【解决方案3】:

      我想如果你使用 mvn 来构建 jar

      您可以使用所有依赖项构建 jar。这将打包所需的依赖 jar 和文件。你可以阅读 http://maven.apache.org/plugins/maven-assembly-plugin/descriptor-refs.html

      在毕业典礼上 https://github.com/musketyr/gradle-fatjar-plugin

      【讨论】:

      • 我正在使用 Gradle,但我无法部署带有依赖项的 JAR 文件,FatJar 插件出了点问题。所以我在 Eclipse 中创建 JAR,但最后一个问题是资源。
      • 那么,你不应该解决 Fatjar 插件问题吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-16
      • 2014-09-10
      • 2015-05-03
      • 1970-01-01
      相关资源
      最近更新 更多