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


115

मैंने एजर, बीजर नाम से कई साधारण जावा एप्लिकेशन लिखे थे।

अब मैं GUI जावा प्रोग्राम लिखना चाहता हूं ताकि उपयोगकर्ता ए। को निष्पादित करने के लिए बटन ए दबा सके और बीजर को निष्पादित करने के लिए बटन बी।

इसके अलावा, मैं अपने GUI प्रोग्राम में रन-टाइम प्रोसेस डिटेल को आउटपुट करना चाहता हूं।

कोई उपाय?


31
यकीन नहीं होता कि इसे क्यों वोट दिया गया। उसे समझाएं कि उसकी धारणाएँ गलत क्यों हो सकती हैं, लेकिन इस सवाल का जवाब न दें।
विलियम ब्रेंडल

-1 बुनियादी जावा शब्दावली का सही ढंग से उपयोग नहीं किया जाता है और प्रश्न बहुत अस्पष्ट है और दूसरे अनुमान लगाने के लिए बहुत कुछ छोड़ देता है। अधिक विवरण के साथ अपने प्रश्न को फिर से टालने पर विचार करें या पहले जावा क्लासपाथ और अन्य मूल बातें पहले पढ़ें।
टॉपचेफ

21
@ ग्रिगरी: देखिए, आपको वही चाहिए जो आपको पहले ही पूछना चाहिए, बजाय तुरंत नीचे उतरने के। डाउनवोटिंग भी अधिक जानकारी के लिए पूछ के बिना किसी भी अच्छा नहीं करता है ...
विलियम ब्रेंडल

4
@William, आपके द्वारा किए गए कुछ सेकंड बाद बटन दबाने के लिए क्षमा करें। मैं बाद की टिप्पणी के साथ मतदान का अधिकार सुरक्षित रखता हूं। यह बुनियादी तैयारी और / या इस मुद्दे को समझने या प्रस्तुत करने के प्रयास के बिना पूछे गए प्रश्नों को देखने के लिए निराशाजनक है। मेरे लिए एक रेस्तरां में मतदान एक टिप की तरह है: आप सेवा की गुणवत्ता के आधार पर मानक 12% से अधिक या कम देते हैं। तो चलिए यहाँ असहमत हैं।
टॉपचेफ

1
@topchef मुझे इसके लिए 11 साल की देरी हो रही है, लेकिन आप कहते हैं कि "यह बुनियादी तैयारी के बिना पूछे गए सवालों को देखने के लिए निराशाजनक है ..."। फिर इसे ठीक करने में मदद करें। समझाएं कि आपने क्यों अपमानित किया। अन्यथा आप समस्या को बिल्कुल भी मदद नहीं कर रहे हैं।
tylerr147

जवाबों:


63

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

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

// 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();

प्रक्रिया के आउटपुट को बफर करने के लिए इसका हमेशा अच्छा अभ्यास है।


21
क्या यह समाधान पोर्टेबल है?
पचेरियर

3
धन्यवाद। मैंने "dir" पैरामीटर सहित 3 मापदंडों के साथ निष्पादन () फंक की कोशिश की है और यह काम नहीं करता है। केवल एक के साथ, हमें केवल 3 फाइलें डालने की जरूरत है। एक ही जगह पर
Duc Tran

क्या आप जानते हैं कि Runtimeउस जावा एप्लिकेशन का उद्देश्य कैसे प्राप्त करें ?
स्टॉमेस्टैक

क्या हम ProcessBuilder का उपयोग करके अधिक पोर्टेबल संस्करण का उपयोग कर सकते हैं?
आनंद रॉकज़ सिप

प्रोग्राम "जावा" नहीं चला सकता: CreateProcess त्रुटि = 2, सिस्टम निर्दिष्ट फ़ाइल नहीं ढूँढ सकता। यह त्रुटि हो रही है।
सज्जन

27

.jar निष्पादन योग्य नहीं है। त्वरित कक्षाएं या किसी भी स्थिर पद्धति पर कॉल करें।

EDIT: JAR बनाते समय मेन-क्लास प्रविष्टि जोड़ें।

> p.mf (p.mf की सामग्री)

मुख्य-वर्ग: pk.Test

>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));
    }
}

1
मुझे लगता है कि विचार यह है कि एक जार तक पहुंच प्रदान की जाती है, आप इसमें से कक्षाओं को लोड करने के लिए इसे क्लासपाथ में कैसे जोड़ते हैं।
झेरिको

1
नोट: यह केवल इसलिए काम करता है क्योंकि आपके पैट में जावा बिन है, यह डिफ़ॉल्ट विंडोज़ इंस्टॉलेशन के लिए मामला नहीं है
poussma

@AVD: A.jar फ़ाइल को कहाँ रखा जाना चाहिए?
लोगन

1
@logan - एक निर्देशिका में जहाँ आप एक प्रोग्राम लोड कर रहे हैं।
adatapost 14

क्या यह दृष्टिकोण एक नई JVM प्रक्रिया का निर्माण करेगा या मौजूदा एक का उपयोग करेगा?
राहुलदीप अत्री

17

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

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;
}
}

0

यदि आपके वर्गपथ में जार है, और आप इसके मुख्य वर्ग को जानते हैं, तो आप मुख्य वर्ग को आमंत्रित कर सकते हैं। उदाहरण के लिए DITA-OT का उपयोग करना:

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

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

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

0

यदि प्रोग्राम अकेले स्टैंड के रूप में चलता है, तो बैच फ़ाइल के साथ जार शुरू करके निम्नलिखित कार्य करता है:

public static void startExtJarProgram(){
        String extJar = Paths.get("C:\\absolute\\path\\to\\batchfile.bat").toString();
        ProcessBuilder processBuilder = new ProcessBuilder(extJar);
        processBuilder.redirectError(new File(Paths.get("C:\\path\\to\\JavaProcessOutput\\extJar_out_put.txt").toString()));
        processBuilder.redirectInput();
        try {
           final Process process = processBuilder.start();
            try {
                final int exitStatus = process.waitFor();
                if(exitStatus==0){
                    System.out.println("External Jar Started Successfully.");
                    System.exit(0); //or whatever suits 
                }else{
                    System.out.println("There was an error starting external Jar. Perhaps path issues. Use exit code "+exitStatus+" for details.");
                    System.out.println("Check also C:\\path\\to\\JavaProcessOutput\\extJar_out_put.txt file for additional details.");
                    System.exit(1);//whatever
                }
            } catch (InterruptedException ex) {
                System.out.println("InterruptedException: "+ex.getMessage());
            }
        } catch (IOException ex) {
            System.out.println("IOException. Faild to start process. Reason: "+ex.getMessage());
        }
        System.out.println("Process Terminated.");
        System.exit(0);
    }

बैचफाइल.बैट में तब हम कह सकते हैं:

@echo off
start /min C:\path\to\jarprogram.jar

-3

यदि आप जावा 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");
        }
    }
}

4
मुझे नहीं लगता कि यह ओपी के सवाल का जवाब देता है
श्री हर्ष चिलकापति
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.