gradle - 是否可以在 Gradle 中创建双重继承的自定义任务?
问题描述
我正在使用一堆外部库开发 Gradle(Groovy,而不是 Kotlin)库,并且我们有一个案例,我们希望在我们的代码中实现双重继承,而不是外部库提供的自定义任务。(作为参考,该库具体是 MarkLogic DataHub,我们正在扩展 RunFlowTask,但我已经为这个示例做了一些概括。引入了一些限制,但我相当肯定它们都可以工作大约。)
我想要的是以下内容:
ClassA.gradle
class ClassA extends com.external.plugin.TaskA {}
B类.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'])
}
...并且子文件中不需要任何内容。
推荐阅读
- git - 错误:无法写入配置文件,资源暂时不可用和警告:无法取消链接
- spring-boot - Spring 云安全与 Spring 安全
- mysql - MySQL 转义字符
- angular - 在 IONIC 3 中下载多个文件时出现错误代码 3(连接错误)
- spring-boot - 如何在 Spring 中添加 HTTP“Feature-Policy”标头
- celery - 如何为 celery-sqs 中的不同队列设置不同的 visibility_timeout
- python - DataFrame 的字典列表
- python - lapjv - 非法指令(核心转储)
- java - Spring Boot - 白标签错误
- testing - Jmeter在另一个请求中解析特定的ID