如何从另一个Java应用程序运行java应用程序并在主程序返回后继续运行?

时间:2013-05-17 10:15:03

标签: java exec apacheds

我正在尝试从我的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安装的脚本进行守护程序。

4 个答案:

答案 0 :(得分:0)

你的主要过程应该在结束之前等待它的孩子。

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

答案 1 :(得分:0)

从技术上讲,您可以通过保留ScriptWrapper的引用来阻止对象被垃圾回收。

您可以使用单身来保持参考。由于您的对象被主动引用,因此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()]));
      }
  }

}

希望这可以帮到你!

答案 2 :(得分:0)

我想通过在Windows上调用shell或命令执行命令会有用吗?

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

The Bash&amp; (&符号)是用于分叉进程的内置控件操作符。在Bash手册页中,“如果命令由控制操作符&amp;终止,则shell在子shell中在后台执行命令”。

我不确定Windows会如何运作尝试

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

答案 3 :(得分:0)

在Windows中就像这样

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

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