如何将资源文件打包到可运行的jar

时间:2015-12-11 18:23:00

标签: java eclipse

我在很多方面尝试了这个,并遵循了几个在线说明,例如 - Eclipse exported Runnable JAR not showing images 但到目前为止,没有成功。

我有一个非常简单的程序,它读取文本文件(test.txt)并将其内容打印到标准输出。我正在使用Eclipse。这就是我所做的 -

  • 我将文本文件放入名为“resources'
  • 的文件夹中
  • 我右键单击了资源文件夹,选择了“构建路径”并点击“用作资源文件夹”
  • 在我的代码中,我尝试了两种方法来处理文件 - (a)作为“/test.txt”,(b)作为“resources / test.txt。后一种方法在Eclipse中运行程序时起作用。但是,当我将项目导出为可运行的jar文件时,这两种方法都不起作用。资源文件夹无法包含在jar文件中。

非常感谢任何帮助。

附录: 这是代码。

public class FileIOTest {

public static void main(String[] args) {
    String line;
    try {
        BufferedReader br = new BufferedReader(new FileReader(new File("/test.txt")));
        while((line = br.readLine()) != null){
            System.out.println(line);
        }

    br.close(); 
    }
    catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}

}

}

3 个答案:

答案 0 :(得分:6)

您无法通过FileReader访问Jar文件中的资源,因为它不是文件系统上的文件。 Java确实有一种机制来访问类路径中的资源(包括在Jars中):ClassLoader.getResourceAsStream()。您可以将它与默认的类加载器一起使用:

BufferedReader br = new BufferedReader(new InputStreamReader(
                        ClassLoader.getSystemClassLoader()
                                   .getResourceAsStream("resource/test.txt")));

请注意getResourceAsStream返回null而不是抛出异常,因此您可能需要先获取流,检查是否为null,然后抛出异常或处理它。

您需要将jar中的完整路径作为路径。

答案 1 :(得分:1)

文件与资源的工作方式不同。如果您需要资源,那么您不应该尝试使用任何File(Xxx)变体,这些变体将在文件系统上查找。

您提供的链接,使用Class.getResource返回一个网址,但还有Class.getResourceAsStream返回InputStream,您可以将其包含在InputStreamReader中。例如

InputStream is = FileIOTest.class.getResourceAsStream("/text.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(is));

答案 2 :(得分:1)

你可以创建没有eclipse的jar。例如,如果我在包Demo中有src类(目录相同),并且资源文件(名为testing.txt)在resources目录中。我在目录的根目录中添加了一个Manifest.txt文件:

Manifest-Version: 1.0
Main-Class: src.Demo

Demo类看起来像:

package src;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Demo {

    public static void main(String... args) {

        try (BufferedReader br = new BufferedReader(new InputStreamReader(Demo.class.getResourceAsStream("/resources/testing.txt"))))
        {

            String sCurrentLine;

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

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

testing.txt文件就像:

hello world
How are you?

编译Demo.java以获取Demo.class

javac src/Demo.java 

创建jar

jar cfm myJar.jar Manifest.txt src/* resources/*

然后运行它

java -jar myJar.jar 

在eclipse中,只需在类路径中添加resources文件夹(确保它在jar中),并将其作为类路径资源(getResourceAsStream方法)读取