• Mac上protobuf环境构建-java


    参考文献
    getting-started
    官网pb java介绍
    maven protobuf插件
    简单入门1
    简单入门2

    1. protoc编译器下载安装

    https://github.com/protocolbuffers/protobuf/releases?page=10
    在这里插入图片描述
    放入.zshrc中配置环境变量

     ~/IdeaProjects/test2/ protoc --version
    libprotoc 3.12.1
     ~/IdeaProjects/test2/ 
     ~/IdeaProjects/test2/ protoc -h       
    Usage: protoc [OPTION] PROTO_FILES
    Parse PROTO_FILES and generate output based on the options given:
      -IPATH, --proto_path=PATH   Specify the directory in which to search for
                                  imports.  May be specified multiple times;
                                  directories will be searched in order.  If not
                                  given, the current working directory is used.
                                  If not found in any of the these directories,
                                  the --descriptor_set_in descriptors will be
                                  checked for required proto file.
      --version                   Show version info and exit.
      -h, --help                  Show this text and exit.
      --encode=MESSAGE_TYPE       Read a text-format message of the given type
                                  from standard input and write it in binary
                                  to standard output.  The message type must
                                  be defined in PROTO_FILES or their imports.
      --decode=MESSAGE_TYPE       Read a binary message of the given type from
                                  standard input and write it in text format
                                  to standard output.  The message type must
                                  be defined in PROTO_FILES or their imports.
      --decode_raw                Read an arbitrary protocol message from
                                  standard input and write the raw tag/value
                                  pairs in text format to standard output.  No
                                  PROTO_FILES should be given when using this
                                  flag.
      --descriptor_set_in=FILES   Specifies a delimited list of FILES
                                  each containing a FileDescriptorSet (a
                                  protocol buffer defined in descriptor.proto).
                                  The FileDescriptor for each of the PROTO_FILES
                                  provided will be loaded from these
                                  FileDescriptorSets. If a FileDescriptor
                                  appears multiple times, the first occurrence
                                  will be used.
      -oFILE,                     Writes a FileDescriptorSet (a protocol buffer,
        --descriptor_set_out=FILE defined in descriptor.proto) containing all of
                                  the input files to FILE.
      --include_imports           When using --descriptor_set_out, also include
                                  all dependencies of the input files in the
                                  set, so that the set is self-contained.
      --include_source_info       When using --descriptor_set_out, do not strip
                                  SourceCodeInfo from the FileDescriptorProto.
                                  This results in vastly larger descriptors that
                                  include information about the original
                                  location of each decl in the source file as
                                  well as surrounding comments.
      --dependency_out=FILE       Write a dependency output file in the format
                                  expected by make. This writes the transitive
                                  set of input file paths to FILE
      --error_format=FORMAT       Set the format in which to print errors.
                                  FORMAT may be 'gcc' (the default) or 'msvs'
                                  (Microsoft Visual Studio format).
      --print_free_field_numbers  Print the free field numbers of the messages
                                  defined in the given proto files. Groups share
                                  the same field number space with the parent 
                                  message. Extension ranges are counted as 
                                  occupied fields numbers.
    
      --plugin=EXECUTABLE         Specifies a plugin executable to use.
                                  Normally, protoc searches the PATH for
                                  plugins, but you may specify additional
                                  executables not in the path using this flag.
                                  Additionally, EXECUTABLE may be of the form
                                  NAME=PATH, in which case the given plugin name
                                  is mapped to the given executable even if
                                  the executable's own name differs.
      --cpp_out=OUT_DIR           Generate C++ header and source.
      --csharp_out=OUT_DIR        Generate C# source file.
      --java_out=OUT_DIR          Generate Java source file.
      --js_out=OUT_DIR            Generate JavaScript source.
      --objc_out=OUT_DIR          Generate Objective C header and source.
      --php_out=OUT_DIR           Generate PHP source file.
      --python_out=OUT_DIR        Generate Python source file.
      --ruby_out=OUT_DIR          Generate Ruby source file.
      @<filename>                 Read options and filenames from file. If a
                                  relative file path is specified, the file
                                  will be searched in the working directory.
                                  The --proto_path option will not affect how
                                  this argument file is searched. Content of
                                  the file will be expanded in the position of
                                  @<filename> as in the argument list. Note
                                  that shell expansion is not applied to the
                                  content of the file (i.e., you cannot use
                                  quotes, wildcards, escapes, commands, etc.).
                                  Each line corresponds to a single argument,
                                  even if it contains spaces.
     ~/IdeaProjects/test2/ 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90

    安装好上面的编译器就可以手动编译proto文件了,但是java程序员肯定是用maven项目的方式使用了,如何操作呢?下面介绍

    2. demo项目构建

    在这里插入图片描述

    2.1 pom文件

    
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0modelVersion>
    
        <groupId>com.tomgroupId>
        <artifactId>lnacosartifactId>
        <version>1.0-SNAPSHOTversion>
        <properties>
            <os.detected.classifier>osx-x86_64os.detected.classifier>
            <maven.compiler.source>1.8maven.compiler.source>
            <maven.compiler.target>1.8maven.compiler.target>
        properties>
        
        <dependencies>
            
            <dependency>
                <groupId>com.alibaba.nacosgroupId>
                <artifactId>nacos-clientartifactId>
                <version>1.1.4version>
            dependency>
    
    
            <dependency>
                <groupId>com.google.protobufgroupId>
                <artifactId>protobuf-javaartifactId>
                <version>3.12.1version>
            dependency>
    
            <dependency>
                <groupId>com.google.protobufgroupId>
                <artifactId>protobuf-java-utilartifactId>
                <version>3.12.1version>
            dependency>
        dependencies>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.xolstice.maven.pluginsgroupId>
                    <artifactId>protobuf-maven-pluginartifactId>
                    <version>0.6.1version>
                    <configuration>
                        <protocArtifact>com.google.protobuf:protoc:3.12.0:exe:${os.detected.classifier}protocArtifact>
                        <pluginId>protopluginId>
                        <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.32.1:exe:${os.detected.classifier}pluginArtifact>
                        <protoSourceRoot>src/main/resources/proto3protoSourceRoot>
                        <outputDirectory>src/main/javaoutputDirectory>
                        <clearOutputDirectory>falseclearOutputDirectory>
                    configuration>
                    <executions>
                        <execution>
                            <goals>
                                <goal>compilegoal>
                                <goal>test-compilegoal>
    
                            goals>
                        execution>
                    executions>
                plugin>
            plugins>
    
        build>
    project>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64

    2.2 mvn clean complie 生成java文件

    测试类LProto

    package com.tom.model;
    
    import com.google.protobuf.util.JsonFormat;
    
    import java.util.Arrays;
    
    public class LProto {
        public static void main(String[] args) throws Exception{
            DemoModel.Demo.Builder builder = DemoModel.Demo.newBuilder();
    
            DemoModel.Demo build = builder.setId(123).setName("123").build();
            byte[] byteArray = build.toByteArray();
            System.out.println(Arrays.toString(byteArray));
            System.out.println(byteArray.length);
    
            String print = JsonFormat.printer().print(build);
            System.out.println(print);
            System.out.println(print.length());
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    输出
    [8, 123, 26, 3, 49, 50, 51]
    7
    {
      "id": 123,
      "name": "123"
    }
    32
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    可以看到使用pb压缩后的字段小了很多。

    问题1-os.detected.classifier

    在这里插入图片描述
    增加配置

        <properties>
            <os.detected.classifier>osx-x86_64os.detected.classifier>
            <maven.compiler.source>1.8maven.compiler.source>
            <maven.compiler.target>1.8maven.compiler.target>
        properties>
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    RISCV 工具链下载链接
    二手车商城交易网站平台(Java+SSM+MySQL)
    UDS程序完整
    耦合(六种)与 内聚(七种)—《软件工程与计算》笔记
    5G技术的飞速发展:连接未来
    树莓派玩转openwrt软路由:5.OpenWrt防火墙配置及SSH连接
    看涨期权计算例题(期权案例计算)
    HarmonyOS学习路之方舟开发框架—学习ArkTS语言(渲染控制 一)
    Scala继承
    排序——归并排序
  • 原文地址:https://blog.csdn.net/xiaolixi199311/article/details/133613714