如何阻止生成的Java Protobuf文件被创建在Gradle构建目录中?
问题描述
我已经在build.gradle中配置了将Java Protobuf文件生成到指定目录:
sourceSets { main { proto { srcDir("src/main/java/proto") } } protobuf { protoc { artifact = "com.google.protobuf:protoc:$protocVersion" } plugins { grpc { artifact = "io.grpc:protoc-gen-grpc-java:$grpcVersion" } } generateProtoTasks { ofSourceSet("main").forEach { it.plugins { grpc } } } generatedFilesBaseDir = "src/main/java/proto" }
但文件依然会在Gradle构建目录中生成,导致生成的Java Protobuf文件将构建目录中的文件视为重复项,引发问题。请问有没有办法阻止文件在构建目录生成,仅让Java Protobuf文件生成到我指定的目录中?
解决方案
问题核心是generatedFilesBaseDir仅会将你指定的目录追加到生成路径前,不会覆盖Gradle默认的构建目录输出逻辑。要实现仅输出到指定目录,需修改生成任务的输出路径,并调整sourceSets避免重复识别。
具体修改步骤:
- 移除
generatedFilesBaseDir配置,逐个指定generateProtoTasks的输出目录 - 给sourceSets添加排除规则,避免识别构建目录中的文件
修改后的build.gradle配置如下:
sourceSets { main { proto { srcDir("src/main/java/proto") } // 排除构建目录,防止重复识别文件 java { exclude '**/build/**' } } } protobuf { protoc { artifact = "com.google.protobuf:protoc:$protocVersion" } plugins { grpc { artifact = "io.grpc:protoc-gen-grpc-java:$grpcVersion" } } generateProtoTasks { ofSourceSet("main").forEach { task -> // 配置普通Protobuf生成文件的输出目录,不创建默认子目录 task.builtins { java { outputSubDir = '' } } // 配置gRPC生成文件的输出目录 task.plugins { grpc { outputSubDir = '' } } // 强制指定任务输出到目标目录,覆盖默认构建目录输出 task.outputs.dir("src/main/java/proto") } } }
额外说明:
- 设置
outputSubDir = ''是为了避免生成的文件被放到默认的java子目录,直接输出到指定根目录 task.outputs.dir会强制覆盖任务的默认输出路径,不再向构建目录写入文件- sourceSets的排除规则是双重保险,防止Gradle误将构建目录的旧文件当作源码
内容的提问来源于stack exchange,提问作者aaa
相关产品推荐
相关产品推荐

