使用org.xolstice protobuf-maven-plugin的<includes>参数时报「No protos to compile」
问题分析与解决思路
核心矛盾场景
使用org.xolstice.maven.plugins:protobuf-maven-plugin:0.6.1时遇到两个冲突问题:
- 未配置
<includes>时,插件能识别src/main/proto下的业务proto文件,但找不到编译依赖的基础proto; - 添加
<includes>指定已解压的依赖proto路径后,插件提示「No protos to compile」,但实际存在可编译的proto文件。
具体解决思路
1. 正确区分配置项作用:用<protoPathElements>而非<includes>管理依赖路径
插件的<includes>是筛选要编译的目标proto文件,而依赖的基础proto需要通过<protoPathElements>添加到protoc的搜索路径中,不要用<includes>指定依赖文件位置。修改配置如下:
<configuration> <!-- 保留原有protoc、插件相关配置 --> <protocArtifact>com.google.protobuf:protoc:${protoc.version}:exe:${os.detected.classifier}</protocArtifact> <pluginId>grpc-java</pluginId> <pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}</pluginArtifact> <protocPlugins> <protocPlugin> <id>quarkus-grpc-protoc-plugin</id> <groupId>io.quarkus</groupId> <artifactId>quarkus-grpc-protoc-plugin</artifactId> <version>3.4.1</version> <mainClass>io.quarkus.grpc.protoc.plugin.MutinyGrpcGenerator</mainClass> </protocPlugin> </protocPlugins> <!-- 添加proto搜索路径,同时包含业务proto和依赖proto目录 --> <protoPathElements> <protoPathElement>${project.basedir}/src/main/proto</protoPathElement> <protoPathElement>${project.build.outputDirectory}/protobuf/base</protoPathElement> </protoPathElements> <checkStaleness>false</checkStaleness> </configuration>
2. 确保依赖proto的解压时机早于编译阶段
如果基础proto是从Maven依赖包中解压出来的,需提前用maven-dependency-plugin完成解压,保证protobuf编译时文件已存在:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>unpack-base-protos</id> <phase>generate-sources</phase> <!-- 在compile阶段前执行 --> <goals> <goal>unpack</goal> </goals> <configuration> <artifactItems> <artifactItem> <!-- 替换为你的基础proto依赖坐标 --> <groupId>your.base.proto.group</groupId> <artifactId>base-proto-artifact</artifactId> <version>your.version</version> <outputDirectory>${project.build.outputDirectory}/protobuf/base</outputDirectory> <includes>**/*.proto</includes> </artifactItem> </artifactItems> </configuration> </execution> </executions> </plugin>
3. 若必须使用<includes>,需同时匹配业务与依赖proto
如果一定要通过<includes>指定文件,需同时覆盖业务proto和依赖proto的路径,避免只匹配依赖路径而漏掉业务文件:
<includes> <include>${project.basedir}/src/main/proto/**/*.proto</include> <include>${project.build.outputDirectory}/protobuf/base/**/*.proto</include> </includes>
注意用**/*.proto递归匹配所有子目录下的proto文件,防止路径匹配不全。
4. 通过调试命令定位问题
执行mvn -X compile查看插件生成的protoc实际执行命令,检查--proto_path参数是否正确,以及待编译的proto文件列表是否完整,快速定位路径或匹配规则问题。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

