2012-01-07 158 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()