本次是通过Maven工具构建Java测试工程,需要将原本通过gradle构建的项目需要通过maven构建加入公司代码库,通过Maven构建涉及到接下来要介绍的插件,总是发现pom.xml编译不通过,看到网上都是千篇一律的插件配置,自己就是编译不通过,不知道大家有木有遇到,下面我将调试过程以及解决方案记录如下。
1.定义proto文件
因为是测试和官网一样,定义一个简单的hello.proto文件
2.maven插件配置
<1>添加依赖
UTF-8
1.59.1
3.24.0
3.24.0
1.8
1.8
io.grpc
grpc-bom
${grpc.version}
pom
import
io.grpc
grpc-netty-shaded
runtime
io.grpc
grpc-protobuf
io.grpc
grpc-services
io.grpc
grpc-stub
org.apache.tomcat
annotations-api
6.0.53
provided
com.google.protobuf
protobuf-java
${protobuf.version}
com.google.protobuf
protobuf-java-util
${protobuf.version}
<2>添加插件
kr.motd.maven
os-maven-plugin
1.7.1
org.apache.maven.plugins
maven-compiler-plugin
1.8
org.xolstice.maven.plugins
protobuf-maven-plugin
0.6.1
com.google.protobuf:protoc:${protobuf.version}:exe:${os.detected.classifier}
grpc-java
io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}
src/main/proto
compile
compile-custom
org.apache.maven.plugins
maven-enforcer-plugin
1.4.1
enforce
enforce
这个插件在我的本地无法编译通过,大家都知道maven编译不通过是没法执行接下来的命令,执行编译是为了将proto文件生成对应的java代码。
<3>执行命令
mvn clean compile
结果是报错了,具体错误没有记录。
<4>修改插件配置
参考:java - How to use google protobuf compiler with maven-compiler-plugin - Stack Overflow
查阅资料将插件配置修改为
${project.basedir}/src/main/resources
com.google.protobuf:protoc:3.7.0:exe:${os.detected.classifier}
再次执行编译还是不通过,继续search。。。
找到io.github.ascopes下的protobuf-maven-plugin
io.github.ascopes
protobuf-maven-plugin
<!– ${protobuf-maven-plugin.version} –>
${protobuf.version}
generate
经过测试没有下载到io.github.ascopes#protobuf-maven-plugin插件,这个插件也许是可以用的,我没有切换maven仓库源,只是在maven 仓库官网没找到而已,果断放弃了。如果要使用这个插件需要注意一个默认约束,你定义的proto文件位置:src/main/protobuf
插件默认会从这个位置读取proto文件,除非你修改插件配置。
继续寻找其他插件,继续search。。。
功夫不负有心人,果然找到了一款插件配置如下
先贴一下地址:
How to Work With Protobuf-Maven Projects in IntelliJ IDEA | The IntelliJ IDEA Blog
源码地址:GitHub - elenakozlova/maven-protobuf: sample maven-protobuf project for the blog post
org.codehaus.mojo
build-helper-maven-plugin
3.3.0
test
generate-sources
add-source
com.github.os72
protoc-jar-maven-plugin
3.11.4
generate-sources
run
false
${protobuf.version}
true
他强调需要依赖
com.google.protobuf
protobuf-java
${project.basedir}
配置后插件后,pom.xml编译通过 ,心里爽快多了。
继续执行命令编译
mvn clean compile
不幸的是又出现错误
Unsupported platform: protoc-3.24.0-osx-x86_64.exe
这个错误一看就是和protoc安装版本有关系,我的是arm操作系统,显示x86肯定不对。
我猜测自己的mac os安装的protobuf未生效造成的,执行命令将protoc命令加入环境变量
$ source ~/.bash_profile
执行完后重新构建,果真通过
在插件${project.basedir}/target/generated-sources指定的target下生成了我们需要的Java源码文件
⚠️注意:插件要求你的proto文件路径(默认):src/main/protobuf
关于Unsupported platform: protoc-3.24.0-osx-x86_64.exe错误应该还有以下解决办法,issues链接如下(针对mac os M1/M2):
Support for M1 Macs (osx-aarch_64) · Issue #93 · os72/protoc-jar · GitHub
com.github.os72
protoc-jar-maven-plugin
protoc
mac os x
aarch64
mac
<5>配置插件生成java-grpc调用接口定义
com.github.os72
protoc-jar-maven-plugin
3.11.4
generate-sources
run
true
${protobuf.version}
true
src/main/protobuf
java
grpc-java
io.grpc:protoc-gen-grpc-java:1.0.1
执行重新构建
$ mvn clean compile
控制台打印如下:
生成程序如下:
以上针对Java版本的gRPC代码生成和官网不一样,很容易理解,希望给刷到的同学带来些许帮助。
插件:protoc-jar-maven-plugin官方使用详细说明:
protoc-jar-maven-plugin - Introduction