如何在另一个子项目的gradle任务中从一个子项目调用代码?

时间:2019-06-08 06:04:12

标签: gradle gradle-multi-project-build

我有一个包含两个子项目的项目。

这些子项目之一“ A”包含正在发布到工件的代码。

另一个子项目“ B”的任务需要完全执行A代码中的一种方法。我可以用groovy复制逻辑,但是我实际上有什么方法可以让子项目B中的任务调用作为子项目A的一部分编译的代码吗?

我尝试在B中添加一个buildscript块,以将工件从A添加到类路径:

buildscript {
    dependencies {
        classpath project(':subproject-a')
    }
}

...但是这给了我一个错误:

  

不能在脚本类路径定义中使用项目依赖项。

我不相信我可以将subproject-a移到buildSrc,因为我还将其工件发布到maven存储库中,供其他项目使用。

1 个答案:

答案 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')
   } 
}