Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在另一个子项目的gradle任务中从一个子项目调用代码?_Gradle_Gradle Multi Project Build - Fatal编程技术网

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

如何在另一个子项目的gradle任务中从一个子项目调用代码?,gradle,gradle-multi-project-build,Gradle,Gradle Multi Project Build,我有一个包含两个子项目的项目 其中一个子项目A包含发布到工件的代码 另一个子项目B有一个任务,它需要做a代码中的一个方法所做的事情。我可以在groovy中复制逻辑,但是有没有办法让子项目B中的任务调用作为子项目A一部分编译的代码 我曾尝试在B中添加buildscript块,将工件从a添加到类路径: buildscript { dependencies { classpath project(':subproject-a') } } …但这给了我一个错误: 无法在

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

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

另一个子项目B有一个任务,它需要做a代码中的一个方法所做的事情。我可以在groovy中复制逻辑,但是有没有办法让子项目B中的任务调用作为子项目A一部分编译的代码

我曾尝试在B中添加buildscript块,将工件从a添加到类路径:

buildscript {
    dependencies {
        classpath project(':subproject-a')
    }
}
…但这给了我一个错误:

无法在脚本类路径定义中使用项目依赖项


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

您遇到了一个鸡或蛋的问题,在编译任何类之前,所有Gradle项目类加载器都已解决。这可以通过使用自定义配置和类加载器来解决

例如:


非常感谢。我需要做一些调整来让它工作:1。在构造类加载器时,我需要将this.class.classLoader作为父类传递,否则ServiceLoader将失败,并出现not a子类型错误。2.我需要添加一个“customTask.dependsOn”:subproject-a:assembly,以确保subproject-a的jar能够及时构建。3.我需要将subproject-a的一些依赖项添加到buildscript依赖项中。我仍然不太理解3,这种解决方法感觉像是一个巨大的难题。我尝试将这些依赖项作为自定义依赖项添加到子项目中,这看起来仍然是一个难题,但没有那么糟糕,但没有帮助。我在执行myMethod时出错,因为它无法加载资源或无法找到依赖项中的类。我更新了答案,使用java反射而不是groovy动态行为调用该方法。前面的解决方案可能导致通过项目类加载器调用该方法,从而导致您看到的问题。请删除您的漏洞并尝试新的解决方案谢谢您的更新!看起来异常实际上来自构造函数内部。我尝试将其更改为使用反射的构造函数对象,但没有任何效果。异常来自testcontainers内部,所以我四处查看了一下原因。事实证明他们使用了线程的上下文类加载器。在任务中设置它,然后重新设置它,似乎解决了这个问题。我现在遇到另一个异常,堆栈跟踪太长以至于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')
   } 
}