【问题标题】:how to find a local resource from dependent jar?如何从依赖 jar 中查找本地资源?
【发布时间】:2016-10-21 13:29:57
【问题描述】:

我写了一个打包到1.jar的代码

使用此代码:

    return isProd? "/etc/waze/automation/devices.json":
            DeviceRepositoryFromJsonFile.class.getClassLoader().getResource("devices.json").getPath().toString();

devices.json 在这里:

我有另一个项目依赖于1.jar

但是 classLoader 没有找到本地的 devices.json 文件,而是找到了一个装在 jar 中的文件

无论如何它显示该文件不存在。

我该如何解决这个问题?无论如何只使用绝对路径?

【问题讨论】:

  • 本地 devices.json 在哪里?我宁愿建议您将其放置在相对于类路径的位置,以便可以从类加载器的某个位置找到它。
  • 我已添加到我的位置。你能举个例子说明你的建议吗?

标签: java file jar classloader


【解决方案1】:

它不会直接回答您的问题,但它可能会更快地解决您的问题。

据我所知,您尝试检测 json 文件的绝对路径并将其传递给另一个方法,以便可以处理此文件。相反,它可以做得更简单:

public byte[] getDevicesJsonBytes() {
    return isProd
        ? IOUtils.toByteArray(ABSOLUTE_PATH_TO_PROD_FILE)
        : IOUtils.toByteArray(DeviceRepositoryFromJsonFile.class.getResourceAsStream(RESOURCE_CLASSPATH);
}

读取类路径资源的常用方法是在classclassLoader 实例上使用getResourceAsStream。此外,许多框架都有自己的资源抽象,但我想你现在不需要它们。

【讨论】:

    【解决方案2】:

    如果如您的屏幕截图所示,devices.json 位于 src/main/resources 中并且包已成功将其视为包路径并放入 jar 文件根目录中,那么您可以通过以下方式找到该文件:

    DeviceRepositoryFromJsonFile.class.getResource("/devices.json");
    

    注意“/”斜杠很重要,表示从类路径的根目录开始搜索。

    【讨论】:

      猜你喜欢
      • 2016-06-20
      • 1970-01-01
      • 1970-01-01
      • 2015-02-19
      • 2014-06-05
      • 2021-09-08
      • 1970-01-01
      • 2019-02-04
      • 1970-01-01
      相关资源
      最近更新 更多