클라이언트 및 서버 JVM이있는 네트워크 응용 프로그램을 개발 중입니다. 둘 다 동일한 Jar 세트에 의존해야합니다.이 Jar 파일 세트는 저장되어 있거나 저장되어 있지 않을 수 있습니다. 같은 위치. 서버에 연결 한 직후 클라이언트는 서버의 jar와 해당 jar의 MD5 합계를 비교합니다. MD5 합계가 일치하지 않으면 클라이언트는 서버의 jar를 새 폴더로 다운로드하고 클라이언트가 현재 사용중인 jar에 의존하지 않는 새 Process
을 생성하려고 시도한 다음 종료합니다. 그러면이 새로운 Process
은 Client의 jar를 클라이언트가 새 폴더에 저장 한 서버의 복사본으로 덮어 쓴 다음 종료합니다.ProcessBuilder.start()로 인해 호스트 JVM이 종료됩니다.
문제는 클라이언트가 새 프로세스를 시작하려고 할 때마다 클라이언트의 JVM이 자동으로 종료된다는 것입니다. 여기에 새로운 Process
을 생성합니다 코드는 다음과 같습니다
System.err.println("##### creating ProcessBuilder ...");
ProcessBuilder pb = new ProcessBuilder();
System.err.println("##### setting command line args ...");
pb.command("java","-jar","some-jar-not-used-by-the-client.jar");
System.err.print("##### starting ProcessBuilder: ");
for(String opt : pb.command()) System.err.print(opt+" ");
System.err.println();
pb.start();
System.err.println("##### Process started, exiting host process ...");
클라이언트는 pb.start()
에 대한 호출에 종료 될 것으로 보인다. 여기 내 프로그램의 콘솔 출력은 다음과 같습니다라는 결코 극복
##### creating ProcessBuilder
##### setting command line args
##### starting ProcessBuilder: java -jar some-jar-not-used-by-the-client.jar
인쇄 문 pb.start()
후. 나는 Java 6과 Java 7 모두에서 이것을 테스트했으며, Runtime.getRuntime().exec()
을 사용해 보았는데 아무런 문제가 없었다. 이런 식으로 본 사람 있어요?
그래, 그 전에를 읽었습니다 - 없음 이 기사의 사례는 여기에서 일어나는 것과 원격으로 유사합니다. 부모 프로세스가 스택 추적을 걸거나 덤프하지 않고 ProcessBuilder.start()를 호출하면 즉시 종료됩니다. Java에서 프로세스를 스폰하는 방법은 Java API에 따라 ProcessBuilder를 사용하기 때문에 Runtime.getRuntime(). exec()를 사용하지 않습니다. 그래도 좋은 기사! – CodeBlind