2009-08-04 3 views
35

이것은 나의 own previous question에 대한 후속 조치이며, 나는 이것을 묻는 것이 당혹 스럽다.하지만 어쨌든 : 시스템 독립적 인 방식으로 독립형 Java 프로그램에서 두 번째 JVM을 시작하는 방법은 무엇입니까? JAVA_HOME과 같은 env 변수는 현재 실행중인 JRE와 다른 JRE를 가리킬 수 있으므로 의존하지 않아도됩니다. 실제로 작동하지만 조금 어색한 느낌 다음 코드를 내놓았다 :* 자바 코드에서 두 번째 JVM을 시작하는 가장 좋은 방법은 * this *입니까?

public static void startSecondJVM() throws Exception { 
    String separator = System.getProperty("file.separator"); 
    String classpath = System.getProperty("java.class.path"); 
    String path = System.getProperty("java.home") 
       + separator + "bin" + separator + "java"; 
    ProcessBuilder processBuilder = 
       new ProcessBuilder(path, "-cp", 
       classpath, 
       AnotherClassWithMainMethod.class.getName()); 
    Process process = processBuilder.start(); 
    process.waitFor(); 
} 

또한, 현재 실행중인 JVM이 다른 매개 변수와 함께 시작되었을 수 있습니다 (-D, -X ... .. .) 두 번째 JVM은 알지 못할 것입니다.

+0

코드가이 응답에서 가져온 것처럼 보입니다. http://stackoverflow.com/a/723914/3520484. – Mark

답변

5

시작시 항상 정확히 동일한 매개 변수, 클래스 경로 또는 무엇이든 (특히 -X 종류의 항목 - 예를 들어 자녀가 부모와 동일한 힙 설정을 필요로하는 이유)을 사용하고 싶지 않다는 것은 분명하지 않습니다. 2 차 과정.

아이들을 위해 이러한 속성을 정의하기 위해 외부 구성을 사용하는 것을 선호합니다. 좀 더 많은 작업이지만, 결국에는 유연성이 필요하다고 생각합니다.

가능한 구성 설정 범위를 보려면 Eclipse에서 "Run Configurations"설정을 살펴보십시오. 상당 부분 탭을 구성 할 가치가 있습니다.

+0

JVM을위한 설정 파일은 좋은 생각입니다. 사용자가 매개 변수를 조정할 필요가 없도록 대화 상자에서 편집 가능해야한다고 생각합니다 (Eclipse 예제와 비슷 함). 고마워. 내가 목표로 한 것은 실행 파일의 경로입니다.Stephen C가 언급했듯이 JVM의 실행 파일이 "java"가 아닌 경우 코드가 작동하지 않습니다. 실행 파일 이름을 찾는 시스템 독립적 인 방법이 있습니까? –

+0

현재 실행 파일이 "java"가 아닌 Java로 작업하고 있습니다. 그리고 저는 전통적인 Java로 시작하고 있습니다. 그리고 적어도 4 가지 Java 실행 파일을 onmy 시스템과 "java가 아닌"javas가 있습니다. 당신은 신뢰할 수있는 것을 추론 할 수 없으므로 java에 대한 경로를 구성 가능한 항목 중 하나로 포함하는 것이 좋습니다. Eclipse가 실제로하는 일이라는 것을 알게 될 것입니다. – djna

+0

왜 이것이 대답입니까? "예"또는 "아니오"를 기다리는 질문에 대답하지 않으면 나중에 상황에서 "아니오"에 대한 대안을 가정합니다. –

6

대답은 "예"라고 생각합니다. 이것은 아마도 시스템 독립적 인 코드를 사용하여 Java에서 할 수있는 것처럼 좋다. 그러나 이것조차도 시스템에만 의존적이라는 것을 유의하십시오. 예를 들어, 일부 시스템의 : 명령 이름은 (그것이 일 JVM이 아닌 경우 등) 다를 수있는 JVM을 시작하는 데 사용

  • JAVA_HOME 변수가 설정되지 않았을 수 있습니다

    1. , 또는
    2. 명령 줄 옵션이 다를 수 있습니다 (예 : Sun JVM이 아닌 경우).

    (두 번째) JVM을 시작할 때 최대한의 이식성을 목표로한다면 래퍼 스크립트를 사용하여 수행 할 것입니다.

  • +1

    고마워요. JAVA_HOME 변수는 여기에서 System.getProperty ("java.home")! = JAVA_HOME과 관련이 없습니다. 실행 파일이 다른 이름을 가지고 있기 때문에 코드가 작동하지 않는 JVM 예제가 있습니까? –

    +0

    @ 로버트 : 몇 가지 예 : IBM (및 다른 사람)은 "javaw"를 대안으로 사용하고 Jikes RVM은 "rvm"을 사용하여 시작합니다. (그리고 JNode의 경우 "java"또는 "org.jnode.command.common.java"... 명령은 경로 이름으로 식별되지 않습니다.) –

    5

    코드가 현재 실행중인 자바 실행 파일 (예 : 질문의 샘플 코드에서 '경로'변수)을 찾으려면 아파치 앤 내에 유틸리티 메소드가 있습니다. 개미로 코드를 만들 필요가 없습니다.이 방법으로 라이브러리로 사용하십시오.

    때문이다 :

    org.apache.tools.ant.util.JavaEnvUtils.getJreExecutable ("자바")

    그것은 다른 사람이 언급 한 다른 JVM 업체들과 특별한 경우의 정렬을 담당 . (그리고 소스 코드를 보면 상상했던 것보다 더 특별한 경우가 있습니다.)

    Ant.jar에 있습니다. 개미는 Apache 라이센스하에 배포되므로 번거롭지 않게 원하는대로 사용할 수 있기를 바랍니다.