2012-01-07 162 views
2

我有一个products.jar文件。里面有一个类com.ClassA。该项目的结构是这样Java - 类路径问题

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) 

所以发现test DIR未在JAR文件导出后,我改变了我的ClassA.java文件的路径为dependencies/inputs.txt。它在eclipse中不起作用,但我认为它可以在jar中工作,因为jar文件位于classpath中,并且dependencies文件夹位于jar文件的根目录下,所以java启动程序将能够找到dependencies文件夹,然后找到inputs.txt文件。

但不幸的是,它也没有工作。

回答

6

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

您需要使用Class.getResourceAsStreamjavadoc)(例如,

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

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

2

FileInputStream()不会读取您的jar文件,只读取文件系统中的文件。使用.getClass()的getResourceAsStream(资源名称).getClass()。getClassLoader()。的getResourceAsStream(资源名称)

的javadoc更多信息的class getResourceAsStreamclassloader getResourceAsStream()