如何在另一个子项目的 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')
   } 
}