গ্রেডল সহ রান্নেবল জেআর তৈরি করা


148

এখন অবধি আমি Eclipse "রফতানি ..." ফাংশনলিটির মাধ্যমে চলমানযোগ্য JAR ফাইলগুলি তৈরি করেছিলাম তবে এখন বিল্ড অটোমেশনের জন্য আমি IntelliJ IDEA এবং গ্রেডলে স্যুইচ করেছি।

এখানে কিছু নিবন্ধগুলি "অ্যাপ্লিকেশন" প্লাগইন প্রস্তাব করে তবে এটি সম্পূর্ণরূপে আমার প্রত্যাশিত ফলাফলের দিকে পরিচালিত করে না (কেবল একটি জেআর, কোনও প্রারম্ভিক স্ক্রিপ্ট বা এর মতো কিছুই) না।

"রফতানি ..." কথোপকথনটি দিয়ে আমি কীভাবে একই ফলাফল গ্রহণ করতে পারি?

উত্তর:


164

একটি এক্সিকিউটেবল জার ফাইল হ'ল একটি জার ফাইল যা এর ম্যানিফেস্টে একটি মেইন-ক্লাস এন্ট্রি ধারণ করে। সুতরাং আপনাকে এই ম্যানিফেস্টে এই এন্ট্রিটি যুক্ত করতে কেবল জার টাস্কটি কনফিগার করতে হবে :

jar {
    manifest {
        attributes 'Main-Class': 'com.foo.bar.MainClass'
    }
}

আপনাকে ম্যানিফেস্টে ক্লাসপথ এন্ট্রি যুক্ত করতেও পারে, তবে এটি একই পদ্ধতিতে করা হবে।

Http://docs.oracle.com/javase/tutorial/depدام/jar/manifestindex.html দেখুন


6
এটি আমি যা খুঁজছিলাম বলে মনে হচ্ছে; কিন্তু: আমি বিল্ড। এড্রেলেডের মধ্যে ইতিমধ্যে নির্ভরতা ঘোষণা করেছি, আমাকে কি সত্যই ক্লাসের পথটি যুক্ত করতে হবে বা আমি আমার নির্ভরতা ঘোষণাকে পুনরায় ব্যবহার করতে পারি?
হ্যানস

আপনার 'রানটাইম' কনফিগারেশনের ভিতরে লাইব্রেরিগুলি লুপ করতে এবং ক্লাস-পাথের বৈশিষ্ট্যটির মান তৈরি করার জন্য তাদেরকে সম্মতি জানাতে সক্ষম হওয়া উচিত।
জেবি নিজত

3
"রানটাইম" কনফিগারেশন 'inseid দিয়ে আপনার অর্থ কী? বোকা প্রশ্নের জন্য দুঃখিত, গ্রেডলে আমি বেশ নতুন ...
হ্যানস

গ্রেড জাভা প্লাগইনটি 4 টি বিভিন্ন শ্রেণিপথের সাথে সম্পর্কিত 4 ​​"কনফিগারেশন" সংজ্ঞায়িত করে: সংকলন (জাভা ফাইলগুলি সংকলন করতে ব্যবহৃত), টেস্টকম্পাইল (যা পরীক্ষা জাভা উত্স ফাইলগুলি সংকলন করতে ব্যবহৃত হয়), রানটাইম (যা অ্যাপ্লিকেশনটি কার্যকর করতে ব্যবহৃত হয়) এবং টেস্টআরটাইম (যা পরীক্ষাগুলি চালাতে ব্যবহৃত হয়)। গ্রেড.এল.ইউ
জেবি নিজেট

আহ, ধন্যবাদ - আমি জেআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআহ জন্য জরিটি তৈরি করার জন্য আমি এটি সঠিকভাবে বুঝতে পেরেছিলাম, এখন আমি ক্লাসপথ তৈরি করে ঝাঁকুনি দিচ্ছি ;-) আপনার সহায়তার জন্য অনেক ধন্যবাদ!
হ্যানস

98

জেবি নিজেট এবং জর্জি_বি এর উত্তর দুটিই সঠিক।

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

