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

vsmadaxz  于 2024-01-05  发布在  Java
关注(0)|答案(5)|浏览(197)

simple Eclipse plugin来运行Gradle,它只是使用命令行方式来启动Gradle。
什么是Gradle Analog for Maven compile and run mvn compile exec:java -Dexec.mainClass=example.Example
这样,任何带有gradle.build的项目都可以运行。
更新:以前也有类似的问题What is the gradle equivalent of maven's exec plugin for running Java apps?,但解决方案建议更改每个项目build.gradle

  1. package runclass;
  2. public class RunClass {
  3. public static void main(String[] args) {
  4. System.out.println("app is running!");
  5. }
  6. }

字符串
然后执行gradle run -DmainClass=runclass.RunClass

  1. :run FAILED
  2. FAILURE: Build failed with an exception.
  3. * What went wrong:
  4. Execution failed for task ':run'.
  5. > No main class specified

rta7y2nd

rta7y2nd1#

在gradle中没有与mvn exec:java直接等价的东西,你需要应用application插件或者有一个JavaExec任务。

application插件

激活插件:

  1. plugins {
  2. id 'application'
  3. ...
  4. }

字符串
按如下方式配置它:

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


在命令行上,

  1. $ gradle -PmainClass=Boo run

JavaExec任务

定义一个任务,比如execute

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


要运行,编写gradle -PmainClass=Boo execute

  1. $ gradle -PmainClass=Boo execute
  2. :compileJava
  3. :compileGroovy UP-TO-DATE
  4. :processResources UP-TO-DATE
  5. :classes
  6. :execute
  7. I am BOO!


mainClass是在命令行动态传入的属性。classpath被设置为拾取最新的类。
如果您没有传入mainClass属性,这两种方法都会如预期的那样失败。

  1. $ gradle execute
  2. FAILURE: Build failed with an exception.
  3. * Where:
  4. Build file 'xxxx/build.gradle' line: 4
  5. * What went wrong:
  6. A problem occurred evaluating root project 'Foo'.
  7. > Could not find property 'mainClass' on task ':execute'.

展开查看全部
p8h8hvxi

p8h8hvxi2#

你只需要使用Gradle Application plugin

  1. apply plugin:'application'
  2. mainClass = "org.gradle.sample.Main"

字符串
然后简单地gradle run
正如Teresa所指出的,您还可以将mainClass配置为系统属性,并使用命令行参数运行。

cfh9epnr

cfh9epnr3#

扩展First Zero的答案,我猜你想要的东西,你也可以运行gradle build没有错误。
gradle buildgradle -PmainClass=foo runApp都可以使用:

  1. task runApp(type:JavaExec) {
  2. classpath = sourceSets.main.runtimeClasspath
  3. main = project.hasProperty("mainClass") ? project.getProperty("mainClass") : "package.MyDefaultMain"
  4. }

字符串
在这里设置默认的主类。

twh00eeo

twh00eeo4#

你可以将其参数化并传递gradle clean build -Pprokey=再见

  1. task choiceMyMainClass(type: JavaExec) {
  2. group = "Execution"
  3. description = "Run Option main class with JavaExecTask"
  4. classpath = sourceSets.main.runtimeClasspath
  5. if (project.hasProperty('prokey')){
  6. if (prokey == 'hello'){
  7. main = 'com.sam.home.HelloWorld'
  8. }
  9. else if (prokey == 'goodbye'){
  10. main = 'com.sam.home.GoodBye'
  11. }
  12. } else {
  13. println 'Invalid value is enterrd';
  14. // println 'Invalid value is enterrd'+ project.prokey;
  15. }

字符串

展开查看全部
dhxwm5r4

dhxwm5r45#

如果使用KotlinDSL和gradle 8.5(或者更新的版本),似乎我需要这样写:
如果你使用“应用程序”插件,写入build.gradle.kts并运行为:./gradlew run

  1. plugins {
  2. application
  3. }
  4. application {
  5. mainClass.set("org.example.Main")
  6. }

字符串
或者,如果你使用“java”插件,它通过JavaExec任务类型定义了一个名为“runMe”的自定义任务,当运行./gradlew runMe时,它做的事情和上面一样。好的一面是,如果你有更多的带有main方法的类,现在你可以编写更多的任务。

  1. plugins {
  2. java
  3. }
  4. tasks.register<JavaExec>("runMe") {
  5. classpath = sourceSets["main"].runtimeClasspath
  6. mainClass = "org.example.Main"
  7. }


关于JavaExec的更多信息。API文档中的groovy示例不是很有帮助.

展开查看全部

相关问题