如何在另一个子项目的 gradle 任务中调用一个子项目的代码?
How can I call code from one subproject in a gradle tasks of another subproject?
我有一个包含两个子项目的项目。
其中一个子项目 "A" 包含正在发布到工件的代码。
另一个子项目 "B" 有一项任务需要执行与 A 代码中的一个方法完全相同的任务。我可以复制 groovy 中的逻辑,但是有什么方法可以让我在子项目 B 中的任务调用作为子项目 A 的一部分编译的代码?
我尝试在 B 中添加一个构建脚本块,将 A 中的工件添加到类路径中:
buildscript {
dependencies {
classpath project(':subproject-a')
}
}
...但这给了我一个错误:
Cannot use project dependencies in a script classpath definition.
我不相信我可以将子项目-a 移动到 buildSrc
,因为我还将其工件发布到 maven 存储库以供其他项目使用。
您遇到先有鸡还是先有蛋的问题,所有 Gradle 项目类加载器在任何 类 编译之前都已解析。这可以使用自定义配置和 Classloader
来解决
例如:
configurations {
custom
}
dependencies {
custom project(':subproject-a')
}
task customTask {
doLast {
def urls = configurations.custom.files.collect { it.toURI().toURL() }
ClassLoader cl = new java.net.URLClassLoader(urls as URL[])
Class myClass = cl.loadClass('com.foo.MyClass')
// assuming zero args constructor
Object myObject = myClass.newInstance()
// assuming method which accepts single String argument
java.lang.reflect.Method myMethod = myClass.getMethod('myMethodName', String.class)
myMethod.invoke(myObject, 'methodArg')
}
}
我有一个包含两个子项目的项目。
其中一个子项目 "A" 包含正在发布到工件的代码。
另一个子项目 "B" 有一项任务需要执行与 A 代码中的一个方法完全相同的任务。我可以复制 groovy 中的逻辑,但是有什么方法可以让我在子项目 B 中的任务调用作为子项目 A 的一部分编译的代码?
我尝试在 B 中添加一个构建脚本块,将 A 中的工件添加到类路径中:
buildscript {
dependencies {
classpath project(':subproject-a')
}
}
...但这给了我一个错误:
Cannot use project dependencies in a script classpath definition.
我不相信我可以将子项目-a 移动到 buildSrc
,因为我还将其工件发布到 maven 存储库以供其他项目使用。
您遇到先有鸡还是先有蛋的问题,所有 Gradle 项目类加载器在任何 类 编译之前都已解析。这可以使用自定义配置和 Classloader
来解决例如:
configurations {
custom
}
dependencies {
custom project(':subproject-a')
}
task customTask {
doLast {
def urls = configurations.custom.files.collect { it.toURI().toURL() }
ClassLoader cl = new java.net.URLClassLoader(urls as URL[])
Class myClass = cl.loadClass('com.foo.MyClass')
// assuming zero args constructor
Object myObject = myClass.newInstance()
// assuming method which accepts single String argument
java.lang.reflect.Method myMethod = myClass.getMethod('myMethodName', String.class)
myMethod.invoke(myObject, 'methodArg')
}
}