如何从 Gradle 调用自定义 Java 方法

Esp*_*osa 4 java gradle

请问,在 Gradle 构建脚本中调用 Java 方法最方便的方法是什么?该方法包含我想在构建期间使用的功能;一个过于复杂的功能,无法成为脚本内的 Groovy 方法,但又不足以命令完整的自定义 Gradle 插件。

我的问题不是关于从 Gradle 运行 Java 应用程序。这将涉及分叉 JVM,并且没有简单的方法可以将输出发布回 Gradle,而我需要该输出。

最初我的代码位于 src/main/java 中,但必须尽早编译才能从 Gradle 构建脚本中调用。

然后我尝试将构建助手类移动到一个子模块项目,一个单类子模块,希望在调用主构建脚本之前构建子模块;我在那里放了:

 buildscript {
    dependencies {
       classpath 'this.project:build-helper:1.0-SNAPSHOT'
    }
 }
Run Code Online (Sandbox Code Playgroud)

build-helper子项目显然不是首先构建的,尽管作为settings.gradle第一个并且构建失败,因为依赖关系未被识别。看起来 buildscript 是在构建子模块之前评估的,在其他任何事情之前。噢!

lan*_*ava 7

有两个主要用例

源位于src/main/java当前项目中- 因此,定义 buildscript 类路径时该类不存在

选项:

  1. 使用JavaExec任务在另一个 JVM 中运行该类

  2. 构造URLClassLoadersourceSets.main.runtimeClasspath通过类加载器加载/运行该类

例如:

task doStuff {
    doLast {
        URL[] urls = sourceSets.main.runtimeClasspath.files as URL[]
        def classloader = new URLClassLoader(urls, null)
        Class myClass = classloader.load("foo.bar.MyClass")
        def myInstance = myClass.newInstance()
        Method method = myClass.getMethod("doStuff")
        method.invoke(myInstance)
    }
}
Run Code Online (Sandbox Code Playgroud)

来源在另一个项目中。- 因此该类将在定义 buildscript 类路径之前存在

在这种情况下,您可以将项目添加到 buildscript 类路径并调用它

buildscript {
    dependencies {
        classpath project(':other-project')
    }
}
task doStuff {
    doLast {
        def myClass = new MyClass()
        myClass.doStuff()
    }
}
Run Code Online (Sandbox Code Playgroud)