Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
linux上的Java执行过程_Java_Process_Processbuilder - Fatal编程技术网

linux上的Java执行过程

linux上的Java执行过程,java,process,processbuilder,Java,Process,Processbuilder,我已经为这个问题挣扎了一段时间,似乎无法解决它。 我已经尝试过不同的方法(Runtime.exec()、ProcessBuiler),但似乎都不管用 这是我的问题。 我有一台总是开着的笔记本电脑。这台笔记本电脑运行一个java工具,通过usb连接到arduino,以打开和关闭室内的灯。我自己创建了这个程序,因此我也在做一些定期维护工作。最近,我添加了一个按钮,用于从html界面重新启动程序(如果我有更新,或者由于其他原因,我可能需要重新启动程序,或者我决定在不久的将来实现自动更新) 这背后的想法

我已经为这个问题挣扎了一段时间,似乎无法解决它。 我已经尝试过不同的方法(Runtime.exec()、ProcessBuiler),但似乎都不管用

这是我的问题。 我有一台总是开着的笔记本电脑。这台笔记本电脑运行一个java工具,通过usb连接到arduino,以打开和关闭室内的灯。我自己创建了这个程序,因此我也在做一些定期维护工作。最近,我添加了一个按钮,用于从html界面重新启动程序(如果我有更新,或者由于其他原因,我可能需要重新启动程序,或者我决定在不久的将来实现自动更新)

这背后的想法是从第一个实例启动应用程序的第二个实例,然后从第一个实例退出(0)

由于某些原因,我无法启动应用程序的第二个实例。 这里有一些代码

public void shutdown(boolean restart) {
        if (this.serial != null) {
            this.serial.disconnect();
        }

        if (restart) {
            System.out.println(this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath());
            String startupCommand = "java -jar \"" + this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath().replace("%20", " ") + "\"";
            ProcessBuilder builder = new ProcessBuilder();

//            String[] command = new String[1];
//            command[0] = "-jar \"" + (System.getProperty("user.dir") + "/Home_Automation_Executor.jar") + "\"";
            try {
//                //System.out.println("Restarting Home Automation with command: " + command[0]);
//                System.out.println("Restarting Home Automation with command: " + startupCommand);
//                Runtime.getRuntime().exec("bash");
//                Process proc = Runtime.getRuntime().exec(startupCommand);
                Process proc = builder.command(startupCommand).start();
                InputStream stderr = proc.getErrorStream();
                InputStreamReader isr = new InputStreamReader(stderr);
                BufferedReader br = new BufferedReader(isr);
                String line = null;
                System.out.println("<ERROR>");
                while ((line = br.readLine()) != null) {
                    System.out.println(line);
                }
                System.out.println("</ERROR>");
                int exitVal = 0;
                try {
                    exitVal = proc.waitFor();
                } catch (InterruptedException ex) {
                    Logger.getLogger(Engine.class.getName()).log(Level.SEVERE, null, ex);
                }
                System.out.println("Process exitValue: " + exitVal);
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
        System.out.println("Terminating Home Automation");
        System.exit(0);
    }
公共无效关闭(布尔重新启动){
如果(this.serial!=null){
这个.serial.disconnect();
}
如果(重新启动){
System.out.println(this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath());
String startupCommand=“java-jar\”+this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath().replace(“%20”)+“\”;
ProcessBuilder=新的ProcessBuilder();
//字符串[]命令=新字符串[1];
//命令[0]=“-jar\”“+(System.getProperty(“user.dir”)+”/Home\u Automation\u Executor.jar”)+“\”;
试一试{
////System.out.println(“使用命令“+command[0])重新启动家庭自动化;
//System.out.println(“使用命令“+startupCommand”重新启动家庭自动化);
//Runtime.getRuntime().exec(“bash”);
//Process proc=Runtime.getRuntime().exec(startupCommand);
processproc=builder.command(startupCommand.start();
InputStream stderr=proc.getErrorStream();
InputStreamReader isr=新的InputStreamReader(stderr);
BufferedReader br=新的BufferedReader(isr);
字符串行=null;
System.out.println(“”);
而((line=br.readLine())!=null){
系统输出打印项次(行);
}
System.out.println(“”);
int-exitVal=0;
试一试{
exitVal=proc.waitFor();
}捕获(中断异常例外){
Logger.getLogger(Engine.class.getName()).log(Level.SEVERE,null,ex);
}
System.out.println(“进程exitValue:+exitVal”);
}捕获(IOEX异常){
例如printStackTrace();
}
}
System.out.println(“终止家庭自动化”);
系统出口(0);
}
java.io.IOException:无法运行程序“java-jar”/Users/nightwarker/Dropbox/Development/Source Code/java/NightWare Tools/Home Automation/Home Automation Executor/dist/Home_Automation_Executor.jar”“:错误=2,没有这样的文件或目录 位于java.lang.ProcessBuilder.start(ProcessBuilder.java:460) home.automation.executor.Engine.shutdown(Engine.java:186) home.automation.executor.webserver.HTTPGenerator.\u handleActionCommand(HTTPGenerator.java:190) 在home.automation.executor.webserver.HTTPGenerator._generateHTTPPage(HTTPGenerator.java:165) 在home.automation.executor.webserver.HTTPGenerator.getHTTPPage(HTTPGenerator.java:58) automation.executor.webserver.HTTPRequestHandler.run(HTTPRequestHandler.java:160) 原因:java.io.IOException:error=2,没有这样的文件或目录 位于java.lang.UNIXProcess.forkAndExec(本机方法) 位于java.lang.UNIXProcess(UNIXProcess.java:53) 在java.lang.ProcessImpl.start(ProcessImpl.java:91) 位于java.lang.ProcessBuilder.start(ProcessBuilder.java:453) ... 还有5个


因为它是另一个java程序,你可能想考虑在同一个进程中运行它,因为如果两个程序在同一个进程中,它们之间的通信就容易得多。您是否尝试在程序外运行该命令?它有用吗?jar中的meta-inf.mf文件包含什么内容?可能是meta-inf.mf文件中的类路径不是相对的,因此无法找到任何依赖的JAR。

问题在于:

String startupCommand = "java -jar \"" + this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath().replace("%20", " ") + "\"";

/* more stuff */ builder.command(startupCommand);
这意味着Jav将查找名为
java-jar的命令…填充空格…
。但您需要的是,Java查找名为
Java
的命令,并为该命令提供几个参数

你应该使用

/*...*/ builder.command("java", "-jar", jarLocation) /*...*/

“某种原因”实际上是完全正确的+1。但是对于
Runtime.getRuntime().exec(startupCommand)
它应该可以工作。@Stephan:这不起作用,因为
exec
版本将在空格上分割命令,错误消息中的jar路径包含空格,并且TO希望它可以工作(
替换(…)
)。