3

私はしばらくの間この問題に苦しんでいて、私はそれを修正することができないようです。私はすでにさまざまなアプローチ(Runtime.exec()、ProcessBuiler)を試しましたが、どれも機能していないようです。

これが私の問題です。私は常にオンになっているラップトップを持っています。このラップトップは、USB経由でarduinoに接続されたJavaツールを実行して、家の照明をオンまたはオフにします。私はこのプログラムを自分で作成したので、定期的なメンテナンス作業も行っています。最近、HTMLインターフェイスからプログラムを再起動するためのボタンを追加しました(更新がある場合、または他の理由でプログラムを再起動する必要がある場合、または近い将来に自動更新を実装することにした場合)。

この背後にあるこの考え方は、アプリケーションの2番目のインスタンスを最初のインスタンスから開始し、次にSystem.exit(0)を最初のインスタンスから開始することです。

何らかの理由で、アプリケーションの2番目のインスタンスを開始できません。ここにいくつかのコードがあります。

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);
    }

java.io.IOException:プログラム "java -jar" / Users / NightWalker / 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)at home.automation.executor.Engine.shutdown(Engine.java:186)at home.automation.executor.webserver.HTTPGenerator._handleActionCommand(にそのようなファイルまたはディレクトリはありませんHTTPGenerator.java:190)at home.automation.executor.webserver.HTTPGenerator._generateHTTPPage(HTTPGenerator.java:165)at home.automation.executor.webserver.HTTPGenerator.getHTTPPage(HTTPGenerator.java:58)at home.automation.executor .webserver.HTTPRequestHandler.run(HTTPRequestHandler.java:160)原因:java.io.IOException:error = 2、java.langにそのようなファイルまたはディレクトリはありません。UNIXProcess.forkAndExec(ネイティブメソッド)at java.lang.UNIXProcess。(UNIXProcess.java:53)at java.lang.ProcessImpl.start(ProcessImpl.java:91)at java.lang.ProcessBuilder.start(ProcessBuilder.java:453 )...5もっと

4

2 に答える 2

5

問題はこれです:

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

/* more stuff */ builder.command(startupCommand);

これは、Java がという名前 のコマンドを探すことを意味しますjava -jar ...stuff with spaces...。しかし、あなたが望むのは、Java が名前付きのコマンドを探し、javaそのコマンドにいくつかのパラメーターを与えることです。

使用する必要があります

/*...*/ builder.command("java", "-jar", jarLocation) /*...*/
于 2012-07-21T16:36:12.540 に答える
1

これは別の Java プログラムであるため、同じプロセスで実行することを検討することをお勧めします。これは、2 つのプログラムが同じプロセス内に存在する場合、2 つのプログラム間の通信がはるかに簡単になるためです。プログラムの外でコマンドを実行してみましたか? それは機能しますか?jar 内の meta-inf.mf ファイルには何が含まれていますか? meta-inf.mf ファイルのクラスパスが相対的ではないため、依存する jar が見つからない可能性があります。

于 2012-07-21T16:31:41.560 に答える