为什么我不能访问jar中的文件,除非我在运行它时在Jar文件夹中?

时间:2009-08-09 09:18:23

标签: java file jar internal

我最近创建了一个应用程序并成功将其发送到c:/my/folder/app.jar。在下面的例子中,它就像一个魅力[Startup#1]:

  • 打开cmd
  • cd to c:/ my / folder
  • java -jar app.jar

但是当我这样做时,它不起作用[启动#2]:

  • 打开cmd
  • cd to c:/ my /
  • java -jar folder / app.jar

因为app.jar包含我尝试在我的应用程序中运行的.exe文件:

final Process p = Runtime.getRuntime().exec("rybka.exe");

它在示例2中不起作用,因为它找不到文件rybka.exe。

有什么建议吗?

3 个答案:

答案 0 :(得分:4)

这样的事情是更好的前进方式。将exe从jar中复制到临时位置并从那里运行它。然后你的jar也可以通过webstart执行,依此类推:

InputStream src = MyClass.class.getResource("rybka.exe").openStream();
File exeTempFile = File.createTempFile("rybka", ".exe");
FileOutputStream out = new FileOutputStream(exeTempFile);
byte[] temp = new byte[32768];
int rc;
while((rc = src.read(temp)) > 0)
    out.write(temp, 0, rc);
src.close();
out.close();
exeTempFile.deleteOnExit();
Runtime.getRuntime().exec(exeTempFile.toString());

答案 1 :(得分:1)

如果jar将始终位于该目录中,则可以使用完整路径/my/folder/rybka.exe。如果没有,您可以使用getClass().getProtectionDomain().getCodeSource().getLocation()找出jar的位置,并将其添加到rybka.exe之前。

答案 2 :(得分:1)

尝试将exe解压缩到

System.getProperty("java.io.tmpdir"));

然后从这个位置运行它也应该每次都有效。