【问题标题】:How to access Maven resources in JAR file? [duplicate]如何访问 JAR 文件中的 Maven 资源? [复制]
【发布时间】:2016-12-03 02:28:46
【问题描述】:

我有一个使用 Maven 构建的 Java 应用程序。我有一个资源文件夹com/pkg/resources/...,我需要从中访问文件。例如directory.txt。我一直在查看各种教程和其他 SO 答案,但似乎没有一个对我有用。现在我有:

ClassLoader classLoader = getClass.getClassLoader();
File file = new File(classLoader.getResource("/directory.txt");

当我输出 f.length 时,我得到 0 字节的结果。我也试过:

InputStream is = (this.getClass().getClassLoader().getResourceAsStream("/directory.txt"));
try{
    File file = File.createTempFile("dir", ".txt");
    Files.copy(is, file.toPath());
} catch (IOException e) {
    e.printStackTrace();
}

但该代码也不起作用。我以前没有使用过从 JAR 访问文件。关于可能出了什么问题的任何想法?

【问题讨论】:

    标签: java maven


    【解决方案1】:

    首先,使用“src/main/resources”文件夹,例如在资源中可以有一个文件名为:dummy.txt

    完整路径应该是:src/main/resources/dummy.txt

    在某些课程中,您可以阅读 dummy.txt 如下:

    String dummy = new String(IOUtils.toByteArray(this.getClass().getClassLoader().getResourceAsStream("/dummy.txt")));
    

    另外,如果你想在其中有文件夹,你可以拥有它。例如:

    src/main/resources/com/pkg/resources/dummy.txt

    String dummy = new String(IOUtils.toByteArray(this.getClass().getClassLoader().getResourceAsStream("/com/pkg/resources/dummy.txt")));
    

    考虑到在这个例子中我们没有对 pom.xml 中的类路径信息做任何事情

    注意:IOUtils 来自 commons-io,例如:

    <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId> 
                <version>2.4</version>
    </dependency>
    

    【讨论】:

      【解决方案2】:

      如果 maven 没有在您的 jar 中包含资源文件夹,您可以使用以下代码将资源文件夹包含在 jar 中。默认情况下,Maven 搜索 src/main/java/resources 中的资源文件夹,如果您的资源不在该路径中,则 Maven 不包含在类路径中。下面是在类路径中明确包含资源文件夹的代码。添加你的 pom.xml

      <build>
          ....
          <resources>
              <resource>
                  <directory>path-of-resource-folder</directory>
              </resource>
          </resources>
          ....
      </build>
      

      【讨论】:

        【解决方案3】:

        资源进入src/main/resources/my/package/whatever。一旦它们是它们,Maven 会将它们包含在输出 jar 中,您可以从类路径中引用它们。我通常使用番石榴。如果foo.bar.baz.MyClass有对应的文件foo/bar/baz/somefile.txt,我会写。

         URL url = Resources.getResource("somefile.txt", MyClass.class); 
         ByteSource source = Resources.asByteSource(url);
         try (InputStream is = source.openSource()) {
            // consume contents
         }
        

        【讨论】:

        • 我该怎么做?在我尝试 file = new File(getClass().getResource("/directory.txt").getPath()) 之前,但这也没有用
        • 什么是资源类?
        • 我写的番石榴的一部分。
        猜你喜欢
        • 2011-01-24
        • 2015-04-21
        • 2012-04-26
        • 1970-01-01
        • 2013-07-20
        • 2019-05-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多