最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java使用protobuf-maven-plugin的插件編譯proto文件詳解

 更新時(shí)間:2025年07月08日 11:03:56   作者:程序猿CKeen  
這篇文章主要介紹了java使用protobuf-maven-plugin的插件編譯proto文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

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的編譯工具,使用簡單的編譯指令就更生成支持不同語言的調(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/proto
  • outputDirectory: 編譯后生成.java文件的路徑,比如:${project.basedir}/src/main/java
  • temporaryProtoFileDirectory: 臨時(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è)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Mybatis-Plus自動(dòng)填充更新操作相關(guān)字段的實(shí)現(xià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)一,這樣就可以簡化我們的開發(fā)過程。那么本文就對(duì)Mybatis-Plus中的字段自動(dòng)填充進(jìn)行記錄
    2021-11-11
  • Spring Cloud Gateway實(shí)現(xiàn)流量染色的示例代碼

    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ì)教程

    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
  • Java死鎖原因及預(yù)防方法超詳細(xì)講解

    Java死鎖原因及預(yù)防方法超詳細(xì)講解

    Java死鎖是多線程因相互等待資源而阻塞的問題,需滿足互斥、持有并等待、不可剝奪、循環(huán)等待四個(gè)條件,這篇文章主要介紹了Java死鎖原因及預(yù)防方法的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-06-06
  • Java事務(wù)回滾詳解以及常見誤區(qū)

    Java事務(wù)回滾詳解以及常見誤區(qū)

    事務(wù)是指是程序中一系列嚴(yán)密的邏輯操作,而且所有操作必須全部成功完成,否則在每個(gè)操作中所作的所有更改都會(huì)被撤消,這篇文章主要介紹了Java事務(wù)回滾詳解以及常見誤區(qū)的相關(guān)資料,需要的朋友可以參考下
    2025-09-09
  • Java IO之字節(jié)輸入輸出流詳解

    Java IO之字節(jié)輸入輸出流詳解

    這篇文章主要為大家介紹了Java IO之字節(jié)輸入輸出流,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • 基于Properties類操作.properties配置文件方法總結(jié)

    基于Properties類操作.properties配置文件方法總結(jié)

    這篇文章主要介紹了Properties類操作.properties配置文件方法總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 詳解mybatis foreach collection示例

    詳解mybatis foreach collection示例

    這篇文章主要介紹了詳解mybatis foreach collection的相關(guān)資料,需要的朋友可以參考下
    2017-10-10
  • 淺談SpringBoot是如何實(shí)現(xiàn)日志的

    淺談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方法的原因分析

    這篇文章主要介紹了為何修改equals方法時(shí)還要重寫hashcode方法的原因分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06

最新評(píng)論

正宁县| 砀山县| 保定市| 巴塘县| 普兰县| 丰城市| 南宁市| 陆河县| 奉新县| 武清区| 新民市| 江源县| 大关县| 徐闻县| 三门县| 库尔勒市| 孟州市| 阜阳市| 乌什县| 阿尔山市| 信宜市| 桦南县| 潼南县| 贵定县| 瑞金市| 临海市| 莱阳市| 永福县| 莱西市| 大庆市| 尼勒克县| 宣城市| 浑源县| 马关县| 鹤峰县| 治县。| 宿迁市| 秦安县| 灌阳县| 治多县| 福安市|