আবেদন প্লাগইন একটি বিকল্প পদ্ধতির প্রদান করে; এক্সিকিউটেবল জেআর তৈরির পরিবর্তে এটি সরবরাহ করে:

  • runসহজেই অ্যাপ্লিকেশনটি বিল্ড থেকে চালানোর সুবিধার্থে একটি কাজ
  • এমন একটি installDistকার্য যা ডিরেক্টরি তৈরি করে জেআর, এটি নির্ভর করে এমন সমস্ত জেআর এবং একটি স্টার্টআপ স্ক্রিপ্ট যা আপনাকে চালাতে পারে এমন একটি প্রোগ্রামের সাথে এটি সমস্ত এক সাথে টেনে নিয়ে যায় including
  • distZipএবং distTarকার্যসমূহ যা সম্পূর্ণ অ্যাপ্লিকেশন বিতরণ (স্টার্টআপ স্ক্রিপ্ট এবং জেআরএস) সংরক্ষণাগার তৈরি করে

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


স্রেফ ছায়া এবং এক-জারের চেষ্টা করেছেন। আমি এক-জারে আটকে থাকব: এটি সহজ এবং ব্যবহার সহজ। শান্ত! ধন্যবাদ
Jako

দুর্ভাগ্যক্রমে গ্রেডলের সাম্প্রতিক সংস্করণগুলির সাথে ওয়ান-জার কাজ করে না। উদাহরণস্বরূপ, github.com/rholder/gradle-one-jar/issues/34
ফার্সিকাল

জার টাস্কটি সংশোধন করে ওয়ান-জার তৈরির জন্য এখানে একটি ওয়ান-লাইনারের সমাধান দেওয়া হয়েছে। আমি এটি সবচেয়ে সুবিধাজনক বলে মনে করেছি। নোট করুন যে আপনাকে configurations.runtimeএকক জারে রানটাইম নির্ভরতা বান্ডিল করতে হবে ।
কাজী ইরফান

আমি আমার প্রয়োজনের জন্য উপযুক্ত এবং নমনীয় হতে "অ্যাপ্লিকেশন প্লাগইন" পেয়েছি। এটি জিপতে সমস্ত কিছু প্যাক করতে এবং সেই জিপগুলিতে অতিরিক্ত ফাইলগুলি অন্তর্ভুক্ত / বাদ দিতে দেয় allows এছাড়াও, কাস্টম টাস্কটি ব্যবহার করে অতিরিক্ত এন্ট্রি পয়েন্ট সহ আরও একটি লঞ্চার স্ক্রিপ্ট যুক্ত করা সম্ভব।
কিন্নোর্নিওয়ান

আমি কিভাবে চালানো হবে .tar/ .zipউত্পন্ন ফাইল?
টোবিক

35

অন্যরা যেমন উল্লেখ করেছে, একটি জার ফাইলটি কার্যকর করার জন্য, অ্যাপ্লিকেশনটির প্রবেশের স্থানটি Main-Classম্যানিফেস্ট ফাইলের বৈশিষ্ট্যে সেট করতে হবে । যদি নির্ভরতা শ্রেণীর ফাইলগুলি সংঘবদ্ধ না হয়, তবে সেগুলি Class-Pathম্যানিফেস্ট ফাইলের প্রবেশের মধ্যে সেট করা দরকার ।

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

আপনার সুবিধার্থে নীচে এখান থেকে একটি অনুলিপি দেওয়া আছে ..

[কীভাবে] উপ-ডিরেক্টরিতে নির্ভরতা জারের সাথে একটি বিতরণ জিপ ফাইল তৈরি /libকরুন Class-Pathএবং ম্যানিফেস্ট ফাইলটিতে প্রবেশের জন্য সমস্ত নির্ভরতা যুক্ত করুন:

apply plugin: 'java'
apply plugin: 'java-library-distribution'

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.apache.commons:commons-lang3:3.3.2'
}

// Task "distZip" added by plugin "java-library-distribution":
distZip.shouldRunAfter(build)

jar {
    // Keep jar clean:
    exclude 'META-INF/*.SF', 'META-INF/*.DSA', 'META-INF/*.RSA', 'META-INF/*.MF'

    manifest {
        attributes 'Main-Class': 'com.somepackage.MainClass',
                   'Class-Path': configurations.runtime.files.collect { "lib/$it.name" }.join(' ')
    }
    // How-to add class path:
    //     /programming/22659463/add-classpath-in-manifest-using-gradle
    //     https://gist.github.com/simon04/6865179
}

এখানে একটি টুকরো হিসাবে হোস্ট ।

ফলাফলটি পাওয়া যাবে build/distributionsএবং আনজিপড সামগ্রীগুলি দেখতে দেখতে:

lib / commons-lang3-3.3.2.jar
MyJarFile.jar

এর উপাদানসমূহ MyJarFile.jar#META-INF/MANIFEST.mf:

