दिलचस्प पोस्ट
अमेज़ॅन लिनक्स पर यूवेएसबी अपस्टार्ट विंडोज बैच के लिए हेरेडॉक? ट्यूपल को हल करने के लिए क्या आवश्यकता थी? क्या मैं jQuery का उपयोग कर एक ड्रॉपडाउन सूची खोल सकता हूं? Eclipse javascript संपादक: जेएस फाइलों के लिए सामग्री सहायता, स्वत: पूर्णता बूट लिपिक में col-lg- *, col-md- * और col-sm- * में अंतर क्या है? मैं एक <div> जावास्क्रिप्ट का उपयोग कर एक HTML पृष्ठ कैसे लोड करूं? पर्ल के प्रयोग से दो सरणी का अंतर ईवेंट श्रोता को निकालना जो बाँध के साथ जोड़ा गया था प्रतिलिपि असाइनमेंट ऑपरेटर को संदर्भ / कॉन्स्ट संदर्भ क्यों वापस करना चाहिए? Android – R को एक चर के लिए हल नहीं किया जा सकता मैं कमांड लाइन से एक युद्ध में एक क्लास कैसे चलाऊँ? विंडोज़ के नीचे गिट: एमएसवायएस या साइगविन? स्प्रिंग वेब ऐप संदर्भ के लिए प्रोग्रामिंग बीन जोड़ें क्या एक स्ट्रिंग के कितने अक्षर printf () का उपयोग करने के लिए मुद्रित करने का तरीका है?

एक जावा कार्यक्रम में एक और जार निष्पादित करें

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

वेब के समाधान से एकत्रित समाधान "एक जावा कार्यक्रम में एक और जार निष्पादित करें"

अगर मैं सही ढंग से समझता हूं तो ऐसा लगता है कि आप अपने जावा जीयूआई एप्लीकेशन के अंदर से एक अलग प्रक्रिया में जार चलाना चाहते हैं।

ऐसा करने के लिए आप उपयोग कर सकते हैं:

// Run a java app in a separate system process Process proc = Runtime.getRuntime().exec("java -jar A.jar"); // Then retreive the process output InputStream in = proc.getInputStream(); InputStream err = proc.getErrorStream(); 

प्रक्रिया के उत्पादन को बफर करने के लिए हमेशा अच्छा अभ्यास होता है

.जर निष्पादन योग्य नहीं है I कक्षाओं को इंस्टाइएट करें या किसी भी स्थिर विधि को कॉल करें।

संपादित करें: जेआर बनाने के दौरान मेन-क्लास प्रविष्टि जोड़ें

> पी.एम.एफ. (पी.एम.एफ. की सामग्री)

मुख्य-कक्षा: पीके। टेस्ट

 >Test.java package pk; public class Test{ public static void main(String []args){ System.out.println("Hello from Test"); } } 

प्रक्रिया वर्ग का उपयोग करें और इसके तरीके हैं,

 public class Exec { public static void main(String []args) throws Exception { Process ps=Runtime.getRuntime().exec(new String[]{"java","-jar","A.jar"}); ps.waitFor(); java.io.InputStream is=ps.getInputStream(); byte b[]=new byte[is.available()]; is.read(b,0,b.length); System.out.println(new String(b)); } } 

