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

Pau*_*est 113 java execution gradle

有一个简单的Eclipse插件来运行Gradle,它只是使用命令行方式来启动gradle.

什么是maven编译和运行的gradle模拟 mvn compile exec:java -Dexec.mainClass=example.Example

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

更新:有类似的问题maven的exec插件运行Java应用程序的gradle等价物是什么?之前问过,但解决方案建议改变每个项目build.gradle

package runclass;

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

然后执行 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   
Run Code Online (Sandbox Code Playgroud)

Vid*_*dya 138

您只需要使用Gradle Application插件:

apply plugin:'application'
mainClassName = "org.gradle.sample.Main"
Run Code Online (Sandbox Code Playgroud)

然后简单地说gradle run.

正如Teresa指出的那样,您还可以配置mainClassName为系统属性并使用命令行参数运行.

  • 如果你同时做(构建文件方法和属性方法),我实际上不知道哪个优先.您应该在测试中找到答案或不同时做. (3认同)
  • 这需要将每个这样的类硬编码为`build.graldle`.但是我有很多util类的项目,每个类都有main方法. (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`作为主类。 (2认同)

Fir*_*ero 128

使用mvn exec:java.作为一个例子,将以下内容放入application

plugins {
    id 'application'
    ...
}
Run Code Online (Sandbox Code Playgroud)

要运行JavaExec.你得到

application {
    mainClassName = project.hasProperty("mainClass") ? getProperty("mainClass") : "NULL"
}
Run Code Online (Sandbox Code Playgroud)

application是在命令行动态传递的属性.JavaExec准备接收最新的课程.

如果您未传入execute属性,则会按预期失败.

$ gradle -PmainClass=Boo run
Run Code Online (Sandbox Code Playgroud)

评论更新:

gradle -PmainClass=Boo executegradle中没有等效项,您需要应用应用程序插件或具有JavaExec任务.

  • @Nirei用'main = getProperty("mainClass")替换`main = mainClass`,它不会再对你大喊大叫. (4认同)
  • 我只是尝试了这一点,似乎在添加`task execute(...`到build.gradle)之后,每个其他任务都失败并显示相同的错误消息告诉gradle期望mainClass被传递.我不能做干净或构建. (3认同)
  • 你必须修改`build.gradle`,`classpath` 被硬编码为从你的`build.gradle` [tag:java] 源类路径中选取[tag:java] 类。即使当你运行 `mvn exec:java` 时,类路径也被设置为在当前 maven 目录中获取 java 源文件。在`JavaExec` 任务中,我也做了同样的事情。为您的 [tag:java] 源更改`classpath`,类路径将自动更改。在 `gradle` 中没有 - `mvn exec:java` 等价物,你需要应用 `application` 插件或有一个 `JavaExec` 任务。 (2认同)
  • 这仍然会破坏“渐变构建”,请参阅下面的答案。 (2认同)

Mat*_*att 22

扩展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"
}
Run Code Online (Sandbox Code Playgroud)

您在哪里设置默认主类.

  • 恕我直言,这应该是公认的答案。由于没有指定主类,因此使用FirstZero或Vidya的方法将引起其他任务的抱怨。 (2认同)
  • 对于将来阅读本文的任何人,我使用“standardInput = System.in”来允许我的 gradle 执行仍然传递输入 (2认同)