请问,在 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 类路径时该类不存在
选项:
使用JavaExec在另一个 JVM 中运行类的任务
构造一个URLClassLoader从
sourceSets.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/