2013-07-12 42 views
1

我有我已经从这个命令手动创建一个JAR文件(线缠绕容易地读取)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; 
} 

我试图创建与在/client/目录.txt“资源”文件的JAR,没有成功。正如同样的问题的其他答案所建议的,我也尝试改变代码的路径。我猜测这是使用相对路径时的某种问题。我可以做些什么来使这些文件在JAR中正确引用以内,因此应用程序可以独立运行?

+1

'typeName'的值是什么?为了更快地获得更好的帮助,请发布[SSCCE](http://sscce.org/)。 –

+0

'typeName'只是一个字符串,它对应于'.txt'文件名之一 - 'type1','type2','type3'。道歉,我认为这是不言而喻的。 – Wingman4l7

+0

*“我认为这是不言而喻的。”*一个SSCCE是“不言而喻的”。你的在哪里? –

回答

2

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

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

+0

很明显,一旦我终于看到了'openFile()'方法的实现 - 感谢指向我这个方向! – Wingman4l7