Java - 类路径问题

Yat*_*oel 2 java resources classpath

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

products
    |--test
        |--com
            |--ClassA.java
        |--dependencies
            |---inputs.txt
Run Code Online (Sandbox Code Playgroud)

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

private static final String PROPERTIES_FILE_PATH = "test/dependencies/inputs.txt";
Run Code Online (Sandbox Code Playgroud)

test package是在java构建路径 - > sources中

但是当我导出这个项目时products.jar,我发现在jar文件中没有test目录.有两种显示目录comdependencies在JAR文件的根目录.因此,当我尝试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)
Run Code Online (Sandbox Code Playgroud)

因此,在发现test未在jar文件中导出dir 后,我将ClassA.java中文件的路径更改为dependencies/inputs.txt.它在eclipse中不起作用,但我认为它可以在jar中工作,因为jar文件在classpath中,dependencies文件夹在jar文件的根目录下,所以java启动器将能够找到dependencies文件夹然后inputs.txt文件.

但不幸的是它也没有用.

ska*_*man 6

你不能FileInputStream用来读取JAR中打包的文件 - 它不再是文件了.FileInputStream仅适用于实际的磁盘文件.

您需要使用Class.getResourceAsStream(javadoc)读取资源,例如

InputStream stream = getClass().getResourceAsStream("/dependencies/inputs.txt");
Run Code Online (Sandbox Code Playgroud)

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