Gradle执行Java类(无需修改build.gradle)


119

有一个简单的Eclipse插件可以运行Gradle,它仅使用命令行方式来启动gradle。

什么是用于Maven编译和运行的Gradle模拟 mvn compile exec:java -Dexec.mainClass=example.Example

这样,任何项目gradle.build都可以运行。

更新:有一个类似的问题,对于运行Java应用程序,maven的exec插件的等效功能是什么?之前问过,但是解决方案建议更改每个项目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 run
a_subscriber

Answers:


138

mvn exec:java在gradle中没有直接的等效项,您需要应用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:javaclasspath 时也将其设置为在当前maven目录中拾取Java源文件。在JavaExec任务中,我已经做了同样的事情。更改classpath为您的Java源和类路径会自动改变。没有- mvn exec:java相当于在gradle你需要或者应用的application插件或有JavaExec任务。
2014年

1
或另一个选择是您编写自己的插件来执行此操作,即使如此,您也必须更改build.gradle才能选择您的插件。
2014年

3
我刚刚尝试过,看来添加task execute(...到build.gradle后,其他所有任务都会失败,并显示相同的错误消息,告知gradle希望将mainClass传递出去。我无法清理或搭建。
Nirro

4
@Nirei替换main = mainClassmain = 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类的项目,每个类都有主要方法。
Paul Verest 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 '16

25

扩展第一零的答案,我想你想要的东西也可以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的方法将引起其他任务的抱怨。
延汉

Matt设置主要值的方法也适用于应用程序插件。我将其与Gradle Kotlin DSL配合使用: plugins { application }; application { mainClassName = if (project.hasProperty("mainClass")) project.properties.get("mainClass").toString() else "Foo" }
pvillela

@Matt这种方法破坏了我使用a Scanner读取的简单Java程序nextLine()。您对此有任何想法吗?使用runApp运行时,不断显示“找不到行”。
格雷格·希尔斯顿

2
任何人读这在未来,我用`standardInput = System.in`让我的gradle这个执行仍通过输入
格雷格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;
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.