繁体   English   中英

Groovy 如何构建自定义库并将其作为依赖项在项目中使用

[英]Groovy how can I build a custom library and use it in a project as dependency

我有一套我在很多地方使用的代码程序,我基本上试图将它移到一个库中。

所以我用一些单元测试创建了我的库,一切看起来都很有希望,至少在本地工作......

当我去我的项目并在本地删除文件然后尝试从我的库中将它们作为依赖项导入时,代码不起作用。

我总是收到这种错误

Class does not define or inherit an implementation of the resolved method abstract getProperty(Ljava/lang/String;)Ljava/lang/Object; of interface groovy.lang.GroovyObject.

我绝对不是 groovy 方面的专家,但基本上我在 Jenkins 和 Gradle 中使用它来进行管道和一些基本的打包或环境部署。

我可以展示我的 class:

class ConsoleRow implements Comparable {

...
    final Integer priority
    final String rowStatus
    final String message
    final String rowReportClass

    ConsoleRow(Integer priority, String status, String msg, String rowC) {
        this.priority = priority
        this.rowStatus = status
        this.message = msg
        this.rowReportClass = rowC
    }

    @Override
    int compareTo(Object o) {
        return this.priority <=> ((ConsoleRow) o).priority
    }

在尝试执行“this.priority”时,给我错误的行是这个实际的 compareTo

Caused by: java.lang.AbstractMethodError: Receiver class com.abc.insight.jenkins.ConsoleRow does not define or inherit an implementation of the resolved method abstract getProperty(Ljava/lang/String;)Ljava/lang/Object; of interface groovy.lang.GroovyObject.
        at com.abc.insight.jenkins.ConsoleRow.compareTo(ConsoleRow.groovy:24)
        at com.abc.insight.jenkins.ConsoleOutputHtmlBuilder.processOutput(ConsoleOutputHtmlBuilder.groovy:115)
        at com.abc.insight.jenkins.ConsoleOutputHtmlBuilder.processOutput(ConsoleOutputHtmlBuilder.groovy)
        at com.abc.insight.jenkins.ConsoleOutputHtmlBuilder.buildReport(ConsoleOutputHtmlBuilder.groovy:20)
        at com.abc.insight.jenkins.ConsoleOutputHtmlBuilder$buildReport.call(Unknown Source)
        at build_e548mc0tqjmi822clitlsycdk.runReport(C:\dev\repo\insight\insight-health-check\data-foundation\smoke-test\build.gradle:77)

调用 function 只是试图对这些对象的列表进行排序

    List<ConsoleRow> outputRows = []
    ...  
    return outputRows.sort()

让我真正感到困惑的部分是,如果我没有将库作为依赖项导入,而是直接在这个 repo 中执行此操作并将我的源代码放在我的 buildSrc\src\main\groovy\com\abc\insight 中,那么代码可以正常工作。 ..所以我真的认为这可能是我 package 并发布我的库的方式可能是错误的。

我真的很确定这是我的一些基本错误,因为我以前从未做过 groovy 库,但不知何故我无法让它工作。

可能是我的出版物是错误的,在我的图书馆方面,我正在使用这个插件来进行发布。

plugins {
    id 'groovy'
    id 'java-library'
    id 'base'
}

publishing {
    publications {
        maven(MavenPublication) {
            from components.java
        }
    }
}

我试图更改 components.groovy 但不知何故它不起作用。

任何想法或提示,我认为我的问题可能表明 groovy 确实缺乏一些专业知识,但查看文档和示例我无法弄清楚。

在我的 IDE 中进行一些调试,生成异常的 compareTo 看起来像这样。

public int compareTo(Object o) {
    CallSite[] var2 = $getCallSiteArray();
    return ScriptBytecodeAdapter.compareTo(this.priority, var2[0].callGroovyObjectGetProperty((ConsoleRow)ScriptBytecodeAdapter.castToType(o, ConsoleRow.class)));
}

在将代码移动到库https://docs.gradle.org/current/samples/sample_building_groovy_libraries.ZFC35FDC70D5FC69D269883A82EZC7时,我尝试遵循本指南和代码结构

感谢您的任何反馈

ps:我的代码可能看起来很奇怪,我首先尝试使用 def blablabla 来处理所有内容,但我在类型转换方面遇到了一些问题,但我认为这不是我面临的问题的原因。

无论如何,我在我的 IDE 中查看了生成的代码,我看到了很多 get 方法,只是不知道他们期望从哪里得到这个 getProperty

好的,这绝对是用户错误。 我正在使用 gradle 6.5.1 的分发版本当我执行 gradle 初始化来引导我的项目时,我获得了 gradle groovy-all 版本 2 的依赖项

implementation group: 'org.codehaus.groovy', name: 'groovy-all', version: '2.5.11'

我认为这是一个错误,刚刚更新到最新版本。

implementation group: 'org.codehaus.groovy', name: 'groovy-all', version: '3.0.9'

现在的问题是,我使用该库的项目也在使用 gradle 6.5.1 运行,所以可能是编译和使用之间的版本不匹配导致了问题。 通过恢复到 gradle 建议的正确版本,问题就消失了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM