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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.09 09:12:33