2012-04-26 77 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。