如何排查Gradle提示‘未知文件创建来源’的问题?
Gradle 调试输出目录冲突警告问题
我在Gradle中创建了如下任务,用于查找向同一generated目录写入内容的任务:
task findTaskCreatingSpecificOutput() { dependsOn testClasses doLast { tasks.findAll { task -> task.outputs.getFiles().getFiles().each { output -> if (output != null && output.getAbsolutePath().contains('generated')) { println task println output } } } } }
执行命令 ./gradlew clean findTaskCreatingSpecificOutput --info 后,输出的任务与目录无重叠,但仍收到如下警告:
Gradle does not know how file 'build/classes/java/main/generated' was created (output property 'destinationDirectory'). Task output caching requires exclusive access to output paths to guarantee correctness (i.e. multiple tasks are not allowed to produce output in the same location).
调试方法:
- 使用
--scan参数生成构建扫描报告,在报告的Unowned Outputs板块中,会明确列出Gradle无法关联到具体任务的输出文件,能直接定位到build/classes/java/main/generated的关联线索,甚至可能找到未正确声明输出的任务。 - 完善任务输出的遍历逻辑:原任务只检查了
task.outputs.getFiles().getFiles(),但有些任务的输出是通过特定属性(比如destinationDirectory)声明的,并未提前生成物理文件。可以修改遍历逻辑,同时检查任务的输出属性,示例如下:task findTaskCreatingSpecificOutput() { dependsOn testClasses doLast { tasks.findAll { task -> // 检查常规输出文件 task.outputs.getFiles().getFiles().each { output -> checkOutput(task, output) } // 检查任务的destinationDirectory属性(常见于代码生成、编译类任务) if (task.hasProperty('destinationDirectory')) { def dir = task.destinationDirectory.get().asFile checkOutput(task, dir) } } } } def checkOutput(task, output) { if (output != null && output.getAbsolutePath().contains('generated')) { println task println output } } - 执行
./gradlew clean build --info,在日志中搜索build/classes/java/main/generated,查看所有涉及该目录的操作,包括临时写入、目录创建等动作,定位到对应的任务。 - 排查插件影响:逐步禁用项目中的第三方插件(比如注解处理器插件、代码生成插件),每次禁用后重新执行构建,观察警告是否消失,以此定位到引发问题的插件。
- 手动验证构建目录:执行完
findTaskCreatingSpecificOutput任务后,保留构建目录,手动检查build/classes/java/main/generated的存在状态、文件内容及修改时间,对比任务执行时序,确认是否有任务在目标任务执行后写入该目录。
内容的提问来源于stack exchange,提问作者mjaggard
相关产品推荐
相关产品推荐

