首页 > 解决方案 > Groovy @CompileStatic 和 @TypeChecked 顺序、错误或误解

问题描述

编译 gradle 任务类时,我开始遇到奇怪的失败。这是我创建的任务:

package sample

import groovy.transform.CompileStatic
import groovy.transform.TypeChecked
import org.gradle.api.artifacts.Dependency
import org.gradle.api.provider.Property
import org.gradle.api.tasks.AbstractCopyTask
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.bundling.Zip
import sample.internal.DataSourceXmlConfig

@TypeChecked
@CompileStatic
class DataSource extends Zip {
    @Internal
    final Property<File> warFile = project.objects.property(File.class)

    DataSource() {
        warFile.convention(project.provider {
            def files = project.configurations.getByName('warApp').fileCollection { Dependency d ->
                d.name == (archiveFileName.getOrElse("") - (~/\.[^.]+$/))
            }
            files.empty ? null : files.first()
        })
    }

    /**
     * This function is used to specify the location of data-sources.xml
     * and injects it into the archive
     * @param dsConf The configuration object used to specify the location of the
     * file as well as any extra variables which should be injected into the file
     */
    @Input
    void dataSourceXml(@DelegatesTo(DataSourceXmlConfig) Closure dsConf) {
        filesToUpdate {
            DataSourceXmlConfig ds = new DataSourceXmlConfig()

            dsConf.delegate = ds
            dsConf.resolveStrategy = Closure.DELEGATE_FIRST
            dsConf.call()

            exclude('**/WEB-INF/classes/data-sources.xml')
            from(ds.source) {
                if (ds.expansions) {
                    expand(ds.expansions)
                }
                into('WEB-INF/classes/')
                rename { 'data-sources.xml' }
            }
        }
    }

    private def filesToUpdate(@DelegatesTo(AbstractCopyTask) Closure action) {
        action.delegate = this
        action.resolveStrategy = Closure.DELEGATE_FIRST
        if (warFile.isPresent()) {
            from(project.zipTree(warFile)) {
                action.call()
            }
        }
    }
}

当 groovy 编译这个类时,我得到以下错误:

任务 ':buildSrc:compileGroovy' 执行失败。

漏洞!源单元“/tmp/bus-server/buildSrc/src/main/groovy/sample/DataSource.groovy”中的“类生成”阶段异常在第 28 行第 28 列接收器:archiveFileName.getOrElse() 带有消息:减号和参数:.[^.]+$ 这个方法不应该被调用。请尝试创建一个重现此错误的简单示例并在 https://issues.apache.org/jira/browse/GROOVY提交错误报告

摇篮版本:5.6

Groovy 版本:localGroovy() = 2.5.4


tl;博士,这是一个错误还是我错过了这些注释如何工作的一些东西?

我尝试做的第一件事是删除其中一个@TypeChecked@CompileStatic注释以查看错误是否消失。

这实际上立即解决了问题。使用添加的任一注释编译源代码是成功的,但是当两者都存在时会失败。

我阅读了一些关于使用这两种注释的 问题和答案,但似乎没有一个表明不能同时使用这两种注释。

最后,我尝试切换注释的顺序,看看是否有帮助,令我惊讶的是,它奏效了!没有编译错误!

这有效:

@CompileStatic
@TypeChecked
class DataSource extends Zip { ... }

在这一点上,我想我的问题是,这是一个错误还是我对这两个注释的使用不了解?我更倾向于它是一个错误,只是因为订单使错误消息消失了。

标签: gradlegroovycompiler-errorsannotations

解决方案


推荐阅读