जावा क्लास निष्पादित करने के लिए ग्रेडेड (बिल्ड.ग्रेडल को संशोधित किए बिना)


119

नहीं है सरल ग्रहण प्लगइन Gradle चलाने के लिए है कि बस का उपयोग करता है लांच Gradle करने के लिए लाइन रास्ता कमान,।

मावेन संकलन और चलाने के लिए क्या है ग्रेडिंग एनालॉग 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   

के संभावित डुप्लिकेट stackoverflow.com/questions/16350757/...
टेरेसा कैरिगन

कमांड का उपयोग करें: gradle run
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को लेने के लिए हार्डकोड किया गया है । यहां तक ​​कि जब आप क्लासपाथ चलाते हैं , तो वर्तमान मावेन डायरेक्टरी में जावा सोर्स फाइल्स को लेने के लिए सेट किया जाता है। में काम, मैं एक ही किया है। अपने जावा स्रोत के लिए बदलें और वर्ग पथ स्वचालित रूप से बदल जाएगा। वहाँ कोई नहीं है - या तो आप प्लगइन लागू करने की जरूरत है या एक कार्य के बराबर है । build.gradle mvn exec:javaJavaExecclasspathmvn exec:javagradleapplicationJavaExec
पहला शून्य

1
या दूसरा विकल्प यह है कि आप ऐसा करने के लिए अपना स्वयं का प्लगइन लिखें और तब भी आपको अपने प्लगइन को चुनने के लिए build.gradle को बदलना होगा।
पहला शून्य

3
मैंने बस यही कोशिश की और ऐसा लगता है कि task execute(...build.gradle को जोड़ने के बाद , हर दूसरा कार्य एक ही त्रुटि संदेश के साथ विफल हो जाता है जिसमें बताया गया है कि gradle mainClass को साथ पारित होने की उम्मीद करता है। मैं साफ या निर्माण नहीं कर सकता।
निरो

4
@Nirei स्थानापन्न के 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
@PaulVerest यहां मैंने वही किया है: ext.mainClass = project.hasProperty('mainClass') ? project.getProperty('mainClass') : 'org.gradle.sample.Main' ; apply plugin:'application' ; mainClassName = ext.mainClass जब आप gradle -PmainClass=Foo runइसे करते हैं तो इसे Fooमुख्य वर्ग के रूप में उपयोग करना चाहिए ।
सुश्रीधर

26

फ़र्स्ट ज़ीरो के जवाब पर विस्तार करते हुए, मुझे लगता है कि आप कुछ ऐसा चाहते हैं जहाँ आप 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
इम्हो यह स्वीकृत जवाब होना चाहिए। फर्स्टजेरो या विद्या की विधि का उपयोग करने से अन्य कार्यों के कारण मुख्य वर्ग निर्दिष्ट नहीं होने के कारण शिकायत करेंगे।
यान्हन y ’

मुख्य मूल्य निर्धारित करने के लिए मैट का दृष्टिकोण एप्लिकेशन प्लगइन के लिए भी काम करता है। मैं इसे plugins { application }; application { mainClassName = if (project.hasProperty("mainClass")) project.properties.get("mainClass").toString() else "Foo" }
ग्रेडेल कोटलिन

@ मैट यह दृष्टिकोण मेरे सरल जावा प्रोग्राम को तोड़ता है जो Scannerपढ़ने के लिए उपयोग करता है nextLine()। इसके लिए एक तय पर कोई विचार? RunApp का उपयोग करते समय "नो लाइन पाया" प्राप्त करते रहें।
ग्रेग हिल्स्टन

2
भविष्य में इसे पढ़ने वाले किसी व्यक्ति के लिए, मैंने अपने मानक निष्पादन को अभी भी इनपुट में पारित करने की अनुमति देने के लिए 'standardInput = System.in` का उपयोग किया था
16:42 पर ग्रेग हिल्स्टन

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;
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.