String
您传递给的每个ProcessBuilder
参数都是一个单独的参数(第一个参数除外,即命令)。
把它想象成args[]
传递给你的主要方法。每个String
都是数组中的一个单独元素。
我怀疑这p1
被解释为一个单一的论点,而实际上它应该是两个......
尝试将此参数分成两个单独的参数
String location = "C:\\Windows\\System32\\javaw.exe";
String p1="-cp";
String p2="jts.jar;total.2012.jar";
String p3="-Dsun.java2d.noddraw=true";
String p4="-Dswing.boldMetal=false";
String p5="-Dsun.locale.formatasdefault=true";
String p6="-Xmx768M";
String p7="-XX:MaxPermSize=128M";
String p8="jclient/LoginFrame" ;
String p9 = "C:\\Jts";
修正案
查看-cp
参数,似乎类路径元素与执行命令的位置有关。这表明您需要使用ProcessBuilder#directory(File)
来指定执行命令的位置。
例如,如果您的程序安装在 中C:\Program Files\MyAwesomeApp
,但您从 的上下文中运行它C:\Desktop
,那么 Java 将无法找到所需的 Jar 文件,通常会引发ClassNotFound
异常。
相反,您需要告诉ProcessBuilder
您希望从C:\Program Files\MyAwesomeApp
上下文中执行命令。
例如...
ProcessBuilder pb = new ProcessBuilder(...);
pb.directory(new File("C:\Program Files\MyAwesomeApp"));
// Other settings...
Process p = pb.start();
从运行示例更新
只是为了说明问题。我自己构建了一个小型 Java 程序,它可以简单地将简单的消息打印到标准输出。
当我运行它时,它按预期工作......
try {
String params[] = new String[]{
"C:\\Windows\\System32\\javaw.exe",
"-cp",
"C:\\...\\TestSimpleProcessBuilder\\build\\classes",
"-Dsun.java2d.noddraw=true",
"-Dswing.boldMetal=false",
"-Dsun.locale.formatasdefault=true",
"-Xmx768M",
"-XX:MaxPermSize=128M",
"testsimpleprocessbuilder/HelloWorld",
"Boo"
};
ProcessBuilder pb = new ProcessBuilder(params);
pb.redirectErrorStream();
Process p = pb.start();
InputStream is = p.getInputStream();
int in = -1;
while ((in = is.read()) != -1) {
System.out.print((char) in);
}
is = p.getErrorStream();
in = -1;
while ((in = is.read()) != -1) {
System.out.print((char) in);
}
System.out.println("p exited with " + p.exitValue());
} catch (IOException ex) {
Logger.getLogger(TestSimpleProcessBuilder.class.getName()).log(Level.SEVERE, null, ex);
}
当我从
"-cp",
"C:\\...\\TestSimpleProcessBuilder\\build\\classes",
至
"-cp C:\\...\\TestSimpleProcessBuilder\\build\\classes",
它失败了...

和输出
无法识别的选项:-cp C:\DevWork\personal\java\projects\wip\StackOverflow\TestSimpleProcessBuilder\build\classes
如果你想知道,这是我编写的可以运行的小测试程序......
package testsimpleprocessbuilder;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello world - world says " + (args.length > 0 ? args[0] : "Nothing"));
}
}
现在也许有人可以向我解释投反对票的原因?