Java sınıfını yürütmek için Gradle (build.gradle'ı değiştirmeden)


119

Gradle'ı çalıştırmak için komut satırı yolunu kullanan Gradle'ı çalıştırmak için basit Eclipse eklentisi var .

Maven derlemek ve çalıştırmak için gradle analoğu nedir mvn compile exec:java -Dexec.mainClass=example.Example

Bu şekilde herhangi bir proje gradle.buildçalıştırılabilir.

GÜNCELLEME: Benzer bir soru vardı, Java uygulamalarını çalıştırmak için maven'in exec eklentisinin gradle eşdeğeri nedir? daha önce soruldu, ancak çözüm her projeyi değiştirmeyi önerdibuild.gradle

package runclass;

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

Sonra çalıştırılıyor 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   


Şu komutu kullanın: gradle run
a_subscriber

Yanıtlar:


138

mvn exec:javaIn gradle'ın doğrudan bir eşdeğeri yoktur , applicationeklentiyi uygulamanız veya bir JavaExecgöreviniz olması gerekir .

application Eklenti

Eklentiyi etkinleştirin:

plugins {
    id 'application'
    ...
}

Aşağıdaki gibi yapılandırın:

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

Komut satırına yazın

$ gradle -PmainClass=Boo run

JavaExec görev

Bir görev tanımlayın, diyelim ki execute:

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

Koşmak için yazın gradle -PmainClass=Boo execute. Sen alırsın

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

mainClasskomut satırında dinamik olarak iletilen bir özelliktir. classpathen son sınıfları alacak şekilde ayarlandı.


Eğer geçmek yoksa mainClassmülkiyet, yaklaşımların her ikisi olarak beklenen başarısız.

$ 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
Değiştirmeniz gerekir build.gradle, java kaynak sınıf yolunuzdan java sınıflarını classpathalmak için kodlanmıştır . Sınıf yolunu çalıştırdığınızda bile , mevcut maven dizinindeki java kaynak dosyalarını alacak şekilde ayarlanır. Gelen görev, ben aynı şeyi. Java kaynağınız için değiştirin ve sınıf yolu otomatik olarak değişecektir. Eklentiyi uygulamanız veya bir göreve sahip olmanız için eşdeğeri yoktur . build.gradle mvn exec:javaJavaExecclasspathmvn exec:javagradleapplicationJavaExec
First Zero

1
VEYA diğer seçenek, bunu yapmak için kendi eklentinizi yazmanız ve o zaman bile eklentinizi almak için build.gradle'ı değiştirmeniz gerekir.
First Zero

3
Bunu denedim ve görünüşe göre task execute(...build.gradle'a ekledikten sonra diğer tüm görevler, gradle'ın mainClass'ın geçmesini beklediğini söyleyen aynı hata mesajıyla başarısız oluyor. Temizleyemem veya yapamam.
Nirro

4
@Nirei main = mainClassile değiştirin main = getProperty("mainClass")ve artık size bağırmayacak.
Adi Gerber

2
bu hala kırılıyor gradle build, aşağıdaki cevabıma bakın.
Matt

140

Gradle Application eklentisini kullanmanız yeterlidir :

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

Ve sonra basitçe gradle run.

Teresa'nın işaret ettiği mainClassNamegibi, bir sistem özelliği olarak da yapılandırabilir ve bir komut satırı argümanıyla çalıştırabilirsiniz.


2
Bu, bu tür her sınıfı içine sabit kodlamayı gerektirir build.graldle. Ancak her birinin ana yöntemi olan çok sayıda kullanım sınıfına sahip projelerim var.
Paul Verest

Ve eminsiniz 1) tam nitelikli sınıf adının doğru olduğundan 2) inşa dosyanıza doğru mülk adını koyduğunuzdan - örneğin System.getProperty("mainClass") , 3) kaynak kodu, geleneğe göre olması gereken yerdedir, 4) hepsi çalışır RunClassyapı dosyasını koyduğunuzda ?
Vidya

Bu, yalnızca çalışır build.gradlesahiptir mainClassName = "runclass.RunClass". Parametrenin bir -DmainClassetkisi yoktur: gradle run -DmainClass=runclass.RunClass2sabit kodlanmış ana sınıfı çalıştırır.
Paul Verest

3
İkisini de yaparsanız (dosya yaklaşımı ve özellik yaklaşımı), hangisinin öncelikli olduğunu bilmiyorum. Ya bu cevabı bulmalı ya da testinizde ikisini birden yapmamalısınız.
Vidya

2
@PaulVerest İşte yaptım: ext.mainClass = project.hasProperty('mainClass') ? project.getProperty('mainClass') : 'org.gradle.sample.Main' ; apply plugin:'application' ; mainClassName = ext.mainClass Şimdi yaptığınızda ana sınıf olarak gradle -PmainClass=Foo runkullanmalısınız Foo.
msridhar

26

First Zero'nun cevabını genişleterek, sanırım siz de koşabileceğiniz bir şey istiyorsunuz gradle build hatasız .

İkisi de gradle buildve gradle -PmainClass=foo runAppbununla çalışın:

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

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

varsayılan ana sınıfınızı ayarladığınız yer.


2
Imho, bu kabul edilen cevap olmalı. FirstZero'nun veya Vidya'nın yöntemini kullanmak, ana sınıfın belirtilmemesi nedeniyle diğer görevlerin şikayet etmesine neden olacaktır.
yanhan

Matt'in ana değeri belirleme yaklaşımı, uygulama eklentisi için de geçerli. Bunu Gradle Kotlin DSL ile kullanıyorum: plugins { application }; application { mainClassName = if (project.hasProperty("mainClass")) project.properties.get("mainClass").toString() else "Foo" }
pvillela

@Matt Bu yaklaşım Scanner, okumak için a kullanan basit Java programımı bozuyor nextLine(). Bunun için bir düzeltme hakkında herhangi bir fikriniz var mı? RunApp kullanarak çalışırken "satır bulunamadı" mesajını almaya devam edin.
Greg Hilston

2
Gelecekte bunu okuyan herkes için, gradle
yürütmemin

1

Parametrelendirebilir ve gradle clean build -Pprokey = güle güle geçebilirsiniz

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;
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.