【问题标题】:How to access a resource from a java library packed into its own .jar如何从打包到自己的 .jar 中的 java 库中访问资源
【发布时间】:2017-12-10 15:43:27
【问题描述】:

我有一个库项目,其中包含一些我想加载和使用的资源。 我将在另一个项目中使用这个库,所以我必须将资源打包到 .jar 中。这是如何实现的:

<resources>
    <resource>
        <directory>src/main/resources</directory>
    </resource>
</resources>

在尝试检索文件时出现问题,我这样做了:

String resourceName = "myTemplateResource.json";
URL url = MyClass.class.getClassLoader().getResource(resourceName);

url 被分配了一个null 值。它发生在库的测试和依赖项目中。有什么遗漏的提示吗?

也使用

进行了测试
MyClass.class.getResource("/myTemplateResourceName.json");

MyClass.class.getClassLoader().getResource("src/main/resources/myTemplateResource.json");

结果相同。

【问题讨论】:

  • 也测试了同样的结果
  • It happens in the library's tests - 你的意思是项目本身找不到它自己的资源?你确定你把那个文件放在src/main/resources 中并使用那个确切的名称吗?它对我有用(第二种方式),我不知道为什么它不会(在 pom 中有 resources 元素,没有它,这里没有必要)
  • 不要猜测,而是检查您的 .jar 文件。您可以在任何 IDE 的“文件”视图中执行此操作,也可以使用 jar command line tool,或者可以将 .jar 文件复制到新文件,将其扩展名更改为 .zip,然后使用任何 zip 工具(从 . jar 文件实际上只是一个带有特殊清单条目的 zip 文件)。

标签: java file maven jar


【解决方案1】:

使用getResourceAsStream()方法从.jar文件中加载资源如下:

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream inputStream = classLoader.getResourceAsStream(locaiton);

例如:如果文件“myTemplateResourceName.json”直接位于资源文件夹中,则仅使用文件名。如果在路径前添加斜杠 (/) 是错误的。

InputStream inputStream = classLoader.getResourceAsStream("myTemplateResourceName.json");

注意:您必须将资源文件放在用于创建jar 文件。

【讨论】:

    【解决方案2】:

    文件名有问题,我无法找到。重命名文件,现在没问题。

    回答我的问题:

    首先将资源添加到 .pom 文件上的 jar 中。

    <resources>
        <resource>
            <directory>src/main/resources</directory>
        </resource>
    </resources>
    

    然后访问您的文件。

    URL url = MyClass.class.getClassLoader().getResource(resourceName);
    

    从那里您可以获得InputStream。看起来很简单。

    【讨论】:

      猜你喜欢
      • 2014-06-02
      • 2013-09-23
      • 2012-02-21
      • 2017-01-18
      • 1970-01-01
      • 2012-04-27
      • 2015-06-07
      • 2016-12-29
      相关资源
      最近更新 更多