2010-11-30 12 views
5

में जावा मुख्य विधि निष्पादित करें मेरे पास एक डेस्कटॉप ऐप है और जब कोई बटन दबाता है तो मैं इसे एक और जेवीएम को लात मारना चाहता हूं जो कक्षा की मुख्य विधि को निष्पादित करता है। मेरा डेस्कटॉप ऐप पहले से ही जार पर निर्भर करता है जिसमें उस मुख्य विधि के साथ कक्षा शामिल है जिसे मैं निष्पादित करना चाहता हूं।जावा डेस्कटॉप एप के भीतर एक अलग जेवीएम

वर्तमान में मैं निम्नलिखित कोड मिल गया है, फिर भी, मुझे उम्मीद थी उनके ऐसा करने का एक और अधिक सुरुचिपूर्ण रास्ता नहीं था:

Runtime runtime = Runtime.getRuntime(); 
Process process = runtime.exec("java -jar another.jar"); 

मैं जानता हूँ कि मैं ProcessBuilder भी उपयोग कर सकते हैं।

कोई रास्ता नहीं के रूप में ऐसी (छद्म कोड बहाना) है:

Jvm.execute(Main.class); 

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

+1

और आप अपने कोड से उस मुख्य विधि को निष्पादित नहीं कर सकते हैं? – Rogach

+1

क्या आपके लिए नया पृष्ठभूमि थ्रेड स्वीकार्य है? उस स्थिति में आप उपयोगकर्ता को कार्य परिष्करण की रिपोर्ट भी कर सकते हैं। –

+0

एक अलग जेवीएम है जो मैं चाहता हूं। – digiarnie

उत्तर

1

बहुत अच्छा सवाल है। प्रबंधन API में खोजने का प्रयास करें: http://cupi2.uniandes.edu.co/javadoc/j2se/1.5.0/docs/api/javax/management/package-frame.html

शुभकामनाएं।

मुझे यकीन नहीं है कि यह एपीआई मौजूद है, लेकिन यदि यह है तो यह होना चाहिए। मैं व्यक्तिगत रूप से आपके द्वारा ProcessBuilder का उपयोग करता हूं लेकिन वर्तमान प्रक्रिया के सिस्टम गुणों को पुनर्प्राप्त करके जावा के लिए स्पष्ट पथ निर्दिष्ट करता हूं।

0

एचएसक्यूएलडीबी के पास कई अलग-अलग प्रक्रियाओं के लिए मुख्य तरीकों का आह्वान करने के लिए एक सामान्य समाधान है। किसी भी प्रक्रिया को लागू करने के लिए इस वर्ग का उपयोग करें MainInvoker class source

2

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

आमतौर पर सिर्फ Main.main (args) ठीक है, लेकिन हो जाएगा:

यदि आप अपने कार्यक्रम से है कि कार्यक्रम को अलग करने की सिर्फ एक और classloader के तहत इसे चलाने चाहते हैं - URLClassLoader दस्तावेज़ देखें। ध्यान दें कि जटिल जावा एप्लिकेशन सर्वर भी कई प्रक्रियाएं नहीं बनाते हैं (आमतौर पर यह केवल एक जेवीएम प्रक्रिया है), और केवल क्लासलोडर्स के साथ तैनात WARs और EARs को अलग करें। आप क्लासलोडर को JVM के समकक्ष प्रक्रिया के रूप में सोच सकते हैं।

यदि कोई अन्य प्रोग्राम कुछ 'असुरक्षित' संचालन करता है, जावा की सुरक्षा तंत्र का उपयोग जावा.सेक्चर से करें और उस प्रोग्राम को उन परिचालनों से रोकने से रोकें।

यदि कोई अन्य प्रोग्राम System.exit() को कॉल करता है और यह आपके प्रोग्राम को रोकता है, तो सुरक्षा तंत्र का उपयोग करने के लिए पर्याप्त है, और सिस्टम.एक्सिट() को कॉल करने के लिए उस प्रोग्राम को मना कर दें - System.exit() Javadoc देखें। फिर आप केवल सुरक्षा अपवाद पकड़ सकते हैं और इसे अनदेखा कर सकते हैं।

संबंधित मुद्दे