You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gradle 6升级至7.x后输入属性丢失问题求助

Gradle 6升7后@Input注解File/FileCollection属性丢失问题修复

问题根源

  1. Gradle 7开始严格校验输入注解:@Input不能用于File类型,必须用@InputFile或@InputDirectory,否则会触发你遇到的报错。
  2. 旧版直接用字段定义输入属性的方式,在Gradle 7中可能无法被正确识别为任务输入,导致inputs.properties中丢失。
  3. 配置块属性名与任务类字段名不匹配(比如配置里的buildDirectory对应任务类的someBuildDirectory),导致属性未正确注入。

修复步骤

1. 修正输入注解与属性类型(改用Gradle Property API)

Gradle 7推荐使用类型安全的Property API来定义任务输入,这能确保输入被正确追踪。修改任务类代码如下:

class SomeTask extends DefaultTask { // 避免类名与Gradle内置Task冲突

    // 对应配置里的sourceDirectories
    @InputFiles
    final ConfigurableFileCollection someDirectories = project.files()

    // 对应配置里的ignoreFiles
    @InputFiles
    @Optional
    final ConfigurableFileCollection someIgnore = project.files()

    @Input
    @Optional
    final Property<Boolean> nullabilityAnnotations = project.objects.property(Boolean.class)

    // 对应配置里的buildDirectory,用@InputDirectory替代@Input(因为是目录)
    @InputDirectory
    @Optional
    final DirectoryProperty someBuildDirectory = project.objects.directoryProperty()

    // 配置块属性映射的setter,确保配置里的属性名能正确绑定到任务类属性
    void setBuildDirectory(File file) {
        someBuildDirectory.set(file)
    }

    void setSourceDirectories(FileCollection files) {
        someDirectories.setFrom(files)
    }

    void setIgnoreFiles(FileTree fileTree) {
        someIgnore.setFrom(fileTree)
    }

    @TaskAction
    def run() {
        def params = [:]
        // 逐个读取输入属性,排除buildDirectory
        if (!someDirectories.isEmpty()) {
            params.someDirectories = someDirectories.files
        }
        if (someIgnore.isPresent() && !someIgnore.isEmpty()) {
            params.someIgnore = someIgnore.files
        }
        if (nullabilityAnnotations.isPresent()) {
            params.nullabilityAnnotations = nullabilityAnnotations.get()
        }
        // 后续使用params逻辑不变
    }
}

2. 确保配置块与任务类的属性绑定正确

原配置块无需修改,因为我们已经通过setter方法将配置里的buildDirectory、sourceDirectories、ignoreFiles映射到了任务类的对应属性。

3. 关键修正点说明

  • 注解替换:将@Input标记的File类型属性someBuildDirectory改为@InputDirectory(因为build是目录,如果是文件则用@InputFile)。
  • Property API替换:用ConfigurableFileCollection替代FileCollection,DirectoryProperty替代File,Property<Boolean>替代Boolean,这类API是Gradle 7增量构建和输入追踪的标准方式。
  • setter方法:解决配置块属性名与任务类字段名不一致的问题,确保配置值能正确注入到任务属性中。
  • 输入读取方式:在@TaskAction中通过Property的get()或files集合获取值,替代原有的inputs.properties遍历,避免输入丢失。

验证修复

执行任务前先清理构建缓存:

./gradlew clean

然后运行目标任务,此时输入属性会被正确识别,不会再出现丢失或注解报错的问题。

内容的提问来源于stack exchange,提问作者One String Samurai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 22:43:18