JAR文件找不到嵌入式资源 - 相对路径问题?

时间:2013-07-12 04:57:03

标签: java jar embedded-resource

我有一个JAR文件,我通过此命令手动创建(换行以便于阅读)

jar -cfm app_standalone.jar manifest.txt 
application/client/*.class
application/data/*.class  
application/startup/*.class 
*.txt

清单看起来像这样:

Main-Class: application.startup.StartFrame

我在/application/之外的目录中运行此命令。生成的JAR的目录结构如下所示:

[ROOT_DIR_OF_JAR]/type1.txt
[ROOT_DIR_OF_JAR]/type2.txt
[ROOT_DIR_OF_JAR]/type3.txt
[ROOT_DIR_OF_JAR]/application
[ROOT_DIR_OF_JAR]/application/client/example.class
[ROOT_DIR_OF_JAR]/application/data/another.class
[ROOT_DIR_OF_JAR]/application/startup/run_me.class

当我运行JAR文件时,它执行正常,但如果它与.txt文件位于同一目录中,它显然正在引用它。指向这些.txt文件的代码位于/application/client/

package application.client;
String typeName = "type2";  // could be type1 or type3
InputStream is = modelViewer.modelEnv.openFile(typeName + ".txt");
// ===============================================================
package application.startup;
public InputStream openFile(String name) {
    File f;
    FileInputStream is = null;
    String dir = System.getProperty("user.dir");
    f = new File(dir, name);
    is = new FileInputStream(f);
    return is;
}

我尝试使用.txt目录中的/client/“资源”文件创建JAR,但没有成功。我也尝试改变代码中的路径,正如其他类似问题的答案所示。我猜这是使用相对路径的某种问题。我该怎么做才能使这些文件正确引用 JAR中,以便应用程序可以独立运行?

1 个答案:

答案 0 :(得分:2)

该方法不会从类路径加载文件,而是从文件系统中的当前目录加载文件。这就是问题所在。

要从类路径加载资源,必须使用Class.getResourceAsStream()(或ClassLoader.getResourceAsStream())。