如何从另一个java应用程序运行java应用程序,并在主程序返回后保持运行



我正在尝试从我的java应用程序运行ApacheDS实例。
我使用ScriptWrapper类的run()方法来执行ApacheDS附带的脚本来运行它:

public class ScriptWrapper implements Serializable {
    private String scriptPath;
    protected Process run(List<String> params) throws IOException {
        LOGGER.debug("Executing script="+scriptPath);
        params.add(0, scriptPath);
        if(workDir != null) {
            return Runtime.getRuntime().exec(params.toArray(new String[params.size()]), envp.toArray(new String[envp.size()]), new File(workDir));
        } else {
            return Runtime.getRuntime().exec(params.toArray(new String[params.size()]));
        }
    }
}

但是问题是,当运行这个应用程序的tomcat被终止和/或ScriptWrapper被垃圾收集时,ApacheDS的实例也会终止。如何让它保持活力?

编辑:谢谢你的回答。我决定以不同的方式解决这个问题,并使用二进制ApacheDS安装附带的脚本对该进程进行守护。

你的主进程应该等待它的子进程结束。

对象Process有一个方法waitFor()。您可以创建一个新线程,然后运行并等待其他进程。

我想知道通过调用shell或windows上的命令来执行您的命令是否有效?

Runtime.getRuntime().exec( "/bin/bash -c yourCommand yourOptions &" ).waitFor();

Bash &(&)是一个内置的控制操作符,用于fork进程。在Bash手册页中,"如果命令被控制操作符&终止,shell将在后台的子shell中执行该命令"。

我不确定如何窗口将工作尝试也许

Runtime.getRuntime().exec( "command.exe yourCommand yourOptions" ).waitFor();

从技术上讲,您可以通过持有ScriptWrapper的引用来防止对象被垃圾收集。

可以使用singleton来保存引用。由于您的对象是主动引用的,因此它不会被GC收集。

public class ScriptWrapper {
  private static ScriptWrapper uniqueInstance;
  private ScriptWrapper () {
    }
  public static synchronized ScriptWrapper getInstance() {
    if (uniqueInstance == null) {
      uniqueInstance = new ScriptWrapper ();
    }
    return uniqInstance;
  }
  protected Process run(List<String> params) throws IOException {
        LOGGER.debug("Executing script="+scriptPath);
        params.add(0, scriptPath);
      if(workDir != null) {
             return Runtime.getRuntime().exec(params.toArray(new String[params.size()]), envp.toArray(new String[envp.size()]), new File(workDir));
       } else {
         return Runtime.getRuntime().exec(params.toArray(new String[params.size()]));
      }
  }

}

在windows中是这样的

Process p = Runtime.getRuntime().exec( "cmd /c yourCommand yourOptions");

你不需要放p.waitFor() ..

相关内容

最新更新