Gradle增量构建编译gRPC生成Java代码遇NO-SOURCE问题求助
解决Gradle自定义compileGrpc任务显示NO-SOURCE的问题
你的问题出在三个核心点上:
- 自定义的
JavaCompile任务仅用inputs.files声明了输入,但没有指定要编译的源文件路径——Gradle的JavaCompile任务需要明确source配置才会识别要处理的文件,inputs只是给增量构建做变化检测用的,不负责告诉任务"该编译什么"。 - 输出目录和默认
compileJava任务的目录build/classes/java/main重叠,既会导致编译产物冲突,也会干扰增量构建的缓存判断。 - 没有显式依赖proto文件的生成任务,虽然你说目录里已有文件,但显式依赖能保证任务执行顺序的正确性。
修正后的任务配置
val compileGrpc = tasks.register<JavaCompile>("compileGrpc") { description = "Compile auto-generated java-code from proto-files." // 1. 指定要编译的源文件目录 source(layout.projectDirectory.dir("build/generated/sources/proto/main")) include("**/*.java") // 2. 设置独立的输出目录,避免和主代码编译产物冲突 val grpcOutputDir = layout.buildDirectory.dir("classes/java/grpc") destinationDirectory.set(grpcOutputDir) outputs.dir(grpcOutputDir) // 3. 依赖proto生成任务,确保编译前已生成Java文件 dependsOn(tasks.generateProto) // 4. 继承主编译任务的classpath,保证依赖正确 classpath = sourceSets.main.get().compileClasspath }
额外优化建议
- 如果需要将grpc编译的产物加入到主代码的classpath中,可以添加如下配置:
sourceSets.main.get().output.dir(mapOf("builtBy" to compileGrpc), compileGrpc.get().destinationDirectory)
这样主代码就能正常引用grpc生成的类,同时保证增量构建的关联性。
- 验证增量构建:修改任意proto文件,执行
./gradlew compileGrpc,任务会重新编译变化后的生成文件;如果没有修改,任务会显示UP-TO-DATE。
内容的提问来源于stack exchange,提问作者patientCoder
相关产品推荐
相关产品推荐

