gpt4 book ai didi

java - ProcessBuilder启动java程序: IOException.无法启动进程。原因:无法运行程序CreateProcess error=2

转载 作者:行者123 更新时间:2023-12-02 09:42:03 25 4
gpt4 key购买 nike

我有一个像这样的简单类(class):

public class Dog  {
public static void main(String[] args) {
System.out.println("DOG");
}
}

它被编译成位于C:\Program Files\Apache Software Foundation\Tomcat 8.5\webapps\Test\classes内的Dog.class。我尝试使用 ProcessBuilder 运行它:

public static void main(String[] args) {
String pathName = "-cp \"C:\\Program Files\\Apache Software Foundation\\Tomcat 8.5\\webapps\\Test\\classes" + "\" " + "Dog";
runCode(pathName);
}
public static void runCode(String name)  {
System.out.println(name); //-cp "C:\Program Files\Apache Software Foundation\Tomcat 8.5\webapps\Test\classes" Dog

ProcessBuilder processBuilder = new ProcessBuilder("java " + name);
processBuilder.redirectError(new File(Paths.get("C:\\Program Files\\Apache Software Foundation\\Tomcat 8.5\\webapps\\JavaStudyRooms\\output.txt").toString()));
processBuilder.redirectInput();

try {
final Process process = processBuilder.start();
try {
final int exitStatus = process.waitFor();
if(exitStatus==0){
System.out.println("External class Started Successfully.");
System.exit(0); //or whatever suits
}else{
System.out.println("There was an error starting external class. Perhaps path issues. Use exit code "+exitStatus+" for details.");
System.out.println("Check also output file for additional details.");
System.exit(1);//whatever
}
} catch (InterruptedException ex) {
System.out.println("InterruptedException: "+ex.getMessage());
}
} catch (IOException ex) {
System.out.println("IOException. Faild to start process. Reason: "+ex.getMessage());
}
System.out.println("Process Terminated.");
System.exit(0);

}

给出错误:

-cp "C:\Program Files\Apache Software Foundation\Tomcat 8.5\webapps\Test\classes" Dog
IOException. Faild to start process. Reason: Cannot run program "java -cp "C:\Program Files\Apache Software Foundation\Tomcat 8.5\webapps\Test\classes" Dog": CreateProcess error=2, Cannot find the file
Process Terminated.

为什么会发生这种情况以及如何解决?

最佳答案

ProcessBuilder 不占用整个命令行。它需要参数。

您当前的代码正在查找基本名称为 90 个字符长的程序,例如 java -cp … Dog.exe

您需要传递一个参数数组:

// Note the use of a String array, not a single String

public static void runCode(String... javaArgs) {

List<String> args = new ArrayList<>();
args.add("java");
Collections.addAll(args, javaArgs);

ProcessBuilder processBuilder = new ProcessBuilder(args);

这可以被调用为:

runCode(
"-cp",
"C:\\Program Files\\Apache Software Foundation\\Tomcat 8.5\\webapps\\Test\\classes",
"Dog");

此外,不要只打印异常消息。该消息本身很少有用。您通常想要打印整个堆栈跟踪,这样您就可以获得所有信息,并且准确地知道问题发生的位置:

   } catch (IOException ex) {
ex.printStackTrace();
}

关于java - ProcessBuilder启动java程序: IOException.无法启动进程。原因:无法运行程序CreateProcess error=2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56990870/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com