2009-08-04 8 views
35

यह मेरे own previous question पर एक फॉलोअप है और मैं यह पूछने के लिए शर्मिंदा हूं ... लेकिन वैसे भी: आप सिस्टम-स्वतंत्र तरीके से एक स्टैंडअलोन जावा प्रोग्राम से दूसरा JVM कैसे शुरू करेंगे? और उदाहरण के लिए एक env वैरिएबल जैसे JAVA_HOME पर भरोसा किए बिना, जो कि वर्तमान में चल रहे एक से भिन्न जेआरई को इंगित कर सकता है। मैं निम्नलिखित कोड जो वास्तव में काम करता है लेकिन अभी थोड़ा अजीब लगता है के साथ आया था:क्या यह * वास्तव में जावा कोड से दूसरा जेवीएम शुरू करने का सबसे अच्छा तरीका है?

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 सकता है कुछ अन्य मानकों के साथ शुरू कर दिया गया है (डी, -X ... .. ।) कि दूसरा जेवीएम के बारे में पता नहीं होगा।

+0

इस उत्तर से कोड को लिया गया था जैसे http://stackoverflow.com/a/723914/3520484। – Mark

उत्तर

5

यह मुझे स्पष्ट नहीं है कि आप हमेशा एक ही पैरामीटर, क्लासपाथ या जो भी (विशेष रूप से -एक्स प्रकार की चीजें - उदाहरण के लिए, बच्चे को अपने माता-पिता के समान हीप सेटिंग्स की आवश्यकता क्यों होगी) शुरू करना चाहते हैं एक माध्यमिक प्रक्रिया।

मैं बच्चों के लिए इन गुणों को परिभाषित करने के लिए किसी प्रकार की बाहरी कॉन्फ़िगरेशन का उपयोग करना पसंद करूंगा। यह थोड़ा और काम है, लेकिन मुझे लगता है कि अंत में आपको लचीलापन की आवश्यकता होगी।

संभावित कॉन्फ़िगरेशन सेटिंग्स की सीमा को देखने के लिए आप ग्रहण में अपने "रन कॉन्फ़िगरेशन" सेटिंग्स को देख सकते हैं। वहां कुछ विन्यास कॉन्फ़िगरेशन के लायक हैं।

+0

जेवीएम के लिए एक कॉन्फ़िगरेशन फ़ाइल एक अच्छा विचार है। मुझे लगता है कि यह एक संवाद में संपादन योग्य होना चाहिए ताकि उपयोगकर्ता पैरामीटर को ट्विक नहीं कर सकें (ग्रहण उदाहरण की तरह)। उसके लिए धन्यवाद। मैं जो भी लक्ष्य रख रहा था वह निष्पादन योग्य मार्ग था।चूंकि स्टीफन सी ने बताया कि कोड काम नहीं करेगा यदि JVM के निष्पादन योग्य को "जावा" नहीं कहा जाता है। निष्पादन योग्य नाम खोजने के लिए कोई सिस्टम-स्वतंत्र तरीका है? –

+0

जैसा कि होता है मैं वर्तमान में एक जावा के साथ काम कर रहा हूं जिसका निष्पादन योग्य नाम से "जावा" नहीं है। और मैं एक पारंपरिक जावा के साथ spawning हूँ। और मेरे पास मशीन पर कम से कम 4 अलग-अलग जावा एक्जिक्यूटिव हैं, और "जावा नहीं" जावा हैं। आप भरोसेमंद नहीं कर सकते हैं, इसलिए जावा के पथ को कॉन्फ़िगर करने योग्य वस्तुओं में से एक के रूप में क्यों शामिल न करें। आप देखेंगे कि यह वास्तव में ग्रहण करता है, यद्यपि कॉन्फ़िगर करने के लिए बहुत आसान नहीं है। – djna

+0

यह स्वीकृत उत्तर क्यों है? अगर यह उस प्रश्न का उत्तर नहीं देता है जो "हां" या "नहीं" का इंतजार कर रहा है, और बाद की स्थिति में मुझे "नहीं" के लिए एक विकल्प लगता है। –

6

मुझे लगता है कि उत्तर "हां" है। यह सिस्टम के स्वतंत्र कोड का उपयोग कर जावा में जितना संभव हो उतना अच्छा हो सकता है। लेकिन ध्यान रखें कि यह केवल अपेक्षाकृत सिस्टम स्वतंत्र है। उदाहरण के लिए, कुछ सिस्टम में:

  1. JAVA_HOME चर सेट न की गई हो,
  2. आदेश नाम एक JVM लांच करने के लिए अलग हो सकता है (उदाहरण के लिए अगर यह एक सूर्य JVM नहीं है) का इस्तेमाल किया, या
  3. कमांड लाइन विकल्प अलग हो सकते हैं (उदाहरण के लिए यदि यह सूर्य JVM नहीं है)।

यदि मैं एक (द्वितीय) जेवीएम लॉन्च करने में अधिकतम पोर्टेबिलिटी का लक्ष्य रख रहा था, तो मुझे लगता है कि मैं इसे रैपर स्क्रिप्ट का उपयोग करके करूँगा।

+1

इसके लिए धन्यवाद। JAVA_HOME चर यहाँ System.getProperty ("java.home") के रूप में प्रासंगिक नहीं है! = JAVA_HOME। क्या आपके पास एक JVM का उदाहरण है जहां मेरा कोड काम नहीं करेगा क्योंकि निष्पादन योग्य का एक अलग नाम है? –

+0

@ रॉबर्ट: कुछ उदाहरण: आईबीएम (और अन्य?) में एक विकल्प के रूप में "जावा" है, और जैक्स आरवीएम "आरवीएम" का उपयोग करके लॉन्च किया गया है। (और जेएनओड के लिए, आप "जावा" या "org.jnode.command.common.java" चला सकते हैं ... आदेश पथनामों द्वारा पहचाने नहीं जाते हैं।) –

5

जावा निष्पादन योग्य खोजने के लिए कि आपका कोड वर्तमान में चल रहा है (यानी आपके प्रश्न के नमूना कोड में 'पथ' चर) वहां अपाचे चींटी के भीतर एक उपयोगिता विधि है जो आपकी मदद कर सकती है। आपको अपने कोड को चींटी के साथ बनाने की ज़रूरत नहीं है - इस विधि के लिए इसे लाइब्रेरी के रूप में उपयोग करें।

यह है:

org.apache.tools.ant.util.JavaEnvUtils.getJreExecutable ("जावा")

यह अलग JVM विक्रेताओं के साथ विशेष मामलों की तरह है कि दूसरों का उल्लेख किया है का ख्याल रखता है । (और इसके लिए स्रोत कोड को देखते हुए, मैंने कल्पना की तुलना में अधिक विशेष मामले हैं।)

यह ant.jar में है। चींटी अपाचे लाइसेंस के तहत वितरित की जाती है, इसलिए उम्मीद है कि आप इसे बिना परेशानी के कैसे चाहते हैं इसका उपयोग कर सकते हैं।