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

使用org.xolstice protobuf-maven-plugin的<includes>参数时报「No protos to compile」

问题分析与解决思路

核心矛盾场景

使用org.xolstice.maven.plugins:protobuf-maven-plugin:0.6.1时遇到两个冲突问题:

  1. 未配置<includes>时,插件能识别src/main/proto下的业务proto文件,但找不到编译依赖的基础proto;
  2. 添加<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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 09:46:09