gradle - 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 { ... }
在这一点上,我想我的问题是,这是一个错误还是我对这两个注释的使用不了解?我更倾向于它是一个错误,只是因为订单使错误消息消失了。
解决方案
推荐阅读
- java - 如何在内部或从正在运行的应用程序中的依赖项执行 jar?
- python - 如何使用 ctypes 将 SendInput 函数包装到 python
- c++ - 结构中带有空格的字符串
- ffmpeg - FFmpeg 过滤器在特定点将音频文件添加到视频中
- apache-spark - 通过 Spark 将文件附加到现有的 S3 存储桶文件夹
- algorithm - 使用 mod 操作时如何计算时间复杂度
- swift - 子视图的意外帧(Swift)
- angular - .Net Core WebApi + Angular 项目中的安全 SPA
- autodesk-forge - 如何在 Revit API 中将视图导出为多个图像?
- mysql - 在条件下选择查询最小-最大缩放数据(mysql)