2010-08-02 15 views
15

के दौरान जेवीएम निष्पादन योग्य स्थान का निर्धारण करना रनटाइम के दौरान वर्तमान में चल रहे JVM के निष्पादन योग्य स्थान को कैसे प्राप्त करता है? मैं ProcessBuilder क्लास का उपयोग कर एक सबप्रोसेस के रूप में एक और JVM को चालू करना चाहता हूं।रनटाइम

मुझे पता है कि java.home सिस्टम प्रॉपर्टी है, लेकिन यह JVM निष्पादन योग्य स्थान निर्दिष्ट नहीं करता है। मैं समझता हूँ कि मैं पथ प्राप्त करने के लिए कुछ इस तरह कर सकता है:

System.getProperties().getProperty("java.home") + File.pathSeparator + "bin" + File.pathSeparator + "java"

इस कोड क्योंकि Windows निष्पादन के नाम java.exe, नहीं java है, मंच स्वतंत्र नहीं है। क्या JVM निष्पादन योग्य पथ का मार्ग प्राप्त करने का कोई तरीका है जो प्लेटफ़ॉर्म की idiosyncrasies को ध्यान में रखता है?

+0

JAVA_HOME जेडीके को इंगित करता है और जेआरई नहीं। तो जब आप उपयोगकर्ता के पास जेडीके स्थापित नहीं है तो आप भाग्य से बाहर हैं। इसके अलावा * मैं * जेडीके करता हूं और पर्यावरण चर नहीं है। अभी भी सब कुछ ठीक काम करता है। विंडोज़ पर भी आप उन प्रोग्रामों के लिए '.exe' फ़ाइल नाम पर छोड़ सकते हैं जिन्हें आप चलाना चाहते हैं। – Joey

+0

'java.home' सिस्टम प्रॉपर्टी द्वारा, मैं पर्यावरण चर का जिक्र नहीं कर रहा हूं; बल्कि, मेरा मतलब है कि 'System.getProperties() 'में मौजूद संपत्ति। मैंने सत्यापित किया है कि जेआरई में 'java.home' की सिस्टम प्रॉपर्टी है। यह जानना उपयोगी है कि'exe' एक्सटेंशन विंडोज में वैकल्पिक है। धन्यवाद। –

+0

आप पहली टिप्पणी कह सकते हैं और विंडोज़ पर "bin/java.exe" मान सकते हैं और अन्य प्लेटफार्मों पर "बिन/जावा" मान सकते हैं। आप जो करने की कोशिश कर रहे हैं उसके आधार पर विचार करने के लिए "javaw.exe" भी है। –

उत्तर

-4

आप पूरे JVM को फोर्क करने की कोशिश कर रहे हैं।

  1. यह बेहद अक्षम है, मुख्य रूप से अभी तक एक और जावा प्रक्रिया की भारीता के कारण। यदि आपका भारी यह कर, तो अपने कार्यक्रम वास्तव में धीमी गति से
  2. धागे इसी कारण

के लिए मौजूद हैं लेकिन अगर आप वास्तव में, तुम कोशिश कर सकते चाहिए सिर्फ java -arguments सीधे क्रियान्वित करने, होने जा रहा है सबसे मानक जावा के बाद से इंस्टॉलेशन ने क्ली पथ पर जावा डाला।

+0

प्रश्न लॉन्च करने के बारे में कुछ भी नहीं कहता है, इसलिए आपको चाहिए शायद कहें "अगर आप java.exe का उपयोग करवेयर लॉन्च करने के लिए कर रहे हैं ..."। सवाल केवल चल रहे जावा exe प्राप्त करने के बारे में है। –

+1

जोवियरन ने लिखा था, इसके अलावा, * JVM को फटने के लिए लाभ * हैं: 1. JVMs के बीच कोई क्लास लोडिंग विवाद - यह बड़े अनुप्रयोगों के लिए महत्वपूर्ण है 2. एक महंगा एल्गोरिदम चलाते समय, इसे एक अलग प्रक्रिया के रूप में चलाएं एक अन्छा विचार है; यह मेमोरी सीमाओं के आसपास आता है –

1

हां, JVM निष्पादन योग्य (यदि यह मौजूद है) का मार्ग प्राप्त करने का एक तरीका है। इसे एप्लिकेशन की कॉन्फ़िगरेशन में शामिल करें। ऐसा करने के कई तरीके हैं: कमांड लाइन तर्क - जावा myApp.Main/path/to/Java; गुण - जावा- Dpath.to.java =/पथ/से/जावा; इत्यादि

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

यदि आप 99.99% प्लेटफ़ॉर्म आजादी चाहते हैं, तो मुझे लगता है कि आपके पास आवश्यक टूल हैं।

+6

यह मेरे प्रश्न का उत्तर नहीं देता है। मैं पूछ रहा हूं कि जेवीएम निष्पादन योग्य * के स्थान को रनटाइम * पर कैसे निर्धारित किया जाए, जेवीएम शुरू होने से पहले प्राथमिकता नहीं है। आप मानते हैं कि मैं इस बात पर नियंत्रण में हूं कि JVM कैसे आक्रमण किया जाता है, और ऐसा नहीं है। –

1

यह धागा मुद्दे का एक दिलचस्प चर्चा को कवर कई प्लेटफार्मों है: Finding current executable's path without /proc/self/exe

कि चर्चा को देखते हुए यह संभव है, अगर आप वास्तव में इसे जरूरत है, कुछ JNI आवरण कि # ifdef वर्तमान मंच है लिखने के लिए होना चाहिए और उचित देशी कॉल करता है।

यदि आप केवल लिनक्स पर हैं '/ proc/self/exe' वास्तविक निष्पादन योग्य चलाने के लिए एक प्रतीकात्मक लिंक है। इसका किसी भी पर्यावरण चर (यानी पथ या जावा_एचओएमई) पर भरोसा नहीं करने का लाभ है। लेकिन जैसा कि मैंने कहा, यह निश्चित रूप से मंच स्वतंत्र नहीं है।

8

आप हमेशा यह देखने के लिए os.name का उपयोग कर सकते हैं कि उपयोगकर्ता विंडोज चल रहा है या नहीं। यह ओएस एक्स, लिनक्स और विंडोज़ पर

String jvm_location; 
if (System.getProperty("os.name").startsWith("Win")) { 
    jvm_location = System.getProperties().getProperty("java.home") + File.separator + "bin" + File.separator + "java.exe"; 
} else { 
    jvm_location = System.getProperties().getProperty("java.home") + File.separator + "bin" + File.separator + "java"; 
}