Java - 类路径问题

时间:2012-01-07 11:40:41

标签: java resources classpath

我有一个products.jar文件。里面有一个班com.ClassA。项目的结构就像

products
    |--test
        |--com
            |--ClassA.java
        |--dependencies
            |---inputs.txt

在eclipse中,ClassA.java通过以下路径访问inputs.txt文件并且工作正常

private static final String PROPERTIES_FILE_PATH = "test/dependencies/inputs.txt";

test包位于java构建路径中 - >来源

但是当我将此项目导出为products.jar时,我发现在jar文件中没有test目录。 jar文件的根目录中有两个目录comdependencies。因此,当我尝试通过命令行执行ClassA(驻留在jar文件中)时,我收到以下异常:

JUnit version 4.8.2
java.io.FileNotFoundException: test/dependencies/inputs.txt (No such file or directory)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:137)
at java.io.FileInputStream.<init>(FileInputStream.java:96)

因此,在发现jar文件中没有导出test目录后,我将ClassA.java中文件的路径更改为dependencies/inputs.txt。它在eclipse中不起作用,但我认为它可以在jar中工作,因为jar文件在classpath中,dependencies文件夹位于jar文件的根目录,因此java启动程序将能够找到{{1 }}文件夹然后dependencies文件。

但不幸的是,它也无法正常工作。

2 个答案:

答案 0 :(得分:6)

您不能使用FileInputStream来读取JAR中包含的文件 - 它不再是文件。 FileInputStream仅适用于实际的磁盘文件。

您需要使用Class.getResourceAsStreamjavadoc)阅读资源,例如

InputStream stream = getClass().getResourceAsStream("/dependencies/inputs.txt");

您不使用test前缀,因为它不在JAR文件结构中。

答案 1 :(得分:2)

FileInputStream()不会在jar中读取,只读取文件系统上的文件。使用 .getClass()。getResourceAsStream(resourcename) .getClass()。getClassLoader()。getResourceAsStream(resourcename)

有关class getResourceAsStreamclassloader getResourceAsStream()

的javadoc的更多信息