Gradle文件系统监视器对子项目失效,求解决方案
问题描述
近期把Micronaut项目拆成独立模块后,用gradle run -t启动的持续构建不再检测子项目的代码变更,但根项目的变更能正常触发重新构建。
配置信息
根项目build.gradle
plugins { id 'java' id "com.github.johnrengelman.shadow" version "7.0.0" id "io.micronaut.application" version "3.6.5" } version = "0.1" group = "com.example" repositories { mavenCentral() } configurations { compile } micronaut { runtime("netty") testRuntime("junit5") processing { incremental(true) annotations("*") } } dependencies { implementation project(':child1') implementation project(':child2') }
子项目build.gradle示例
plugins { id 'java' id 'io.micronaut.library' } group 'com.example' version '0.1' repositories { mavenCentral() } dependencies { implementation project(":child1") }
gradle.properties
org.gradle.jvmargs='-Dfile.encoding=UTF-8' org.gradle.caching=true org.gradle.vfs.verbose=true org.gradle.vfs.watch=true micronautVersion=3.7.4 version=7.4.0
gradle run --dry-run输出
VFS> Statistics since last build: VFS> > Stat: Executed stat() x 0. getUnixMode() x 0 VFS> > FileHasher: Hashed 0 files (0 bytes) VFS> > DirectorySnapshotter: Snapshot 0 directory hierarchies (visited 0 directories, 0 files and 0 failed files) Received 4102 file system events since last build while watching 1 locations Virtual file system retained information about 545 files, 113 directories and 0 missing files since last build :child1:compileJava SKIPPED :child2:compileJava SKIPPED :child3:compileJava SKIPPED :compileJava SKIPPED :processResources SKIPPED :classes SKIPPED :child1:processResources SKIPPED :child1:classes SKIPPED :child1:jar SKIPPED :child2:processResources SKIPPED :child2:classes SKIPPED :child2:jar SKIPPED :child3:processResources SKIPPED :child3:classes SKIPPED :child3:jar SKIPPED :run SKIPPED Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0. You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins. See https://docs.gradle.org/7.4.2/userguide/command_line_interface.html#sec:command_line_warnings BUILD SUCCESSFUL in 2s Received 16 file system events during the current build while watching 1 locations Virtual file system retains information about 564 files, 117 directories and 0 missing files until next build VFS> Statistics during current build: VFS> > Stat: Executed stat() x 4. getUnixMode() x 0 VFS> > FileHasher: Hashed 15 files (40.351 bytes) VFS> > DirectorySnapshotter: Snapshot 4 directory hierarchies (visited 4 directories, 19 files and 0 failed files)
排查与解决思路
- 给子项目开启增量注解处理:子项目用了
micronaut.library插件但没配置增量编译,在子项目的build.gradle里加以下配置,把注解范围缩到实际包名,别用通配符*:micronaut { processing { incremental(true) annotations("com.example.yourpackage.*") } } - 检查VFS监听范围:从dry-run输出看VFS只监听了1个位置,加
org.gradle.vfs.watch.debug=true到gradle.properties,看实际监听的目录是不是包含所有子项目源码文件夹,没包含的话得调整项目结构或Gradle配置。 - 明确run任务的依赖:根项目的
run任务要明确依赖子项目的classes任务,确保子项目变更能触发根项目重建,在根项目build.gradle加:run.dependsOn ':child1:classes', ':child2:classes', ':child3:classes' - 统一Micronaut版本:根项目插件版本3.6.5和gradle.properties里的3.7.4不一致,把根项目的
io.micronaut.application插件版本改成3.7.4,避免版本冲突导致的异常。 - 临时禁用缓存测试:先把
org.gradle.caching=true改成false,看看是不是缓存导致变更没被检测到,测试后再决定要不要重新开启。
内容的提问来源于stack exchange,提问作者Zonko
相关产品推荐
相关产品推荐

