1

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

其中一个子项目“A”包含发布到工件的代码。

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

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

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

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

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

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

4

1 回答 1

1

你有一个先有鸡还是先有蛋的问题,在编译任何类之前,所有 Gradle 项目类加载器都已解决。这可以使用自定义配置和类加载器来解决

例如:

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')
   } 
} 
于 2019-06-08T06:51:23.827 回答