在JAR文件中获取src文件夹之外的资源

时间:2018-01-29 15:07:28

标签: java eclipse file

我一直在寻找解决这个问题的几个小时,并找到了关于类似问题的多篇帖子,但我发现似乎没有做我正在尝试的事情。

我在res文件夹的同一级别有一个src文件夹,我用它来处理图片和文本文件等内容。我只需执行以下操作即可轻松地在Eclipse中吐出文本文件:

    FileInputStream fis = new FileInputStream("res/misc/foo.txt");
    BufferedReader br = new BufferedReader(new InputStreamReader(fis));

    String line;
    while((line = br.readLine()) != null) {
        System.out.println(line);
    }

但是,当我将其打包在可运行的JAR文件中时,问题就开始了。我发现多个线程指出了这一点:

Class.class.getResourceAsStream("/misc/foo.txt");

但是,这仅在资源与类位于同一source文件夹中时才有效。事实上,当我将res文件夹移动到src时,它可以找到资源,但这不是我想要组织项目的方式。

有没有办法让我错过,或者我应该更改我的文件夹结构?

4 个答案:

答案 0 :(得分:0)

你应该可以通过以下方式获得路径:

String path = <YourClassName>.class.getProtectionDomain().getCodeSource().getLocation().getPath();

然后进行快速测试以检查目录是否存在:

File folder = new File(path);
File[] dirList = folder.listFiles();

for (File list : dirList) {
    if (list.isDirectory()) {
        System.out.println("Directory " + list.getName());
    }
}

答案 1 :(得分:0)

您必须更改结构,例如make res也是一个源文件夹(您可以拥有多个源文件夹)。它不是关于源文件夹,它是关于将资源复制到构成生成的jar内容的同一个树中。

答案 2 :(得分:0)

就像nitind所说的那样:

将文件夹res创建为源文件夹(就像src一样)。将文件放在此处,然后就可以像访问src中的文件一样访问文件,即

FileInputStream fis = new FileInputStream("/misc/foo.txt");

在Eclipse中,您可以简单地创建一个新文件作为“源文件夹”。您也可以只复制scr文件夹并将其重命名为res

答案 3 :(得分:0)

使用Maven资源插件, 资源插件将文件从输入资源目录复制到输出目录。

<plugin>
    <artifactId>maven-resources-plugin</artifactId>
    <version>3.0.2</version>
    <configuration>
        ...
    </configuration>
</plugin>

假设我们想将资源文件从目录input-resources复制到目录output-resources,并且要排除所有以扩展名.png结尾的文件。

就像排除一样,您可以使用

包含文件

使用此配置可​​以满足以下要求:


<configuration>
    <outputDirectory>output-resources</outputDirectory>
    <resources>
        <resource>
            <directory>input-resources</directory>
            <excludes>
                <exclude>*.png</exclude>
            </excludes>
            <filtering>true</filtering>
        </resource>
    </resources>
</configuration>