Java 为什么可以';除非我';当我运行Jar时,我在Jar所在的文件夹中?

Java 为什么可以';除非我';当我运行Jar时,我在Jar所在的文件夹中?,java,file,jar,internal,Java,File,Jar,Internal,我最近创建了一个应用程序,并成功地将其jared到c:/my/folder/app.jar。在以下情况下,它就像一个符咒一样起作用[Startup#1]: 打开命令 cd到c:/my/文件夹 java-jarapp.jar 但当我这样做时,它就不起作用了[Startup#2]: 打开命令 cd到c:/my/ java-jar文件夹/app.jar 因为app.jar包含我尝试在应用程序中运行的.exe文件: final Process p=Runtime.getRuntime().exe

我最近创建了一个应用程序,并成功地将其jared到c:/my/folder/app.jar。在以下情况下,它就像一个符咒一样起作用[Startup#1]:

  • 打开命令
  • cd到c:/my/文件夹
  • java-jarapp.jar
但当我这样做时,它就不起作用了[Startup#2]:

  • 打开命令
  • cd到c:/my/
  • java-jar文件夹/app.jar
因为app.jar包含我尝试在应用程序中运行的.exe文件:

final Process p=Runtime.getRuntime().exec(“rybka.exe”)

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


有什么建议吗?

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

尝试将exe提取到

System.getProperty("java.io.tmpdir"));
然后从这个位置运行它,每次都可以运行


Paul

尝试将exe解压缩到

System.getProperty("java.io.tmpdir"));
然后从这个位置运行它,每次都可以运行


保罗

像这样的事情是一种更好的前进方式。将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());

像这样的事情是一个更好的方法。将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());