我有一个包含两个子项目的项目。
这些子项目之一“ A”包含正在发布到工件的代码。
另一个子项目“ B”的任务需要完全执行A代码中的一种方法。我可以用groovy复制逻辑,但是我实际上有什么方法可以让子项目B中的任务调用作为子项目A的一部分编译的代码吗?
我尝试在B中添加一个buildscript块,以将工件从A添加到类路径:
buildscript {
dependencies {
classpath project(':subproject-a')
}
}
...但是这给了我一个错误:
不能在脚本类路径定义中使用项目依赖项。
我不相信我可以将subproject-a移到buildSrc
,因为我还将其工件发布到maven存储库中,供其他项目使用。
答案 0 :(得分:1)
您遇到了鸡或鸡蛋的问题,在编译任何类之前,所有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')
}
}