1.6和1.7之间的不同行为getRuntime()。exec

时间:2013-11-26 14:28:45

标签: java

这里有点神秘,我们正在使用第三方图像服务器,它开始在1.6.0_45下破解,研究确定它是由更改为getRuntime()。exec引起的。

发布1.6.0_45的说明,请注意Runtime.exec的更改部分  http://www.oracle.com/technetwork/java/javase/6u45-relnotes-1932876.html

这些更改应该在1.7.25及更高版本中可用。

现在到了谜底,下面的例外是1.6.0_45抛出,但不是1.7.0_45。该异常似乎与exec更改直接相关。为什么不在1.7.0_45中断?注意,可以轻松解决,将Java安装到没有空格的目录中。

Exception in thread "Thread-1" java.lang.IllegalArgumentException: Executable
name has embedded quote, split the arguments
    at java.lang.ProcessImpl.isQuoted(ProcessImpl.java:52)
    at java.lang.ProcessImpl.getExecutablePath(ProcessImpl.java:85)
    at java.lang.ProcessImpl.<init>(ProcessImpl.java:127)
    at java.lang.ProcessImpl.start(ProcessImpl.java:28)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:452)
    at java.lang.Runtime.exec(Runtime.java:593)
    at java.lang.Runtime.exec(Runtime.java:431)
    at java.lang.Runtime.exec(Runtime.java:328)
    at com.corda.pcagent.f.run(Unknown Source)

1 个答案:

答案 0 :(得分:2)

  

这些更改应该在1.7.25及更高版本中可用。

事实上,这一变化是在1.7.21中引入的。

在1.7.25中,他们引入了一个名为"jdk.lang.Process.allowAmbigousCommands"的系统属性。如果在命令行上将该属性设置为"true",则会为Runtime.exec(String)重新启用旧的(1.7.21之前的)特定于Windows的行为。

也许他们/某人为应用程序做了这个...这可能解释了为什么它出乎意料地在1.7.45上工作。