Javaクラスを実行するGradle(build.gradleを変更せずに)


119

Gradleを実行するためのシンプルなEclipseプラグインがあり、コマンドラインを使用してGradleを起動します。

Mavenのコンパイルと実行のためのgradle analogは何ですか mvn compile exec:java -Dexec.mainClass=example.Example

このようにして、プロジェクトをgradle.build実行できます。

更新:同様の質問がありましたJavaアプリケーションを実行するためのMavenのexecプラグインに相当するGradleは何ですか?以前に尋ねましたが、ソリューションはすべてのプロジェクトを変更することを提案しました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   


コマンドを使用する:
gradle

回答:


138

mvn exec:javaGradleに直接相当するものはありません。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.gradleclasspath拾うためにハードコードされたJavaのあなたからクラスをbuild.gradle Javaのソースのクラスパス。mvn exec:javaクラスパスを実行しても、現在のmavenディレクトリにあるJavaソースファイルを取得するように設定されています。JavaExec作業、私は同じことを行っています。変更classpathあなたのためのJavaソースとクラスパスが自動的に変更されます。プラグインを適用するか、タスクを実行する必要があるので、mvn exec:java同等のものはありません。gradleapplicationJavaExec
First Zero

1
または、他のオプションは、これを行うために独自のプラグインを作成し、それでもプラグインを取得するようにbuild.gradleを変更する必要があることです。
First Zero、

3
私はこれを試したところtask execute(...、build.gradle に追加した後、gradleがmainClassが渡されることを期待していることを示す同じエラーメッセージで他のすべてのタスクが失敗したようです。クリーンアップやビルドはできません。
Nirro

4
@Nireiで代用main = mainClassするmain = getProperty("mainClass")と、怒鳴ることはもうありません。
Adi Gerber

2
これはまだ壊れgradle buildます、以下の私の答えを見てください。
マット

140

Gradle Applicationプラグインを使用する必要があるだけです。

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

そして単にgradle run

Teresaが指摘するようmainClassNameに、システムプロパティとして構成し、コマンドライン引数を指定して実行することもできます。


2
そのようなクラスをすべてにハードコードする必要がありbuild.graldleます。しかし、私は多くのutilクラスを使用するプロジェクトを持っています。そのすべてにmainメソッドがあります。
ポールベレスト2014年

そして、あなたは確かに1)完全に修飾されたクラス名が正しい2)ビルドファイルに正しいプロパティ名を入れます- たとえば System.getProperty("mainClass")、3)ソースコードは、慣例に従って想定されている場所にあります。4)すべて機能します。RunClassビルドファイルを入れたら?
Vidya、2014年

が機能するのbuild.gradleは、のみmainClassName = "runclass.RunClass"です。パラメータ-DmainClassは効果がありません gradle run -DmainClass=runclass.RunClass2。ハードコードされたメインクラスを実行します。
Paul Verest、2014年

3
両方を実行する場合(ビルドファイルアプローチとプロパティアプローチ)、どちらが優先されるのか実際にはわかりません。テストでその答えを見つけるか、両方を行わないでください。
Vidya 2014年

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、メインクラスとして使用する必要があります。
msridhar

25

First Zeroの答えを拡張すると、gradle buildエラーなしで実行できる何かが必要だと思います。

両方gradle buildgradle -PmainClass=foo runAppこれで動作します:

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

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

デフォルトのメインクラスを設定する場所。


2
これは受け入れられるべき答えです。FirstZeroのメソッドまたはVidyaのメソッドを使用すると、メインクラスが指定されていないため、他のタスクで問題が発生します。
ヤンハン

メインの値を設定するマットのアプローチは、アプリケーションプラグインでも機能します。私はそれをGradle Kotlin DSLで使用しています: plugins { application }; application { mainClassName = if (project.hasProperty("mainClass")) project.properties.get("mainClass").toString() else "Foo" }
pvillela 2018

@Mattこのアプローチは、a Scannerを使用して読み取る単純なJavaプログラムを壊しますnextLine()。これの修正について何か考えはありますか?runAppを使用して実行すると、「行が見つかりません」が発生し続けます。
グレッグヒルストン、

2
将来これを読む人には、 `standardInput = System.in`を使用して、gradleの実行で入力を渡すことができるようにしました
Greg Hilston

0

あなたはそれをパラメータ化してgradle clean build -Pprokey = goodbyeを渡すことができます

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.