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

标签 java gradle

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

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

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

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

 buildscript {
    dependencies {
       classpath 'this.project:build-helper:1.0-SNAPSHOT'
    }
 }

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

最佳答案

有两个主要用例

源代码位于当前项目的 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)
    }
}

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

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

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

关于java - 如何从 Gradle 调用自定义 Java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47056554/

相关文章:

gradle - 如何在gradle中从外部传递版本范围

java - 无法解析以下类的父类(super class)型。请确保您在类路径 : 中具有所需的依赖项

java - Spring 服务中的 LazyInitializationException

gradle - 如何强制 gradle 在 Maven 系统范围内使用/共享 ~/.m2/repository?

java - 内置 gradle 插件的版本号是多少?

gradle - 将文件夹中的所有jar文件添加到类路径

java - 如何解决 Firebase 聊天应用程序中的错误

java - 将选项卡添加到 jTabbedPane,其中每个选项卡都有一个具有不同名称 java 的 textArea

java - String.format() 获取最大值

gradle - Groovy移除数组元素