ম্যানিফেস্ট-সংস্করণ: 1.0
মূল-শ্রেণি: com.somepackage.ManeClass
শ্রেণি-পথ: lib / Commons-lang3-3.3.2.jar


বর্তমান অ্যাপ্লিকেশন জারটি বিতরণের 'lib' ডিরেক্টরিতেও থাকবে। আপনাকে এটি শীর্ষ ডিরেক্টরিতে নিয়ে যেতে হবে বা এই লাইনটি পরিবর্তন করতে হবে: 'শ্রেণি-পথ': কনফিগারেশন.আরুনটাইম.ফাইলস .c "lib / $ it.name"} .জাইন ('')} এ: 'ক্লাস-পাথ': কনফিগারেশন.আরুনটাইম.ফাইলস.কলেক্ট করুন {"$ it.name"} .জয়েন ('')}
মার্ক নুরি

1
আপনি কি নিশ্চিত? আমি আমার অ্যাপ্লিকেশনের জন্য এই পদ্ধতির ব্যবহার করার চেষ্টা এবং বর্তমান আবেদন বয়াম ছিল না মধ্যে libউত্পাদিত জিপ / আলকাতরা ফাইলের ডিরেক্টরি, বরং ছিল libএর পেরেন্ট ডাইরেক্টরি, যেমন এই উত্তর দাড়ায়। এই সমাধানটি আমার পক্ষে নিখুঁতভাবে কাজ করবে বলে মনে হয়েছিল।
thejonwithnoh

1
@ তেজোনভিথনহ আমি দুঃখিত, আপনি ঠিক বলেছেন "জাভা-গ্রন্থাগার-বিতরণ" প্লাগইন ব্যবহার করার প্রস্তাবিত সমাধানটি আমি দেখতে পাইনি। আমার ক্ষেত্রে আমি কেবল "অ্যাপ্লিকেশন" প্লাগইনটি ব্যবহার করছি যা মূল পার্থক্যটির সাথে একই কাজ করে যে সমস্ত জার ফাইল ( অ্যাপ্লিকেশন জার সহ ) "লিবিব" ডিরেক্টরিতে অবস্থিত। সুতরাং পরিবর্তন "lib/$it.name"করতে কাজ "$it.name"করবে।
মার্ক নুরি

28

গ্রেড-শ্যাডো-প্লাগইনটি ব্যবহার করা আমার পক্ষে সর্বনিম্ন প্রচেষ্টা সমাধান ছিল

প্লাগিন প্রয়োগের পাশাপাশি যা করা দরকার তা হ'ল:

আপনার প্রধান শ্রেণিকে ম্যানিফেস্টে রাখার জন্য জার টাস্কটি কনফিগার করুন

jar {
  manifest {
   attributes 'Main-Class': 'com.my.app.Main'
  }
}

গ্রেড টাস্ক চালান

./gradlew shadowJar

বিল্ড / লাইবস / থেকে অ্যাপ্লিকেশন-সংস্করণ-all.jar নিন

এবং পরিশেষে এর মাধ্যমে এটি সম্পাদন করুন:

java -jar app-version-all.jar


আমি যখন এই বিল্ডটি করি তখন আমি বিল্ড সাফল্য পেতে পারি তবে যখন আমি জাভা-জার-বিল্ড / লাইবস / কোর-অল-1.0.ar দিয়ে জার ফাইলটি চালানোর চেষ্টা করি তখন আমি নিম্নলিখিত ত্রুটিটি পেয়েছি: ত্রুটি: মূল শ্রেণীর স্ক্যানারগুলি পরিবর্তন করতে পারে না বা লোড করা যায়নি। মূল কারণে: java.lang.ClassNotFoundException: स्क্যানারস.সচেঞ্জ.মেন আপনি কি জানেন আমি কীভাবে এটি সমাধান করতে পারি?
লুকা লোপুসিনা

@ লুকালুপুসিনা আপনি যে ক্লাসটি নির্দিষ্ট করেছেন তা আপনার জেআর ফাইলগুলিতে নেই। আপনি যদি কোটলিন ব্যবহার করছেন তবে আপনার বলা দরকার 'com.my.app.MainKt'। আরও তথ্য ছাড়া, আমি আপনাকে আর সাহায্য করতে পারে না।
বাইকসর

বর্তমান প্লাগইন শ্যাডো ভি 5। + কেবল গ্রেডেল 5.0+ এবং জাভা 7+ এর সাথে সামঞ্জস্যপূর্ণ।
জোন

5

