Quarkus+Gradle环境下实现文件保存触发代码生成器
可行!Quarkus + Gradle 实现目录文件修改自动触发生成器的方案
核心思路
利用Gradle的增量构建机制检测/src/main/java/core/data目录的文件变化,自动触发自定义生成器执行;同时结合Quarkus的Dev模式,在生成类更新后自动重载应用,完全对标JPA Metamodel Generator的触发逻辑。
具体实现步骤
情况1:自定义生成器是注解处理器(最常见场景)
如果你的生成器基于Java注解处理器实现,按以下配置操作:
- 引入生成器依赖
在build.gradle的dependencies块中添加注解处理器依赖:
dependencies { // 替换为你的自定义生成器依赖(本地模块或Maven坐标) annotationProcessor project(':custom-generator') // 若生成器提供API类(如自定义注解),需添加implementation依赖 implementation project(':custom-generator') }
- 配置增量编译与触发条件
让Gradle仅在core/data目录文件变化时,重新运行注解处理器:
tasks.withType(JavaCompile) { // 确保注解处理器路径正确 options.annotationProcessorPath = configurations.annotationProcessor // 指定仅运行你的自定义生成器(可选,避免触发其他处理器) options.compilerArgs += [ '-proc:only', '-processor', 'com.yourpackage.CustomGenerator' // 替换为生成器全类名 ] // 配置输入输出,让Gradle识别增量变化 inputs.dir(file('src/main/java/core/data')) outputs.dir(file('build/generated/sources/annotationProcessor/java/main')) }
- 确保生成类被Quarkus识别
默认情况下,Gradle注解处理器生成的类存放在build/generated/sources/annotationProcessor/java/main,Quarkus Dev模式会自动扫描该目录。若生成器输出到其他目录,需添加到sourceSets:
sourceSets { main { java { srcDirs += 'build/generated/sources/your-generator-output' } } }
情况2:自定义生成器是独立任务(非注解处理器)
如果你的生成器是独立Java程序或脚本,需创建Gradle任务并配置触发条件:
- 定义生成器任务
在build.gradle中创建自定义任务,指定输入输出目录:
task generateCustomClasses(type: JavaExec) { // 替换为生成器主类全类名 mainClass = 'com.yourpackage.CustomGeneratorMain' // 生成器运行所需类路径 classpath = sourceSets.main.runtimeClasspath // 传递参数:输入目录(core/data)和输出目录 args = [ 'src/main/java/core/data', 'build/generated/sources/custom/main' ] // 增量触发关键:指定输入输出目录 inputs.dir(file('src/main/java/core/data')) outputs.dir(file('build/generated/sources/custom/main')) }
- 关联编译任务
让Java编译任务依赖生成器任务,确保生成类在编译前准备完成:
compileJava.dependsOn(generateCustomClasses) // 将生成目录添加到源码集,让Quarkus能扫描到 sourceSets.main.java.srcDirs += 'build/generated/sources/custom/main'
验证效果
运行Quarkus Dev模式:
./gradlew quarkusDev
修改/src/main/java/core/data下的任意类并保存,Gradle会自动检测到变化,触发生成器执行;生成类更新后,Quarkus会自动重载应用,无需手动重启。
内容的提问来源于stack exchange,提问作者Biggy Poopa
相关产品推荐
相关产品推荐

