一尘不染

java runtime.exec cmd / c解析引用的参数

tomcat

我正在尝试 runtime.exec(String[],null, new File(directory))使用前两个参数“ cmd”和“ /
c”运行。

我正在尝试为要运行的tomcat指定Java版本。似乎cmd /
c参数导致runtime.exec通过空间定界来解析所有参数,或者更合适的是cmd可以解析出每个参数。

所以,

cmd /c .\bin\Tomcat7.exe //US//Tomcat7 --Jvm="C:\Program Files\Apache Tomcat 7\jre\bin\server\jvm.dll"

正在将jvm参数分解为参数“ C:\ Program”,“ Files \ Apache”,“ Tomcat
.....”,这导致无法解释参数。对参数的引用也似乎被忽略了。

有没有办法让cmd尊重jvm参数,或者利用runtime.exec中的指定目录?

谢谢阅读。


阅读 593

收藏
2020-06-16

共1个答案

一尘不染

一个有效的解决方法是使用Windows短名称:

替换Program FilesPROGRA~1(使用DIR /X C:\ | find "Program")以查看其名称是否正确

替换Apache Tomcat 7APACHE~1(或返回的任何内容DIR /X C:\PROGRA~1 | find "Apache"

您的命令很有可能是

cmd /c .\bin\Tomcat7.exe //US//Tomcat7 --Jvm=C:\PROGRA~1\APACHE~1\jre\bin\server\jvm.dll

不再有空格:问题已解决

编辑:

未验证,但您可能想尝试使用这种exec风格:

public Process exec(String command, String[] envp, File dir);

像这样:

exec("cmd /c .\bin\Tomcat7.exe //US//Tomcat7 --Jvm=\"C:\Program Files\Apache Tomcat 7\jre\bin\server\jvm.dll\"",null,new File(directory))

您当前使用的API必须根据您的参数重建完整的命令行,这些参数不是真正的参数,而是带有空格,引号等的参数组。API可能(未经检查)尝试添加引用不需要的地方,从而破坏了命令行。

2020-06-16