java使用protobuf-maven-plugin的插件編譯proto文件詳解
protobuf文件作為數(shù)據(jù)傳輸和存儲(chǔ)的協(xié)議
已經(jīng)使用的越來越廣泛了。使用protobuf有如下的優(yōu)勢(shì):
- protocol buffers 是一種語言無關(guān)、平臺(tái)無關(guān)、可擴(kuò)展的序列化結(jié)構(gòu)數(shù)據(jù)。
- 相比XML,有編碼后體積更小,編解碼速度更快的優(yōu)勢(shì);相比于 Json,Protobuf 有更高的轉(zhuǎn)化效率,時(shí)間效率和空間效率都是 JSON 的 3-5 倍。
- protobuf還提供了不同語言的protoc的編譯工具,使用簡(jiǎn)單的編譯指令就更生成支持不同語言的調(diào)用包。
主要介紹在java使用maven編譯proto文件的插件
protobuf-maven-plugin
我們?cè)诠こ棠夸浵聞?chuàng)建一個(gè)lib的module,用來統(tǒng)一管理proto的包和編譯后生成的java包。然后我們?cè)诟鷍ava同級(jí)的目錄創(chuàng)建proto的文件夾,用來存放.proto文件(如下圖)

在pom的build中配置proto的編譯插件
// pom.xml
<build>
<extensions>
<extension>
<groupId>kr.motd.maven</groupId>
<artifactId>os-maven-plugin</artifactId>
<version>${os.plugin.version}</version>
</extension>
</extensions>
<plugins>
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>${protobuf.plugin.version}</version>
<extensions>true</extensions>
<configuration>
<!-- 工具版本 -->
<protocArtifact>com.google.protobuf:protoc:${protobuf.version}:exe:${os.detected.classifier}</protocArtifact>
<!--默認(rèn)值,proto源文件路徑-->
<protoSourceRoot>${project.basedir}/src/main/proto</protoSourceRoot>
<!--默認(rèn)值,proto目標(biāo)java文件路徑-->
<outputDirectory>${project.basedir}/src/main/java</outputDirectory>
<!--設(shè)置是否在生成java文件之前清空outputDirectory的文件,默認(rèn)值為true,設(shè)置為false時(shí)也會(huì)覆蓋同名文件-->
<clearOutputDirectory>false</clearOutputDirectory>
</configuration>
<executions>
<execution>
<!--在執(zhí)行mvn compile的時(shí)候會(huì)執(zhí)行以下操作-->
<phase>compile</phase>
<goals>
<!--生成OuterClass類-->
<goal>compile</goal>
<!--生成Grpc類-->
<!--goal>compile-custom</goal-->
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>- 該配置先使用os-maven-plugin插件,該插件主要是為了識(shí)別不同的操作系統(tǒng),這樣插件可以根據(jù)不同的平臺(tái)加載不同protoc編譯器文件。google的protobuf團(tuán)隊(duì)也是用該插件來識(shí)別protoc的運(yùn)行操作系統(tǒng)信息
- 后面配置了protobuf-maven-plugin編譯參數(shù),下面我說下主要的幾個(gè)參數(shù)。詳細(xì)的參數(shù)可以參考官方文檔:Maven Protocol Buffers Plugin – protobuf:compile
protobuf-maven-plugin插件主要參數(shù)介紹:
從上文的配置中,我們可以看到主要的配置參數(shù)如下:
protocArtifact: protoc編譯器工具的格式規(guī)范,groupId:artifactId:version[:type[:classifier]]。如果指定了該參數(shù),protoc將嘗試按照指定的參數(shù)對(duì)文件proto文件進(jìn)行編譯'protocExecutable:配置protoc的編譯執(zhí)行程序的路徑protocPluginDirectory: protoc的執(zhí)行文件目錄protoSourceRoot: 原始proto文件的路徑,比如${project.basedir}/src/main/protooutputDirectory: 編譯后生成.java文件的路徑,比如:${project.basedir}/src/main/javatemporaryProtoFileDirectory: 臨時(shí)使用目錄clearOutputDirectory: 設(shè)置是否在生成java文件之前清空outputDirectory的文件,默認(rèn)值為true,設(shè)置為false時(shí)也會(huì)覆蓋同名文件additionalProtoPathElement:附加的源proto文件定義路徑,如果設(shè)備源路徑?jīng)]找到,會(huì)到該目錄找excludes:排除不需要編譯的文件列表includes:包含需要編譯的proto文件列表,默認(rèn)的
<includes> <include>**/*.proto</include> </includes>
使用自定義編譯插件編譯gRPC服務(wù)
如果只是編譯proto文件,可以不使用該插件,使用上面的配置即可。當(dāng)要使用自定義插件的時(shí)候,必須將goal設(shè)置為compile-custom。設(shè)置好goal后,可以配置插件的信息,如下:
pluginId: 唯一標(biāo)識(shí)protoc的插件,不能為內(nèi)置的protoc插件,比如grpc-java插件pluginArtifact: 識(shí)別插件版本pluginParameter: 傳遞給插件的參數(shù)
下面使用示例為使用grpc-java編譯proto文件的bom的build配置
// pom.xml
<build>
<extensions>
<extension>
<groupId>kr.motd.maven</groupId>
<artifactId>os-maven-plugin</artifactId>
<version>${os.plugin.version}</version>
</extension>
</extensions>
<plugins>
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>${protobuf.plugin.version}</version>
<extensions>true</extensions>
<configuration>
<protocArtifact>com.google.protobuf:protoc:${protobuf.version}:exe:${os.detected.classifier}</protocArtifact>
<pluginId>grpc-java</pluginId>
<pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.java.version}:exe:${os.detected.classifier}</pluginArtifact>
<!--默認(rèn)值-->
<protoSourceRoot>${project.basedir}/src/main/proto</protoSourceRoot>
<!--默認(rèn)值-->
<outputDirectory>${project.basedir}/src/main/java</outputDirectory>
<!--設(shè)置是否在生成java文件之前清空outputDirectory的文件,默認(rèn)值為true,設(shè)置為false時(shí)也會(huì)覆蓋同名文件-->
<clearOutputDirectory>false</clearOutputDirectory>
<!--更多配置信息可以查看https://www.xolstice.org/protobuf-maven-plugin/compile-mojo.html-->
</configuration>
<executions>
<execution>
<!--在執(zhí)行mvn compile的時(shí)候會(huì)執(zhí)行以下操作-->
<phase>compile</phase>
<goals>
<!--生成OuterClass類-->
<goal>compile</goal>
<!--生成Grpc類-->
<goal>compile-custom</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>這里我們主要配置了gprc-java插件,用來生成grpc服務(wù)的包
使用protobuf-maven-plugin生成gRPC的包
首先我們先proto的test目錄下,創(chuàng)建一個(gè)hello.proto的文件,內(nèi)容如下
syntax = "proto3";
option java_multiple_files = true;
option java_package = "cn.ckeen.lib.grpc.test";
option java_outer_classname = "HelloWorldProto";
// The greeting service definition.
service Simple {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {
}
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings
message HelloReply {
string message = 1;
}使用上述自定義插件的插件的pom配置,使用maven compile編譯一下,我們可以看到編譯的生成的包

然后我們?cè)趃PRC的的服務(wù)端和客戶端引用該包。
可能遇到的問題
- 配置了goal為compile-custom必須配置maven-protoc插件,否則會(huì)報(bào)錯(cuò)。
The parameters 'pluginId' for goal org.xolstice.maven.plugins:protobuf-maven-plugin:0.6.1:compile-custom are missing or invalid
- 注意所有文件路徑中不要使用中文
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- 如何創(chuàng)建Maven的Java和Web工程并運(yùn)行在Tomcat上
- 解析JAVA中 maven pom.xml 和 properties 配置文件、spring 配置文件及環(huán)境變量的關(guān)系
- Maven編譯時(shí)缺少依賴,java:程序包org.apache.http不存在的問題
- 使用easy connect之后,maven無法使用,原來需要配置-Djava.net.preferIPv4Stack=true問題
- spring-boot-maven-plugin插件打包和java -jar命令執(zhí)行原理分析
- 一文詳解如何在Java?Maven項(xiàng)目中使用JUnit?5進(jìn)行測(cè)試
- idea maven編譯報(bào)錯(cuò)Java heap space的解決方法
相關(guān)文章
Mybatis-Plus自動(dòng)填充更新操作相關(guān)字段的實(shí)現(xiàn)
數(shù)據(jù)庫表中應(yīng)該都要有create_time、update_time字段;那么在開發(fā)中,對(duì)于這些共有字段的處理應(yīng)該要進(jìn)行統(tǒng)一,這樣就可以簡(jiǎn)化我們的開發(fā)過程。那么本文就對(duì)Mybatis-Plus中的字段自動(dòng)填充進(jìn)行記錄2021-11-11
Spring Cloud Gateway實(shí)現(xiàn)流量染色的示例代碼
流量染色是一種在網(wǎng)絡(luò)請(qǐng)求中添加標(biāo)識(shí)字段,本文詳細(xì)介紹了流量染色的原理,并通過SpringCloudGateway實(shí)現(xiàn)流量染色的方法,具有一定的參考價(jià)值,感興趣的可以來了解一下2026-03-03
Java高效讀取Excel表格數(shù)據(jù)的詳細(xì)教程
在日常的軟件開發(fā)和數(shù)據(jù)處理工作中,我們經(jīng)常需要與各種格式的數(shù)據(jù)文件打交道,其中Excel表格因其直觀性和廣泛應(yīng)用而占據(jù)重要地位,手動(dòng)處理Excel數(shù)據(jù)不僅耗時(shí)耗力,而且極易出錯(cuò),尤其是在面對(duì)海量數(shù)據(jù)時(shí),所以本文介紹了Java高效讀取Excel表格數(shù)據(jù)的詳細(xì)教程2025-08-08
基于Properties類操作.properties配置文件方法總結(jié)
這篇文章主要介紹了Properties類操作.properties配置文件方法總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
詳解mybatis foreach collection示例
這篇文章主要介紹了詳解mybatis foreach collection的相關(guān)資料,需要的朋友可以參考下2017-10-10
淺談SpringBoot是如何實(shí)現(xiàn)日志的
這篇文章主要介紹了淺談SpringBoot是如何實(shí)現(xiàn)日志的,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
為何修改equals方法時(shí)還要重寫hashcode方法的原因分析
這篇文章主要介紹了為何修改equals方法時(shí)還要重寫hashcode方法的原因分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06

