জাভা ক্লাস চালানোর জন্য গ্রেডল (বিল্ড.gradle পরিবর্তন না করে)


119

এখানে সহজ উপগ্রহ প্লাগইন রয়েছেগ্রেডল চালানোর , এটি গ্রেড চালু করার জন্য কমান্ড লাইন উপায় ব্যবহার করে।

Maven সংকলন এবং রান জন্য গ্রেড এনালগ কি mvn compile exec:java -Dexec.mainClass=example.Example

এইভাবে যে কোনও প্রকল্প gradle.buildচালানো যেতে পারে।

আপডেট: অনুরূপ প্রশ্ন ছিল জাভা অ্যাপ্লিকেশনগুলি চালনার জন্য ম্যাভেনের এক্সিকিউটিভ প্লাগইনের গ্রেড সমতুল্য কী? আগে জিজ্ঞাসা করা হয়েছিল, তবে সমাধানটি প্রতিটি প্রকল্পের পরিবর্তনের পরামর্শ দেয়build.gradle

package runclass;

public class RunClass {
    public static void main(String[] args) {
        System.out.println("app is running!");
    }
}

তারপরে কার্যকর করা হচ্ছে gradle run -DmainClass=runclass.RunClass

:run FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':run'.
> No main class specified   


কমান্ডটি ব্যবহার করুন: গ্রেড চালানো
a_subscriber

উত্তর:


138

mvn exec:javaগ্রেডে কোনও সরাসরি সমতুল্য নয়, আপনাকে হয় applicationপ্লাগইন প্রয়োগ করতে হবে বা কোনও JavaExecকাজ করতে হবে।

application প্লাগ লাগানো

প্লাগইনটি সক্রিয় করুন:

plugins {
    id 'application'
    ...
}

এটি নিম্নলিখিত হিসাবে কনফিগার করুন:

application {
    mainClassName = project.hasProperty("mainClass") ? getProperty("mainClass") : "NULL"
}

কমান্ড লাইনে, লিখুন

$ gradle -PmainClass=Boo run

JavaExec কাজের

একটি কার্য সংজ্ঞা দিন, আসুন বলুন execute:

task execute(type:JavaExec) {
   main = project.hasProperty("mainClass") ? getProperty("mainClass") : "NULL"
   classpath = sourceSets.main.runtimeClasspath
}

চালাতে, লিখুন gradle -PmainClass=Boo execute। তুমি পাও

$ gradle -PmainClass=Boo execute
:compileJava
:compileGroovy UP-TO-DATE
:processResources UP-TO-DATE
:classes
:execute
I am BOO!

mainClassকমান্ড লাইনে গতিশীলভাবে পাস করা সম্পত্তি। classpathসর্বশেষ ক্লাস পিকআপ সেট করা হয়।


আপনি যদি mainClassসম্পত্তিটিতে পাস না করেন তবে উভয় পন্থা প্রত্যাশা অনুযায়ী ব্যর্থ হয়।

$ gradle execute

FAILURE: Build failed with an exception.

* Where:
Build file 'xxxx/build.gradle' line: 4

* What went wrong:
A problem occurred evaluating root project 'Foo'.
> Could not find property 'mainClass' on task ':execute'.

1
আপনাকে সংশোধন করতে হবে build.gradle, আপনার জাভা উত্সের ক্লাসপাঠ থেকে জাভা ক্লাসগুলি classpathবেছে নেওয়া শক্ত কোডিং od এমনকি আপনি যখন ক্লাসপথটি চালাচ্ছেন তখন বর্তমান ম্যাভেন ডিরেক্টরিতে জাভা উত্স ফাইলগুলি তুলতে সেট করা আছে। ইন টাস্ক, আমি একই কাজ করেছেন। আপনার জাভা উত্সের জন্য পরিবর্তন করুন এবং শ্রেণি পথটি স্বয়ংক্রিয়ভাবে পরিবর্তিত হবে। আপনার কোনও হয় সমতুল্য হয় হয় প্লাগইন প্রয়োগ করতে হবে বা কোনও কাজ করতে হবে। build.gradle mvn exec:javaJavaExecclasspathmvn exec:javagradleapplicationJavaExec
প্রথম জিরো

1
বা অন্য বিকল্পটি হ'ল এটি করার জন্য আপনি নিজের প্লাগইনটি লিখেছেন এবং তারপরেও আপনাকে আপনার প্লাগইনটি বাছতে build.gradle পরিবর্তন করতে হবে।
প্রথম জিরো

