如何在JAR文件中访问Maven资源?

时间:2016-07-28 15:29:29

标签: java maven

我有一个用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访问文件。关于可能出现什么问题的任何想法?

3 个答案:

答案 0 :(得分:1)

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

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

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

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

此外,如果你想在那里有文件夹,你可以拥有它。例如:

的src /主/资源/ COM /包装/资源/ 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>

答案 1 :(得分:0)

资源进入src/main/resources/my/package/whatever。一旦它们成为它们,Maven会将它们包含在输出jar中,您可以从classpath引用它们。我通常使用番石榴。如果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
 }

答案 2 :(得分:0)

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

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