জার থেকে কীভাবে কোনও ক্লাস চালানো যায় যা এর ম্যানিফেস্ট ফাইলটিতে প্রধান-শ্রেণি নয়


166

আমার 4 টি ক্লাস সহ একটি জেআর রয়েছে, প্রত্যেকেরই মেইন পদ্ধতি রয়েছে। আমি প্রয়োজন অনুযায়ী তাদের প্রত্যেককে চালাতে সক্ষম হতে চাই। আমি লিনাক্স বক্সের কমান্ড-লাইন থেকে এটি চালানোর চেষ্টা করছি।

E.g. The name of my JAR is MyJar.jar

এটিতে মূল শ্রেণীর জন্য ডিরেক্টরি কাঠামো রয়েছে:

com/mycomp/myproj/dir1/MainClass1.class
com/mycomp/myproj/dir2/MainClass2.class
com/mycomp/myproj/dir3/MainClass3.class
com/mycomp/myproj/dir4/MainClass4.class

আমি জানি যে আমি আমার ম্যানিফেস্ট ফাইলটিতে একটি শ্রেণিকে প্রধান হিসাবে নির্দিষ্ট করতে পারি। তবে এমন কোন উপায় আছে যার মাধ্যমে আমি কমান্ড লাইনে কিছু যুক্তি নির্দিষ্ট করতে পারি যা আমি চালাতে চাই কোন ক্লাসটি চালাতে?

আমি এটি চেষ্টা করেছি:

jar cfe MyJar.jar com.mycomp.myproj.dir2.MainClass2 com/mycomp/myproj/dir2/MainClass2.class /home/myhome/datasource.properties /home/myhome/input.txt

এবং আমি এই ত্রুটি পেয়েছি:

com/mycomp/myproj/dir2/MainClass2.class : no such file or directory

