2011-04-05 3 views
23

나는 이것이 거의 불가능하다고 확신하지만 시도해 볼 가치가있다.System.exit()에 대한 호출이 JVM을 종료하지 못하도록하려면?

특정 도구에 대한 명령 줄 인터페이스를 쓰고 있습니다. 다른 Java 응용 프로그램을 호출하는 Java 응용 프로그램에 대해 이야기하고 있습니다. 이 도구는 실행 후 System.exit을 호출하고 내 자신의 실행 환경을 종료합니다. 나는 그것을 원하지 않는다.

System.exit 전화를 무시할 수있는 방법이 있습니까?

+3

가능한 복제본 [Java : System.exit()을 호출하는 메서드를 테스트하는 방법?] (http://stackoverflow.com/questions/309396/java-how-to-test-methods-that-call) -system-exit). 이 질문의 제목이 오해의 소지가 있더라도 System.exiting의 외부 코드를 막는 것과 같은 질문입니다. –

답변

14

예, 이것은 SecurityManager를 사용하여 가능합니다. (정확하지 않을 수 있습니다) 다음을 시도해보십시오

myMethod() { 
    //Before running the external Command 
    MySecurityManager secManager = new MySecurityManager(); 
    System.setSecurityManager(secManager); 

    try { 
     invokeExternal(); 
    } 
    catch (SecurityException e) { 
     //Do something if the external code used System.exit() 
    } 
} 
+3

다른 권한 작업과 관련된 보안 예외를 피하기 위해 SecurityManager의 checkPermission 메서드를 재정의하는 것이 좋습니다. –

+0

@theomega 나는 당신의 코드를 사용했다. 그러나 나는 지금 읽고 싶은 모든 파일에 대해 접근을 거부한다. –

+0

@EmmanuelBourg 나는 대답에서 코드를 사용했다. 그러나 나는 읽고 싶어하는 모든 파일에 대해 "access denied"오류를 얻는다. –

2

SecurityManager은 코드에서 오는 것이 아닌 한 System.exit()을 무시하도록 설정하십시오.

2

응용 프로그램을 두 부분으로 나눌 수 있습니다. 첫 번째 도구는 도구로 시작됩니다. 그런 다음 애플리케이션의 두 번째 부분을 새로운 프로세스로 실행합니다. 그런 다음 호스트 응용 프로그램이 첫 번째 부분을 죽이지 만 두 번째 부분은 계속 실행 중입니다.

이 방법은 앱의 첫 번째 부분이 실제 애플리케이션 인 두 번째 부분을 시작하는 것입니다.

1

사용한다 this (@Vonc answer)에 관해서는 보안 관리자 :

가 수정 시도

클래스에서
class MySecurityManager extends SecurityManager { 
    @Override public void checkExit(int status) { 
    throw new SecurityException(); 
    } 
} 

다음 호출을 사용 System.exit을 호출하지 못하게하는 보안 관리자로 실행하려면 TestCase를 실행하고 SecurityException을 catch합니다.

관련 문제