0

我有一个简单的桌面应用程序。该应用程序有一个名为 MyApp.jar 的其他应用程序的 .jar,并且在此 jar 中有一个带有一个键的属性文件(infor.properties)。应用程序必须生成一个自己的 MyApp.jar,其中属性文件的键是 inputText 中的字符串,所以我必须更改 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。有谁知道为什么?

4

1 回答 1

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 文件

java -cp myjar.jar testapp.Test

它只是说(使用-cp myjar.jar)类路径是 myjar.jar (对于 JVM 是类似 jar 的目录)。

正如您在 Test.java 中看到的那样,您拥有"testapp/infor.properties". 必须针对使用的类路径指定属性文件的路径。类路径是 myjar.jar 内容的根目录。因此 testapp/infor.properties。

于 2012-04-27T10:19:45.540 回答