2012-04-26 65 views
0

我有一個簡單的桌面應用程序。應用程序有一個名爲MyApp.jar的.jar,其他應用程序,並且在這個jar中有一個包含一個鍵(infor.properties)的屬性文件。應用程序必須生成一個自己的MyApp.jar,其中屬性文件的鍵是inputText中的字符串,因此我必須更改que屬性文件。我的問題是當我生成新的.jar,這個jar沒有找到屬性文件。我用這個拿到infor.properties的內容:添加到.jar的屬性未找到

InputStream in = this.getClass().getClassLoader().getResourceAsStream("infor.properties"); 
Properties prop = new Properties(); 
prop.load(in); 
in.close(); 

我使用的ZipFile和ZipOutputStream對於每一份文件到新的.jar,並添加一個新的。新的.jar文件的新結構是正確的,但是當我運行新的jar時,找不到文件infor.properties。有誰知道爲什麼?

+0

infor.properties是否真的在jar中?托盤將其重命名爲zip並進行查看。 – 2012-04-26 15:36:00

+0

是的,在罐子裏。 – Ina 2012-04-27 08:13:17

+0

你如何生成罐子?你使用一些IDE嗎?或者你使用'jar'工具嗎? – 2012-04-27 08:46:03

回答

1

它取決於你的文件在jar中的位置以及你如何指定你的類路徑。不幸的是,你並沒有給我們太多的信息在你的結構等,所以我創造了這個樣,你希望可以應用到你的項目:

比方說,你在包testapp(類的全名具有Test類是有脫穎而出testapp.Test ):

package testapp; 

import java.io.FileInputStream; 
import java.io.IOException; 
import java.util.Properties; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

public class Test { 

    private static final Logger logger = Logger.getLogger(Test.class.getName()); 

    public static void main(String[] args) { 

      Properties properties = new Properties(); 
      try { 
       properties.load(new FileInputStream("testapp/infor.properties")); 
       System.out.println("" + properties.getProperty("a")); 
      } catch (IOException e) { 
       logger.log(Level.SEVERE, "", e); 
      } 

    } 

} 

你在某個目錄PROJECT_ROOT。現在在這個目錄中你有上面編譯的類(在testapp目錄下,因爲你的類的全名是testapp.Test)。你的結構看起來像這樣:

PROJECT_ROOT 
    testapp 
    Test.class 
    infor.properties 

請注意,該類已編譯(您可能知道如何做對嗎?)。當你的工作目錄是PROJECT_ROOT你可以運行:

jar -vcf myjar.jar * 

,這將創建一個名爲myjar.jar罐子。現在,您可以使用下面的命令

java -cp myjar.jar testapp.Test 

它簡單地說,(使用-cp myjar.jar)的類路徑是myjar.jar(JVM對於像目錄的jar)運行jar文件。

正如你在Test.java中看到的,你有"testapp/infor.properties"。必須根據使用的類路徑指定屬性文件的路徑。類路徑是myjar.jar內容的根。因此testapp/infor.properties。