আপনি কি 'ইনস্টল অ্যাপ' কাজটি ব্যবহার করে দেখেছেন? এটি কি স্টার্ট স্ক্রিপ্টগুলির সেট দিয়ে একটি সম্পূর্ণ ডিরেক্টরি তৈরি করে না?

http://www.gradle.org/docs/current/userguide/application_plugin.html


আমি যা বুঝি তা থেকে installAppকোনও META-INF/MANIFEST.MFফাইল তৈরি হয় না । আমি কি ভুল কিছু করছি?

1
আমি অ্যাপ্লিকেশন প্লাগিনেরinstallApp কার্য তালিকায় টাস্কটি দেখছি না । আপনি কি পরিবর্তে বোঝাতে চেয়েছিলেন? installDist
কাজী ইরফান

2
হ্যাঁ, গ্রেডল 3.0 এ installAppনতুন নামকরণ করা installDistহয়েছিল। এখানে প্রকাশের নোটটি দেওয়া আছে
কাজী ইরফান

4

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

plugins {
  id 'java' 
  id 'com.github.johnrengelman.shadow' version '1.2.2'
}
...
...
apply plugin: 'application'
apply plugin: 'com.github.johnrengelman.shadow'
...
...
mainClassName = 'com.acme.myapp.MyClassMain'
...
...
...
shadowJar {
    baseName = 'myapp'
}

গ্রেড শেডোজার চালানোর পরে আপনি আপনার বিল্ড ফোল্ডারে মায়াপ- {সংস্করণ}-all.jar পাবেন যা জাভা-মাইয়ার-অ্যাপ্লিকেশন all-all.jar হিসাবে চালানো যেতে পারে।


3

আপনি মডিউল সেটিংসে (বা প্রকল্পের কাঠামো) একটি জার আর্টিক্ট সংজ্ঞায়িত করতে পারেন।

  • নির্ভরতা সহ মডিউলগুলি থেকে মডিউল> মডিউল সেটিংস> শিল্পকর্মগুলি> +> জার> টিপুন Right
  • প্রধান ক্লাস সেট করুন।

জার তৈরি করা তখন বিল্ড মেনু থেকে "বিল্ড আর্টফ্যাক্ট ..." ক্লিক করার মতোই সহজ। বোনাস হিসাবে, আপনি সমস্ত নির্ভরতা একক জারে প্যাকেজ করতে পারেন।

ইন্টেলিজ আইডিইএ 14 আলটিমেটে পরীক্ষিত।


2

আমি সমাধানের জন্য বেশ কয়েকটি লিঙ্ক পরীক্ষা করেছি, শেষ পর্যন্ত নীচে বর্ণিত পদক্ষেপগুলি এটির কাজ করার জন্য করেছিলাম। আমি গ্রেডেল ২.৯ ব্যবহার করছি।

আপনার বিল্ড, গ্রেড ফাইলটিতে নিম্নলিখিত পরিবর্তনগুলি করুন:

  1. প্লাগইন উল্লেখ করুন:

    apply plugin: 'eu.appsatori.fatjar'
  2. বিল্ডস্ক্রিপ্ট সরবরাহ করুন:

    buildscript {
    repositories {
        jcenter()
    }
    
    dependencies {
        classpath "eu.appsatori:gradle-fatjar-plugin:0.3"
    }
    }
  3. প্রধান শ্রেণি সরবরাহ করুন:

    fatJar {
      classifier 'fat'
      manifest {
        attributes 'Main-Class': 'my.project.core.MyMainClass'
      }
      exclude 'META-INF/*.DSA', 'META-INF/*.RSA', 'META-INF/*.SF'
    }
  4. ফত্জার তৈরি করুন:

    ./gradlew clean fatjar
  5. / বিল্ড / লাইবস / থেকে ফাত্জারটি চালান:

    java -jar MyFatJar.jar

1
2019 থেকে: এই পরামর্শটি এখানে কার্যকর হয় না। কোনও নির্ভরতা ফত্জারে অন্তর্ভুক্ত করা হয়নি
কার্ল

1

আপনি স্প্রিংবুট প্লাগইন ব্যবহার করতে পারেন:

plugins {
  id "org.springframework.boot" version "2.2.2.RELEASE"
}

জার তৈরি করুন

gradle assemble

এবং তারপর এটি চালান

java -jar build/libs/*.jar

দ্রষ্টব্য: এই প্লাগইনটি ব্যবহার করার জন্য আপনার প্রকল্পটির একটি স্প্রিংবুট প্রকল্প হওয়ার দরকার নেই।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.