3
আমি কেবল এটি চেষ্টা করেছি এবং দেখে মনে হচ্ছে task execute(...বিল্ড.gradle যুক্ত করার পরে , প্রতিটি অন্যান্য কাজ একই ত্রুটি বার্তায় ব্যর্থ হয় যা জানায় যে গ্রেডেল আশা করে যে মেইনক্লাসটি পাশ হয়ে যাবে। আমি পরিষ্কার বা বিল্ড করতে পারি না।
নিরো

4
@ নিরেই সাবস্টিটিউট এর main = mainClassসাথে নিবন্ধ করুন main = getProperty("mainClass")এবং এটি আপনাকে আর চিত্কার করবে না।
আদি গারবার

2
এটি এখনও বিরতি gradle build, নীচে আমার উত্তর দেখুন।
ম্যাট

140

আপনার কেবল গ্রেডল অ্যাপ্লিকেশন প্লাগইন ব্যবহার করা দরকার :

apply plugin:'application'
mainClassName = "org.gradle.sample.Main"

এবং তারপর সহজভাবে gradle run

তেরেসা যেমন উল্লেখ করেছে, আপনি mainClassNameএকটি সিস্টেম সম্পত্তি হিসাবে কনফিগার করতে পারেন এবং একটি কমান্ড লাইন যুক্তি দিয়ে চালাতে পারেন।


2
এর জন্য প্রতিটি শ্রেণীর মধ্যে হার্ড কোডের প্রয়োজন build.graldle। তবে আমি প্রচুর ইউজ ক্লাস নিয়ে প্রজেক্ট করেছি, প্রত্যেকেরই মেইন মেথড থাকে।
পল ভেরেস্ট

এবং আপনি নিশ্চিত যে 1) পুরোপুরি যোগ্যতাসম্পন্ন শ্রেণীর নামটি সঠিক) 2 আপনি আপনার বিল্ড ফাইলটিতে সঠিক সম্পত্তির নাম রেখেছেন - যেমন System.getProperty("mainClass") , 3) উত্স কোড যেখানে এটি কনভেনশন অনুসারে অনুমিত হয়, 4) এটি সমস্ত কাজ করে আপনি RunClassবিল্ড ফাইল করা যখন ?
বিদ্যা

এটা শুধুমাত্র কাজ করে build.gradleগেছে mainClassName = "runclass.RunClass"। প্যারামিটারটির -DmainClassকোনও প্রভাব নেই: gradle run -DmainClass=runclass.RunClass2হার্ড-কোডড মেইনক্লাস কার্যকর করে।
পল ভেরেস্ট

3
যদি আপনি উভয়ই করেন (ফাইলের পদ্ধতির এবং সম্পত্তির পদ্ধতির তৈরি করুন) তবে আমি আসলে জানি না কোনটি প্রাধান্য পায়। আপনার উচিত হয় উত্তরটি খুঁজে পাওয়া উচিত বা আপনার পরীক্ষায় উভয়ই করা উচিত।
বিদ্যা

2
@ পালভেরেস্ট এখানে আমি যা করেছি তা এখানে: ext.mainClass = project.hasProperty('mainClass') ? project.getProperty('mainClass') : 'org.gradle.sample.Main' ; apply plugin:'application' ; mainClassName = ext.mainClass আপনি যখন করবেন তখন gradle -PmainClass=Foo runএটি Fooপ্রধান শ্রেণি হিসাবে ব্যবহার করা উচিত ।
মিশ্রধর

25

প্রথম জিরোর উত্তরটি প্রসারিত করে, আমি অনুমান করি যে আপনি এমন কিছু চান যেখানে আপনি gradle buildত্রুটি ছাড়াই চালাতে পারেন ।

উভয় gradle buildএবং gradle -PmainClass=foo runAppএই সঙ্গে কাজ:

task runApp(type:JavaExec) {
    classpath = sourceSets.main.runtimeClasspath

    main = project.hasProperty("mainClass") ? project.getProperty("mainClass") : "package.MyDefaultMain"
}

যেখানে আপনি আপনার ডিফল্ট প্রধান ক্লাস সেট করেছেন।


2
ইমো এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। ফার্স্টজিরোর বা বিদ্যা পদ্ধতিটি ব্যবহার করে মুখ্য শ্রেণি নির্দিষ্ট না হওয়ার কারণে অন্যান্য কাজগুলি অভিযোগ করতে পারে।
ইয়ানহান

ম্যাটটির মূল মান নির্ধারণের ক্ষেত্রে অ্যাপ্লিকেশন প্লাগইনের ক্ষেত্রেও কাজ করা হয়। আমি এটি plugins { application }; application { mainClassName = if (project.hasProperty("mainClass")) project.properties.get("mainClass").toString() else "Foo" }
গ্র্যাডল

@ ম্যাট এই পদ্ধতির ফলে আমার সাধারণ জাভা প্রোগ্রামটি ভেঙে যায় যা Scannerপড়তে ব্যবহার করে nextLine()। এই জন্য একটি স্থির উপর কোন চিন্তা? রান অ্যাপ ব্যবহার করে চলতে চলতে "কোনও লাইন পাওয়া যায় না" পেতে থাকুন।
গ্রেগ হিলস্টন

2
ভবিষ্যতে যে কারও কাছে এটি পড়ার জন্য, আমি আমার গ্রেড এক্সিকিউশনটিকে এখনও ইনপুটটিতে পাস করতে দিতে `স্ট্যান্ডার্ড ইনপুট = সিস্টেম.in` ব্যবহার করেছি
গ্রেগ হিলস্টন

0

আপনি এটিকে প্যারামিটারাইজ করতে পারেন এবং গ্রেডেল ক্লিন বিল্ড -Pprokey = বিদায় পাস করতে পারেন

task choiceMyMainClass(type: JavaExec) {
     group = "Execution"
    description = "Run Option main class with JavaExecTask"
    classpath = sourceSets.main.runtimeClasspath

    if (project.hasProperty('prokey')){
        if (prokey == 'hello'){
            main = 'com.sam.home.HelloWorld'
        } 
        else if (prokey == 'goodbye'){
            main = 'com.sam.home.GoodBye'
        }
    } else {
            println 'Invalid value is enterrd';

       // println 'Invalid value is enterrd'+ project.prokey;
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.