একটি জাভা প্রোগ্রামে অন্য জার চালাও


114

আমি বেশ কয়েকটি সাধারণ জাভা অ্যাপ্লিকেশন লিখেছিলাম যার নাম ছিল এজার, বিজার।

এখন আমি একটি জিইউআই জাভা প্রোগ্রাম লিখতে চাই যাতে ব্যবহারকারী এজারকে এক্সিকিউট করতে একটি বোতাম এ চাপতে পারে এবং বিজারকে কার্যকর করতে বোতাম বি টি চাপতে পারে।

এছাড়াও আমি আমার জিইউআই প্রোগ্রামে রান-টাইম প্রক্রিয়া বিশদটি আউটপুট দিতে চাই।

যেকোনো পরামর্শ?


31
কেন এটিকে ভোট দেওয়া হয়েছিল তা নিশ্চিত নয়। কেন তার অনুমানগুলি ভুল হতে পারে তাকে ব্যাখ্যা করুন, তবে প্রশ্নটিকে নিম্নচাঞ্চল করবেন না।
উইলিয়াম ব্রেন্ডেল

-১ বেসিক জাভা পরিভাষা সঠিকভাবে ব্যবহৃত হয় না এবং প্রশ্নটি খুব অস্পষ্ট এবং দ্বিতীয় অনুমানের জন্য অনেক কিছু ফেলে যায়। আপনার বিশদটি আরও বিশদ সহ পুনরায় বাক্য বিবেচনা করুন বা জাভা ক্লাসপাথ এবং অন্যান্য বেসিকগুলি সম্পর্কে প্রথমে পড়ুন।
topchef

21
@ গ্রিগরি: দেখুন, এখনই ডাউনভোটিংয়ের পরিবর্তে আপনার প্রথম স্থানটি জিজ্ঞাসা করা উচিত ছিল। আরও তথ্যের জন্য জিজ্ঞাসা না করেও ডাউনভোটিং কোনও ভাল কাজ করে না ...
উইলিয়াম ব্রেন্ডেল

4
@ উইলিয়াম, আপনার চেয়ে কয়েক সেকেন্ড পরে বোতামটি চাপানোর জন্য দুঃখিত sorry পরবর্তী মন্তব্যে আমি ভোট দেওয়ার আমার অধিকার সংরক্ষণ করি re প্রাথমিক প্রস্তুতি এবং / অথবা সমস্যাটি বোঝার বা উপস্থাপন করার প্রচেষ্টা ব্যতীত জিজ্ঞাসা করা প্রশ্নগুলি দেখে হতাশাব্যঞ্জক। ভোটদান আমার কাছে রেস্তোঁরায় একটি টিপের মতো: আপনি পরিষেবার মানের উপর নির্ভর করে স্ট্যান্ডার্ড 12% এর চেয়ে কম বা কম দেন। সুতরাং আসুন এখানে একমত হতে সম্মত হন।
topchef

1
@ টপচেফ আমি এ থেকে 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
ধন্যবাদ। আমি "ডির" প্যারামিটার সহ 3 টি পরামিতি সহ এক্সিকিউট () ফানক চেষ্টা করেছি এবং এটি কার্যকর হয় না। কেবল একটির সাথে আমাদের কেবল তিনটি ফাইল .jar একই জায়গায় রাখতে হবে
ডুক ট্রান

আপনি কি জানেন যে কীভাবে Runtimeজাভা অ্যাপ্লিকেশনটির অবজেক্ট পাবেন ?
stommestack

প্রসেসবিল্ডার ব্যবহার করে আমরা কী আরও বেশি বহনযোগ্য সংস্করণ ব্যবহার করতে পারি?
আনন্দ রকজ

প্রোগ্রাম "জাভা" চালানো যায় না: ক্রিয়েটপ্রসেস ত্রুটি = 2, সিস্টেম নির্দিষ্ট ফাইলটি খুঁজে পায় না। এই ত্রুটি পাওয়া।
ভদ্রলোক

27

.jar কার্যকর করা যায় না isn't ক্লাস ইনস্ট্যান্ট করুন বা কোনও স্থিতিশীল পদ্ধতিতে কল করুন।

সম্পাদনা: জেআর তৈরি করার সময় প্রধান-শ্রেণীর এন্ট্রি যুক্ত করুন।

> পি.এমএফ (পি.এমএফ এর বিষয়বস্তু)

প্রধান-শ্রেণি: 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
দ্রষ্টব্য: এটি কেবলমাত্র আপনার
পাথের

@ এভিডি: এজার ফাইলটি কোথায় রাখা উচিত?
লোগান

1
@ লোগান - একটি ডিরেক্টরি যেখানে আপনি একটি প্রোগ্রাম লোড করছেন In
অ্যাডটাপস্ট

এই পদ্ধতির নতুন জেভিএম প্রক্রিয়া তৈরি হবে বা বিদ্যমানটি ব্যবহার করবে?
রাহুলদীপ অট্রি

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')

নোট করুন এটি হ'ল হস্তক্ষেপের সম্ভাব্য সমস্ত সম্ভাবনার সাথে অধীনস্থ জারকে মেমরির স্থান এবং আপনার জারের সাথে একটি শ্রেণিপথ তৈরি করবে। আপনি যদি সেই জিনিসটি দূষিত না চান, তবে উপরে উল্লিখিত হিসাবে আপনার কাছে অন্যান্য বিকল্প রয়েছে - যথা:

  • এটিতে জার দিয়ে একটি নতুন ক্লাসলুডার তৈরি করুন। এটি আরও নিরাপদ; আপনি কমপক্ষে নতুন জারের জ্ঞানকে একটি মূল শ্রেণি লোডারের কাছে বিচ্ছিন্ন করতে পারেন যদি আপনি এমন জ্ঞান দিয়ে স্থপতি হন যে আপনি এলিয়েন জার ব্যবহার করছেন। আমাদের প্লাগিন সিস্টেমের জন্য আমরা আমার দোকানে এটি করি; প্রধান অ্যাপ্লিকেশনটি ক্লাসলোডার কারখানার সাথে একটি ছোট্ট শেল, এপিআইয়ের একটি অনুলিপি এবং জ্ঞান যে আসল অ্যাপ্লিকেশনটিই প্রথম প্লাগইন যার জন্য এটি একটি ক্লাসলোডার তৈরি করা উচিত। প্লাগইনগুলি একজোড়া জার - ইন্টারফেস এবং বাস্তবায়ন - যা একসাথে জিপ করা হয়। ক্লাসলয়েডাররা সমস্ত ইন্টারফেস শেয়ার করে, যখন প্রতিটি ক্লাসলোডারের কেবল নিজস্ব বাস্তবায়ন সম্পর্কে জ্ঞান থাকে। স্ট্যাকটি কিছুটা জটিল, তবে এটি সমস্ত পরীক্ষায় উত্তীর্ণ হয় এবং সুন্দরভাবে কাজ করে।
  • ব্যবহার 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

আপনি যদি জাভা ১.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
আমি মনে করি না এটি ওপি-র প্রশ্নের উত্তর দিয়েছে
শ্রী হর্ষ চিলকাপতি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.