2013-05-17 29 views
5

Próbuję uruchomić instancję ApacheDS z mojej aplikacji java.
używam takiej metody run() klasy ScriptWrapper wykonać skrypt, który jest dostarczany z ApacheDS aby ją uruchomić:Jak uruchomić aplikację java z innej aplikacji java i utrzymać ją po powrocie programu głównego?

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

Ale problemem jest to, że kiedy kocur, na którym to aplikacja działa, jest zakończony i/lub ScriptWrapper jest śmieci zebrane, instancja ApacheDS również wygasa. Jak utrzymać to przy życiu?

EDYCJA: Dziękuję za odpowiedzi. Postanowiłem w inny sposób zająć się problemem i zdememonizować proces za pomocą skryptu rozpoczynającego binarną instalację ApacheDS.

+0

Problem rozwiązany, jeśli tak, proszę podziel się rozwiązaniem. –

Odpowiedz

0

Twój główny proces powinien poczekać, aż dziecko skończy.

Obiekt Proces ma metodę waitFor(). Możesz utworzyć nowy wątek, a następnie uruchomić i poczekać na inny proces.

0

Pod względem technicznym można zapobiec gromadzeniu śmieci w obiekcie, korzystając z numeru ScriptWrapper.

Możesz użyć singletonu do przechowywania odniesienia. Ponieważ Twój obiekt jest aktywny, nie zostanie zebrany przez 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()])); 
     } 
    } 

}

Nadzieja to może Ci pomóc!.

+0

Java API for Process mówi: Podproces nie zostaje zabity, gdy nie ma więcej odwołań do obiektu Process, ale podprocesor kontynuuje wykonywanie asynchronicznie –

0

Zastanawiam się, wywołując powłokę lub polecenie w oknach, aby wykonać polecenie, czy to zadziała?

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

Bash & (handlowe i) jest wbudowane operatora sterowania wykorzystywane do stołu procesów. Na stronie man Bash: "Jeśli polecenie zostanie zakończone przez operatora kontroli &, powłoka wykonuje polecenie w tle w podpowłoce".

nie jestem pewien, jak okna by wypracować spróbować może

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

W oknach tak jest

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

nie musisz umieścić p.waitFor() ..