使用Maven插件构建Protocol Buffer项目时proto导入报错求助
Protocol Buffers Maven项目导入错误修复方案
问题描述
使用Maven插件开发Protocol Buffers项目时,构建报错:hello2.proto: Import "h/hello.proto" was not found or had errors,同时期望按指定包生成Java文件但未实现。
现有文件内容
hello.proto(路径:src/main/resources/proto/h/hello.proto)
syntax = "proto3"; //option java_multiple_files = true; option java_package = "com.poc_cipertrace.hello"; option java_outer_classname = "HelloWorldRequest"; message HelloRequest { string name = 1; }
hello2.proto(路径:src/main/resources/proto/hello2.proto)
syntax = "proto3"; option java_package = "com.poc.poc_cipertrace.hello"; option java_outer_classname = "HelloWorldResponse"; import "h/hello.proto"; message HelloResponse { HelloRequest h=1; }
现有pom.xml插件配置
<plugin> <groupId>com.github.os72</groupId> <artifactId>protoc-jar-maven-plugin</artifactId> <version>3.6.0.1</version> <executions> <execution> <phase>generate-sources</phase> <goals> <goal>run</goal> </goals> <configuration> <includeMavenTypes>direct</includeMavenTypes> <inputDirectories> <include>src/main/resources/proto</include> </inputDirectories> <outputTargets> <outputTarget> <type>java</type> <outputDirectory>src/main/java</outputDirectory> </outputTarget> <outputTarget> <type>grpc-java</type> <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.15.0</pluginArtifact> <outputDirectory>src/main/java</outputDirectory> </outputTarget> </outputTargets> </configuration> </execution> </executions> </plugin>
项目结构
src/main/resources/proto
├── h
│ └── hello.proto
└── hello2.proto
修复步骤
1. 配置Proto搜索根路径
问题核心是protoc未将src/main/resources/proto识别为Proto文件的根目录,导致找不到h/hello.proto。需在插件配置中添加<protoPaths>指定根路径:
修改后的插件配置:
<plugin> <groupId>com.github.os72</groupId> <artifactId>protoc-jar-maven-plugin</artifactId> <version>3.6.0.1</version> <executions> <execution> <phase>generate-sources</phase> <goals> <goal>run</goal> </goals> <configuration> <includeMavenTypes>direct</includeMavenTypes> <!-- 添加Proto根路径,让protoc能找到h/hello.proto --> <protoPaths> <protoPath>src/main/resources/proto</protoPath> </protoPaths> <inputDirectories> <include>src/main/resources/proto</include> </inputDirectories> <outputTargets> <outputTarget> <type>java</type> <!-- 建议生成到target目录,符合Maven规范,避免覆盖手动代码 --> <outputDirectory>target/generated-sources/protobuf/java</outputDirectory> </outputTarget> <outputTarget> <type>grpc-java</type> <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.15.0</pluginArtifact> <outputDirectory>target/generated-sources/protobuf/grpc-java</outputDirectory> </outputTarget> </outputTargets> </configuration> </execution> </executions> </plugin>
2. 修正Proto文件的引用问题
hello2.proto中直接使用HelloRequest会因包名不一致导致识别失败,可选择以下两种方案:
方案一:添加统一package声明
修改hello.proto:syntax = "proto3"; package hello; // 添加package option java_package = "com.poc_cipertrace.hello"; option java_outer_classname = "HelloWorldRequest"; message HelloRequest { string name = 1; }修改hello2.proto:
syntax = "proto3"; package hello; // 添加相同的package option java_package = "com.poc.poc_cipertrace.hello"; option java_outer_classname = "HelloWorldResponse"; import "h/hello.proto"; message HelloResponse { hello.HelloRequest h=1; // 使用全限定名引用 }方案二:统一java_package
将hello2.proto的java_package改为com.poc_cipertrace.hello,生成的Java类会在同一个包下,可直接引用HelloRequest。
3. 配置Maven识别生成的源代码目录
如果将生成代码放到target目录,需要让Maven编译时包含该目录,可添加build-helper-maven-plugin:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> <version>3.3.0</version> <executions> <execution> <id>add-source</id> <phase>generate-sources</phase> <goals> <goal>add-source</goal> </goals> <configuration> <sources> <source>target/generated-sources/protobuf/java</source> <source>target/generated-sources/protobuf/grpc-java</source> </sources> </configuration> </execution> </executions> </plugin>
内容的提问来源于stack exchange,提问作者Nisarg Raval
相关产品推荐
相关产品推荐

