我想跑
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 中的指定目录?
感谢阅读。
最佳答案
一个有效的解决方法是使用 windows 短名称:
将Program Files
替换为PROGRA~1
(使用DIR/X C:\| find "Program"
)看是否是正确的名字
将 Apache Tomcat 7
替换为 APACHE~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 有可能(未选中)尝试在不需要的地方添加引号,从而破坏您的命令行。
关于java runtime.exec cmd/c 解析引用参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39044114/