1

我正在尝试使用java 类中的Runtime.exec函数从另一个 jar 运行可执行 jar。
代码是

Runtime r = Runtime.getRuntime();
Process p = r.exec("java -jar \""+_JarPath +"\" "  + "\""+ args[0]+"\""+ " " +"\""+ args[1]+"\""+ " " +"\""+ args[2]+"\"" + " " +"\""+ args[3]+"\"");

在这里,参数args不为空并且定义明确。

此代码在 Windows 平台上运行良好,但在 Linux 上,我收到错误

无法访问 jarfile “/opt/mydir/lib/MyFol/mytest.jar”

我已经阅读了其他类似的问题并确保

  1. 目录/opt/mydir/lib/MyFol/和文件mytest.jar拥有所有权限
  2. 启动此进程命令的可执行 jar 也具有所有权限。
  3. linux上的用户也是admin

我在 Linux 上使用OpenJDK 。

4

2 回答 2

5

正如 Robin Green 在post中所说,上述代码在 linux 机器上的实际问题是双引号,他是对的。
但是当路径包含空格或其他参数之间有空格时,我无法运行 jar。
为此,我不得不尝试一些其他方式来加载 jar,这可以在两个平台上无缝工作,并且也消除了空间问题。
在这种情况下, Process Builder前来救援。

ProcessBuilder pb = new ProcessBuilder("java", "-jar", _JarPath, args[0], args[1], args[2], args[3]);
Process p = pb.start();

在所有情况下,这在两个平台上都运行良好,无需任何探测。

编辑
OOPS 有一个简单的解决方案,但我没有得到它,感谢Ingo发表的评论,我们可以通过使用另一个重载函数来传递参数exec

Runtime r = Runtime.getRuntime();
Process p =null;
String[] cmdarray = new String[7];
cmdarray[0] = "java";
cmdarray[1] = "-jar";
cmdarray[2] = _JarPath;                 
cmdarray[3] = args[0];
cmdarray[4] = args[1];
cmdarray[5] = args[2];
cmdarray[6] = args[3];
p = r.exec(cmdarray);
于 2013-11-12T14:20:57.073 回答
2

试试不带双引号。我怀疑没有调用 shell 可能是一个问题,而是直接调用了 Java。

于 2013-11-09T08:41:19.457 回答