请问,如何在Gradle构建脚本中调用Java方法最方便的方法是什么?此方法包含我想在构建期间使用的功能;一个功能太复杂,无法作为脚本Groovy方法,但不足以命令完全自定义Gradle插件。
我的问题不是关于从Gradle运行Java应用程序。这将涉及分支JVM,并且没有简单的方法如何将输出发布回Gradle,我需要输出。
最初我的代码在src / main / java中,但必须尽早编译才能在Gradle构建脚本中调用。
然后我尝试将构建助手类移动到子模块项目,一个子类子模块,希望在调用主构建脚本之前构建子模块;我放在那里:
buildscript {
dependencies {
classpath 'this.project:build-helper:1.0-SNAPSHOT'
}
}
但build-helper
子项目显然不是首先构建的,尽管在settings.gradle
中作为第一个并且构建失败,因为无法识别依赖项。似乎在构建子模块之前,在其他任何事情之前评估了buildscript。 d'!哦
答案 0 :(得分:2)
有两个主要用例
源位于当前项目中的src/main/java
- 因此,在定义buildscript类路径时该类不存在
选项:
使用JavaExec任务在另一个JVM中运行该类
从sourceSets.main.runtimeClasspath
构建URLClassLoader并通过类加载器加载/运行该课程
例如:
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()
}
}
答案 1 :(得分:2)
所以最简单的方法是将我的构建助手Java源代码放入buildSrc
目录:<project root dir>/buildSrc/src/main/java/foo/bar/Extractor.java
,就是这样,你可以直接从Gradle构建脚本的任何地方调用new Extractor(..).extratMetadata(...)
,不需要要导入包,不需要使用Java插件,默认情况下Gradle理解Maven就像buildScr下的目录结构一样。
致记:https://zeroturnaround.com/rebellabs/using-buildsrc-for-custom-logic-in-gradle-builds/