是否可以在 Gradle 中创建双重继承的自定义任务?

问题描述

我正在使用一堆外部库开发 Gradle(Groovy,而不是 Kotlin)库,我们有一个案例,我们希望通过外部库提供的自定义任务在我们的代码中实现双重继承. (作为参考,该库特别是 MarkLogic DataHub,我们正在扩展 RunFlowTask,但我已针对此示例进行了一些概括。引入了一些限制,但我相当确定它们都可以工作周围。)

我想要的是以下内容

ClassA.gradle

class ClassA extends com.external.plugin.TaskA {}

ClassB.gradle

import com.fasterxml.jackson.databind.ObjectMapper

class ClassB extends ClassA {}

...对事情需要的位置没有限制,只是它可以工作。值得注意的是,我们有一堆像 ClassA 这样的例子可以独立工作,我只需要再次扩展 ClassA。

我在下面详细介绍了我为使其工作而进行的一些尝试;任何关于我做错了什么的反馈都非常受欢迎,或者如果有关于构建事物的全新方式的任何建议,也非常感谢。

第一次尝试:

apply from: './ClassA'
apply from: './ClassB'

=> ClassB.gradle 中的“无法解析类 ClassA”,考虑到我对 Gradle 编译如何工作的了解,这很有意义。我尝试用 class ClassB... 替换 println ClassB 只是为了查看,并且打印没有问题。让我觉得 ClassA 需要提前编译,所以我很确定我在这里没有做错任何事情,它只是不起作用。

第二次尝试:

buildSrc/src/main/groovy/ClassA.gradle 存在并且和上面一样。

buildSrc/build.gradle

import com.fasterxml.jackson.databind.ObjectMapper

buildscript {
    repositories { }
    dependencies {
        classpath filetree(dir: '/path/to/dependencies',include: '*.jar') // includes jackson
    }
}

println ObjectMapper

println 有效,但我明白了:

/path/to/src/main/groovy/ClassA.groovy: 1: unable to resolve class com.fasterxml.jackson.databind.ObjectMapper
 @ line 1,column 1.
   import com.fasterxml.jackson.databind.ObjectMapper

...如果我将 buildscript 块复制到 ClassA 子模块中,或者如果我从 ClassA 子模块中删除导入,同样的事情。我的问题是我的导入有什么问题吗?似乎这应该有效,并且导入应该有效,但它们没有。

第三次尝试:

在此保留一些代码示例:我非常接近将 buildSrc 复制到 includeBuild 文件夹中,并且 ClassA 可作为顶级项目中的 TaskReference 访问,但我不知道如何从那里extend ClassA

gradle.includedBuild('subbuild').task(':ClassA') => org.gradle.composite.internal.IncludedBuildTaskReference gradle.includedBuild('subbuild').task(':UPMCRunFlowTask').resolveTask() => Task with path ':ClassA' not found in project ':subbuild'.

我的问题是有没有办法回溯到类引用,以便它实际上是可扩展的?我尝试深入研究设置一个 include './subbuild' 子项目并遇到了类似的问题。

欢迎任何帮助/建议 - 谢谢!

解决方法

答案是第二次尝试。在 build.gradle 中,它需要:

repositories {}
dependencies {
    implementation fileTree(dir: '/path/to/deps',include: ['*.jar'])
}

...子文件中不需要任何内容​​。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...