亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

protobuf文件作為數(shù)據(jù)傳輸和存儲的協(xié)議

已經(jīng)使用的越來越廣泛了。使用protobuf有如下的優(yōu)勢:

  • protocol buffers 是一種語言無關(guān)、平臺無關(guān)、可擴(kuò)展的序列化結(jié)構(gòu)數(shù)據(jù)。
  • 相比XML,有編碼后體積更小,編解碼速度更快的優(yōu)勢;相比于 Json,Protobuf 有更高的轉(zhuǎn)化效率,時間效率和空間效率都是 JSON 的 3-5 倍。
  • protobuf還提供了不同語言的protoc的編譯工具,使用簡單的編譯指令就更生成支持不同語言的調(diào)用包。

主要介紹在java使用maven編譯proto文件的插件

protobuf-maven-plugin

我們在工程目錄下創(chuàng)建一個lib的module,用來統(tǒng)一管理proto的包和編譯后生成的java包。然后我們在跟java同級的目錄創(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時也會覆蓋同名文件-->
                    <clearOutputDirectory>false</clearOutputDirectory>

                </configuration>
                <executions>
                    <execution>
                        <!--在執(zhí)行mvn compile的時候會執(zhí)行以下操作-->
                        <phase>compile</phase>
                        <goals>
                            <!--生成OuterClass類-->
                            <goal>compile</goal>
                            <!--生成Grpc類-->
                            <!--goal>compile-custom</goal-->
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
  • 該配置先使用os-maven-plugin插件,該插件主要是為了識別不同的操作系統(tǒng),這樣插件可以根據(jù)不同的平臺加載不同protoc編譯器文件。google的protobuf團(tuán)隊(duì)也是用該插件來識別protoc的運(yùn)行操作系統(tǒng)信息
  • 后面配置了protobuf-maven-plugin編譯參數(shù),下面我說下主要的幾個參數(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ù)對文件proto文件進(jìn)行編譯'
  • protocExecutable:配置protoc的編譯執(zhí)行程序的路徑
  • protocPluginDirectory: protoc的執(zhí)行文件目錄
  • protoSourceRoot: 原始proto文件的路徑,比如${project.basedir}/src/main/proto
  • outputDirectory: 編譯后生成.java文件的路徑,比如:${project.basedir}/src/main/java
  • temporaryProtoFileDirectory: 臨時使用目錄
  • clearOutputDirectory: 設(shè)置是否在生成java文件之前清空outputDirectory的文件,默認(rèn)值為true,設(shè)置為false時也會覆蓋同名文件
  • additionalProtoPathElement:附加的源proto文件定義路徑,如果設(shè)備源路徑?jīng)]找到,會到該目錄找
  • excludes:排除不需要編譯的文件列表
  • includes:包含需要編譯的proto文件列表,默認(rèn)的
<includes>
 <include>**/*.proto</include>
</includes>

使用自定義編譯插件編譯gRPC服務(wù)

如果只是編譯proto文件,可以不使用該插件,使用上面的配置即可。當(dāng)要使用自定義插件的時候,必須將goal設(shè)置為compile-custom。設(shè)置好goal后,可以配置插件的信息,如下:

  • pluginId: 唯一標(biāo)識protoc的插件,不能為內(nèi)置的protoc插件,比如grpc-java插件
  • pluginArtifact: 識別插件版本
  • 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時也會覆蓋同名文件-->
                    <clearOutputDirectory>false</clearOutputDirectory>
                    <!--更多配置信息可以查看https://www.xolstice.org/protobuf-maven-plugin/compile-mojo.html-->
                </configuration>
                <executions>
                    <execution>
                        <!--在執(zhí)行mvn compile的時候會執(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)建一個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編譯一下,我們可以看到編譯的生成的包

然后我們在gPRC的的服務(wù)端和客戶端引用該包。

可能遇到的問題

  • 配置了goal為compile-custom必須配置maven-protoc插件,否則會報錯。

The parameters 'pluginId' for goal org.xolstice.maven.plugins:protobuf-maven-plugin:0.6.1:compile-custom are missing or invalid

  • 注意所有文件路徑中不要使用中文

總結(jié)

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java方法重載示例

    java方法重載示例

    方法重載是以統(tǒng)一的方式處理不同數(shù)據(jù)類型的一種手段,這篇文章主要介紹了java方法重載示例,需要的朋友可以參考下
    2014-03-03
  • 如何在pom文件中引入本地jar包并打包

    如何在pom文件中引入本地jar包并打包

    在項(xiàng)目中使用本地JAR文件的方法有很多,下面這篇文章主要給大家介紹了關(guān)于如何在pom文件中引入本地jar包并打包的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • spring data jpa使用詳解(推薦)

    spring data jpa使用詳解(推薦)

    這篇文章主要介紹了spring data jpa使用詳解(推薦),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • Java線程的停止實(shí)現(xiàn)原理詳解

    Java線程的停止實(shí)現(xiàn)原理詳解

    這篇文章主要介紹了Java線程的停止實(shí)現(xiàn)原理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-01-01
  • 整理Java的MyBatis框架中一些重要的功能及基本使用示例

    整理Java的MyBatis框架中一些重要的功能及基本使用示例

    這篇文章主要介紹了Java的MyBatis框架中一些重要的功能及基本使用示例整理,MyBatis可以幫助Java程序進(jìn)行強(qiáng)大的數(shù)據(jù)庫操作,需要的朋友可以參考下
    2016-04-04
  • Spring Boot Actuator自定義健康檢查教程

    Spring Boot Actuator自定義健康檢查教程

    這篇文章主要介紹了Spring Boot Actuator自定義健康檢查教程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Spring中@Value注解的三種使用方式詳解

    Spring中@Value注解的三種使用方式詳解

    這篇文章主要介紹了Spring中@Value注解的三種使用方式詳解,文章通過示例代碼非常詳細(xì)地介紹,對于每個人的學(xué)習(xí)或工作都有一定的學(xué)習(xí)價值,需要的朋友可以參考下
    2023-08-08
  • Java AOP動態(tài)代理詳細(xì)介紹

    Java AOP動態(tài)代理詳細(xì)介紹

    AOP是一種設(shè)計思想,是軟件設(shè)計領(lǐng)域中的面向切面編程,它是面向?qū)ο缶幊痰囊环N補(bǔ)充和完善。本文將用Java實(shí)現(xiàn)AOP代理的三種方式,需要的可以參考一下
    2022-08-08
  • Java中LinkedHashSet的底層機(jī)制詳解

    Java中LinkedHashSet的底層機(jī)制詳解

    這篇文章主要介紹了Java中LinkedHashSet的底層機(jī)制解讀,   LinkedHashSet是具有可預(yù)知迭代順序的Set接口的哈希表和鏈接列表實(shí)現(xiàn),此實(shí)現(xiàn)與HashSet的不同之處在于,后者維護(hù)著一個運(yùn)行于所有條目的雙重鏈接列表,需要的朋友可以參考下
    2023-09-09
  • 詳解ConcurrentHashMap如何保證線程安全及底層實(shí)現(xiàn)原理

    詳解ConcurrentHashMap如何保證線程安全及底層實(shí)現(xiàn)原理

    這篇文章主要為大家介紹了ConcurrentHashMap如何保證線程安全及底層實(shí)現(xiàn)原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05

最新評論