(উপরের কমান্ডে, '/ home/myhome/datasource.properties' এবং '/home/myhome/input.txt' হ'ল কমান্ড লাইন আর্গুমেন্ট)।


নির্ভরতা ধরে রাখতে অন্য জারটি ব্যবহার করে কেবল তাদেরকে বিভিন্ন পাত্রে প্যাকেজ করবেন?
নিক

11
কমান্ড লাইন আর্গুমেন্টের ভিত্তিতে নির্দিষ্ট পদ্ধতিটিকে (4 টির বাইরে) কল করে এমন একক প্রধান শ্রেণি কেন নেই?
বলতে পারবেন না

উত্তর:


215

আপনি নিজের জারটিকে তার ম্যানিফেস্ট ফাইলটিতে মেইন-ক্লাস ছাড়াই তৈরি করতে পারেন। তারপরে:

java -cp MyJar.jar com.mycomp.myproj.dir2.MainClass2 /home/myhome/datasource.properties /home/myhome/input.txt

2
দস্তাবেজের মতে এটি কাজ করবে না: "এই বিকল্পটি কাজ করার জন্য, জেআর ফাইলের ম্যানিফেস্টে অবশ্যই ফর্মের একটি লাইন মেইন-ক্লাস: শ্রেণিকাম থাকা আবশ্যক :13"
থমাস

"মাইজার.জার থেকে মূল-শ্রেণীর ম্যানিফেস্ট এট্রিবিউটটি লোড করতে ব্যর্থ হয়েছে"
ভূষণ

10
টমাস ঠিক বলেছেন। আপনার "-জার" "" -সিপি "দিয়ে প্রতিস্থাপন করতে হবে। আমার আপডেট হওয়া কোডটি দেখুন
lxu4net

9
@ ক্রিসডিউ প্রদত্ত উত্তরটি মূল-শ্রেণীর বৈশিষ্ট্যটি সংশোধন / মুছে ফেলার মাধ্যমে জার ফাইলটি পরিবর্তন না করেই কাজ করে।
এড গ্রিবেল

155

জার ফাইলের একটি সংজ্ঞায়িত থাকলেও আপনি একটি জেআর ফাইল থেকে একটি পদ্ধতি আছে এমন কোনও ক্লাসকে কার্যকর করতে পারেন ।public final static mainMain-Class

প্রধান-শ্রেণি কার্যকর করুন:

java -jar MyJar.jar  // will execute the Main-Class

একটি public static void mainপদ্ধতি দিয়ে অন্য শ্রেণি চালিত করুন :

java -cp MyJar.jar com.mycomp.myproj.AnotherClassWithMainMethod

দ্রষ্টব্য: প্রথম ব্যবহার -jar, দ্বিতীয় ব্যবহার -cp


10
এবং আপনি যদি ক্লাসপথের বর্তমান ডিরেক্টরিতে থাকা সমস্ত জারগুলিও চান (যেমন, lib ডিরেক্টরি থেকে মূল শ্রেণীর চলমান) আপনি ইউনিক্স মেশিনগুলি প্রসারিত হওয়া থেকে বিরত java -cp "./*" com.mycomp.myproj.AnotherClassWithMainMethodরাখতে ডাবল কোটগুলি নোট করুন ./*। এছাড়াও লক্ষ করুন যে "./*.jar"কাজ করবে না।
পেট্র zjezdský

19

কল করা ছাড়াও java -jar myjar.jar com.mycompany.Myclass, আপনি নিজের ম্যানিফেস্টে মূল ক্লাসটিকে ডিসপ্যাচার ক্লাসেও তৈরি করতে পারেন।

উদাহরণ:

public class Dispatcher{

    private static final Map<String, Class<?>> ENTRY_POINTS =
        new HashMap<String, Class<?>>();
    static{
        ENTRY_POINTS.put("foo", Foo.class);
        ENTRY_POINTS.put("bar", Bar.class);
        ENTRY_POINTS.put("baz", Baz.class);
    }

    public static void main(final String[] args) throws Exception{

        if(args.length < 1){
            // throw exception, not enough args
        }
        final Class<?> entryPoint = ENTRY_POINTS.get(args[0]);
        if(entryPoint==null){
            // throw exception, entry point doesn't exist
        }
        final String[] argsCopy =
            args.length > 1
                ? Arrays.copyOfRange(args, 1, args.length)
                : new String[0];
        entryPoint.getMethod("main", String[].class).invoke(null,
            (Object) argsCopy);

    }
}

1
এটি এটি করার একটি ভাল বিকল্প উপায়! আমার জারটি "স্প্রিং-বুট: repackage" ব্যবহার করে তৈরি করা হয়েছিল, সুতরাং আমি "-cp" উপায়ে অন্যান্য প্রবেশের ক্লাস চালাতে পারি না। আমি জানি না যে বসন্ত-বুট প্লাগইনটি জারেটি কী করেছিল। এই ক্ষেত্রে, প্রেরণকারী শ্রেণি সহায়তা করে।
চিউ

6

এই উত্তরটি স্প্রিং-বুট ব্যবহারকারীদের জন্য:

যদি আপনার জেআর কোনও Spring-bootপ্রকল্প থেকে এসেছে এবং কমান্ডটি ব্যবহার করে তৈরি করা হয়েছে mvn package spring-boot:repackage, উপরের "-cp" পদ্ধতিটি কাজ করবে না। তুমি পাবে:

ত্রুটি: আপনার.এলটার্নাল.ক্লাস.পথটি মূল শ্রেণীর সন্ধান বা লোড করা যায় নি

এমনকি আপনি জেআর-এ ক্লাসটি দেখতে পারলেও jar tvf yours.jar

এই ক্ষেত্রে, নিম্নলিখিত কমান্ড দ্বারা আপনার বিকল্প শ্রেণি চালান:

java -cp yours.jar -Dloader.main=your.alternative.class.path org.springframework.boot.loader.PropertiesLauncher

আমি যেমন বুঝতে পেরেছি, স্প্রিং-বুটের org.springframework.boot.loader.PropertiesLauncherক্লাস প্রেরণকারী প্রবেশদ্বার শ্রেণীর কাজ করে এবং -Dloader.mainপ্যারামিটারটি কী চালায় তা জানায়।

তথ্যসূত্র: https://github.com/spring-projects/spring-boot/issues/20404


যদি আপনার জার কার্যকর হয়। উদাহরণস্বরূপ, আপনি যখন জারটি আনজিপ করুন, সমস্ত ক্লাসের আগে "/ বুট-আইএনএফ /
ক্লাসস

2

প্রথমত jarএকটি বয়াম তৈরি করে এবং এটি চালায় না। java -jarপরিবর্তে চেষ্টা করুন।

দ্বিতীয়ত, আপনি কেন এফকিউসিএন ( com.mycomp.myproj.dir2.MainClass2) এবং ফাইল ( com/mycomp/myproj/dir2/MainClass2.class) হিসাবে দুবার ক্লাস পাস করবেন ?

সম্পাদনা:

দেখে মনে হচ্ছে যেন java -jarএকটি নির্দিষ্ট শ্রেণি নির্দিষ্ট করা দরকার। java -cp your.jar com.mycomp.myproj.dir2.MainClass2 ...পরিবর্তে আপনি চেষ্টা করতে পারেন । -cpক্লাসপথে জার সেট করে এবং জাভাটিকে সেখানে প্রধান শ্রেণীর সন্ধান করতে সক্ষম করে।


আমি এখানে উল্লিখিত হিসাবে করেছি: download.oracle.com
জাভাস /

1
সেই পৃষ্ঠা থেকে: "জার ফাইল তৈরি বা আপডেট করার সময় এটি ব্যবহার করা যেতে পারে।" - সুতরাং এটি জার চালানোর জন্য নয়, প্রধান শ্রেণীর বৈশিষ্ট্যটি সেট করতে ব্যবহৃত হয়।
থমাস

1

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

মাইজার 1 .জার \ মেটা-ইনফ \ মনিফেস.এমএফ

Manifest-Version: 1.0
Main-Class: com.mycomp.myproj.dir1.MainClass1
Class-Path: MyJar.jar

মাইজার 2 .জার \ মেটা-ইনফ \ মনিফেস.এমএফ

Manifest-Version: 1.0
Main-Class: com.mycomp.myproj.dir2.MainClass2
Class-Path: MyJar.jar

ইত্যাদি। তারপর এটি দিয়ে চালান java -jar MyJar2.jar


-4

আপনার pom.xML ফাইলে প্লাগইনটি নীচে যুক্ত করুন এবং উপাদানটিতে সম্পূর্ণ যোগ্যতাসম্পন্ন নাম সহ প্রধান শ্রেণি নির্দিষ্ট করুন।

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>1.2.5.RELEASE</version>
    <configuration>
        <mainClass>**main Class name with full qualified name**</mainClass>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
        </execution>
    </executions>
</plugin>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.