उम्मीद है की यह मदद करेगा:

 public class JarExecutor { private BufferedReader error; private BufferedReader op; private int exitVal; public void executeJar(String jarFilePath, List<String> args) throws JarExecutorException { // Create run arguments for the final List<String> actualArgs = new ArrayList<String>(); actualArgs.add(0, "java"); actualArgs.add(1, "-jar"); actualArgs.add(2, jarFilePath); actualArgs.addAll(args); try { final Runtime re = Runtime.getRuntime(); //final Process command = re.exec(cmdString, args.toArray(new String[0])); final Process command = re.exec(actualArgs.toArray(new String[0])); this.error = new BufferedReader(new InputStreamReader(command.getErrorStream())); this.op = new BufferedReader(new InputStreamReader(command.getInputStream())); // Wait for the application to Finish command.waitFor(); this.exitVal = command.exitValue(); if (this.exitVal != 0) { throw new IOException("Failed to execure jar, " + this.getExecutionLog()); } } catch (final IOException | InterruptedException e) { throw new JarExecutorException(e); } } public String getExecutionLog() { String error = ""; String line; try { while((line = this.error.readLine()) != null) { error = error + "\n" + line; } } catch (final IOException e) { } String output = ""; try { while((line = this.op.readLine()) != null) { output = output + "\n" + line; } } catch (final IOException e) { } try { this.error.close(); this.op.close(); } catch (final IOException e) { } return "exitVal: " + this.exitVal + ", error: " + error + ", output: " + output; } } 

आप अपना स्वयं का क्लासलोडर बना सकते हैं जो प्रश्न के जार-फाइल के बारे में जानता है, और इसे क्रमशः एजर या बीजर में मुख्य विधि कहते हैं। तब जब आप किया जाए, तो आप क्लासलोडर को छोड़ सकते हैं।

नोट: यह मौजूदा जेवीएम के अंदर चलता है और नए कोड से मुख्य एप्लिकेशन को सुरक्षित नहीं करता। चल रहे कार्यक्रम में नई कार्यक्षमता जोड़ने के लिए यह आसान है।

यदि आपकी कक्षा में जार है, और आप इसके मुख्य वर्ग को जानते हैं, तो आप केवल मुख्य वर्ग का आह्वान कर सकते हैं। एक उदाहरण के रूप में डीआईटीए-ओटी का उपयोग करना:

 import org.dita.dost.invoker.CommandLineInvoker; .... CommandLineInvoker.main('-f', 'html5', '-i', 'samples/sequence.ditamap', '-o', 'test') 

ध्यान दें कि यह अधीनस्थ जार साझा स्मृति स्थान और अपने जार के साथ एक वर्गपथ, जिससे हस्तक्षेप करने की सभी संभावनाएं पैदा हो सकती हैं। यदि आप नहीं चाहते हैं कि सामान प्रदूषित हो, तो आपके पास अन्य विकल्प हैं, जैसा कि ऊपर वर्णित है – अर्थात्:

  • उसमें जार के साथ एक नया क्लासलोडर बनाएं यह अधिक सुरक्षित है; आप कम से कम एक कोर क्लासलोडर को नए जार के ज्ञान को अलग कर सकते हैं यदि आप ज्ञान के साथ चीजों को आर्किटेक्ट करते हैं कि आप विदेशी जारों का उपयोग करेंगे हमारी प्लगइन्स सिस्टम के लिए हम अपनी दुकान में क्या करते हैं; मुख्य अनुप्रयोग क्लासलोडर कारखाने के साथ एक छोटा सा खोल है, एपीआई की एक प्रति है, और ज्ञान है कि वास्तविक अनुप्रयोग पहला प्लगइन है जिसके लिए इसे क्लासलोडर बनाना चाहिए। प्लगइन्स जार की एक जोड़ी हैं – इंटरफ़ेस और कार्यान्वयन – जो एक साथ ज़िपीड किए जाते हैं। क्लासलोडर्स सभी सभी इंटरफेस शेयर करते हैं, जबकि प्रत्येक क्लासलोडर को केवल अपने कार्यान्वयन का ज्ञान होता है स्टैक थोड़ा जटिल है, लेकिन यह सभी परीक्षणों से गुजरता है और खूबसूरती से काम करता है
  • Runtime.getRuntime.exec(...) उपयोग करें (जो कि पूरी तरह से जार को अलग करता है, लेकिन सामान्य "एप्लिकेशन को ढूंढें", "अपनी स्ट्रिंग्स सही से बचें", "प्लेटफ़ॉर्म-विशिष्ट डब्ल्यूटीएफ", और "ओएमजी सिस्टम थ्रेड्स" के नुकसान चल रहे सिस्टम कमांड

यदि आप जावा 1.6 हैं तो निम्नलिखित भी किया जा सकता है:

 import javax.tools.JavaCompiler; import javax.tools.ToolProvider; public class CompilerExample { public static void main(String[] args) { String fileToCompile = "/Users/rupas/VolatileExample.java"; JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); int compilationResult = compiler.run(null, null, null, fileToCompile); if (compilationResult == 0) { System.out.println("Compilation is successful"); } else { System.out.println("Compilation Failed"); } } }