我有一个简单的桌面应用程序。该应用程序有一个名为MyApp.jar的.jar,其他应用程序,在这个jar中有一个带有一个键的属性文件(infor.properties)。应用程序必须生成一个自己的MyApp.jar,其中属性文件的键是inputText中的String,所以我必须更改que属性文件。我的问题是当我生成新的.jar时,这个jar找不到属性文件。我使用它来获取infor.properties的内容:
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 :(得分:1)
这取决于你的文件在jar中的位置,以及如何指定类路径。不幸的是,你没有给我们很多关于你的结构等信息。所以我创建了这个样本,你希望它可以适用于你的项目:
假设您在Test
包中有课程testapp
(课程的全名在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
的jar。现在,您可以使用以下命令运行jar文件
java -cp myjar.jar testapp.Test
简单地说(使用-cp myjar.jar
)类路径是myjar.jar(对于JVM来说就像jar目录一样)。
正如您在Test.java中看到的那样,您有"testapp/infor.properties"
。必须根据使用的类路径指定属性文件的路径。类路径是myjar.jar内容的根。因此,testapp / infor.properties。