Protocol Buffer是谷歌开源的一种序列化和反序列化机制,类似于XML,JSON 解析,但是Protocol Buffer 更灵活、更高效、更简单。
具体在实际开发中,Protocal Buffer表现怎么样,我也不知道,因为我很少用它,至于为什么会学习它,完全是因为Android Launcher3里面的backup.proto把我牵引了过去,Protocol buffer的高效性,谷歌官网也有实例来说明,而执行消耗时间精确到了纳秒,关于它的详细介绍还是看官网:https://developers.google.com/protocol-buffers。 嗯,没错,又是英文,又要FQ。
这个开源项目,谷歌已经放到了github,Link:https://github.com/google/protobuf/ , release版本:https://github.com/google/protobuf/releases。
那么现在就以Java来配置Protocol buffer,操作系统是Windows,目的:手动编译jar包,手动将xx.proto文件生成为xx.java文件。  
要编译,那么就要环境。根据根据github上的文档,它是用maven来管理的,Link:https://github.com/google/protobuf/tree/master/java
下载安装maven,并加入环境变量,例如:     
D:\apache-maven-3.3.9\bin;D:\protobuf-3.0.0-alpha-2\src
    下载Protocol buffer 文件,例如我用的:protobuf-java-3.0.0-alpha-2.zip
    下载Protocol 可执行文件,Link:http://central.maven.org/maven2/com/google/protobuf/protoc/ 选择对应的版本,我使用的是:protoc-3.0.0-alpha-2-windows-x86_32.exe。
    解压protobuf-java-3.0.0-alpha-2.zip,并将protoc-3.0.0-alpha-2-windows-x86_32.exe重命名为protoc.exe,复制到protobuf-java-3.0.0-alpha-2/src目录下,同样将protoc.exe路径加入到环境变量。
    打开cmd 切换到protobuf-java-3.0.0-alpha-2目录,可查询maven 和 protoc.exe的版本号:
然后根据github上文档的提示:mvn install (安装相关库),切换到../javanano目录,mvn test(测试环境是否配置妥当):
出现上面界面,基本上环境是没有问题了,就可以mvn package:
然后到目录../javanano/target下,就会看到protobuf-javanano-3.0.0-alpha-2.jar了,至此,手动生成JAR包,成功!
    
    然后就来手动解析xx.proto文件,将它生成为xx.java文件。这里以protobuf-java-3.0.0-alpha-2/example里面的例子来实验一下。
这个操作需要指令,官网和github上的文档都有说明:   
    protoc --proto_path=src --java_out=build/gen src/foo.proto
protoc 就是protoc.exe了,前面已经加入到环境变量中, proto_path 就是xx.proto的路径了,java_out就是生成的xx.java文件的存放路径了,最后面跟着还是xx.proto文件
这里,以examples/addressbook.proto 为例。
    在cmd敲入如下指令:   
protoc --proto_path=examples --java_out=examples examples/addressbook.proto
    遗憾的是,没有成功,报错了:
    
意思是说,addressbook.proto 文件中需要使用syntax = "proto2",这个属性,根据proto的版本来的。在addressbook.proto中加上这句话:   
    ...syntax = "proto2";package tutorial;option java_package = "com.example.tutorial";option java_outer_classname = "AddressBookProtos";...
再重新执行上面的命令,结果成功生成了AddressBookProtos.java文件,文件路径:../examples/com/example/tutorial/AddressBookProtos.java:   
    package com.example.tutorial;public final class AddressBookProtos {private AddressBookProtos() {}public static void registerAllExtensions(com.google.protobuf.ExtensionRegistry registry) {}public interface PersonOrBuilder extends// @@protoc_insertion_point(interface_extends:tutorial.Person)com.google.protobuf.MessageOrBuilder {/*** <code>required string name = 1;</code>*/boolean hasName();/*** <code>required string name = 1;</code>*/java.lang.String getName();......}
那么好,有点小激动,终于生成了xx.java文件了。不过很遗憾的是,xx.java文件是生成了,但是此文件生成的是错误的,里面的内容是有问题的,在实际的开发中,
当引用这个文件中的内容后,肯定会报错。那么为什么了。
刚接触protocol buffer的朋友,肯定会跟我刚开始一样以为成功了,其实非也。那么请注意,我使用的protoc版本为nano版本,在protobuf-3.0.0-alpha-2目录下没有
java目录,而是javanano目录,对,就是这个坑,我掉进去了。
这两个版本之前是有区别的,不妨打开protobuf-3.0.0-alpha-2/javanano/Pom.xml文件,查看下groupId:
     <groupId>com.google.protobuf.nano</groupId><artifactId>protobuf-javanano</artifactId><version>3.0.0-alpha-2</version>
而在非nano版本中,groupId为: <groupId>com.google.protobuf</groupId>,回去看看生成的AddressBookProtos.java文件,会有部分类似于下面这条语句的内容:    
com.google.protobuf.ExtensionRegistry registry
所有这些内容,对于nano版本都是错误的,前面的com.google.protobuf都应该对应于groundId,所以对于nano版本,应该为:
com.google.protobuf.nano.ExtensionRegistry registry
那么问题出在哪里,要跳出这个坑,还需要认真阅读文档,请参阅protobuf-3.0.0-alpha-2/javanano/README.tet,
或者https://github.com/google/protobuf/tree/master/javanano。有这么一段内容:   
- Invoke with --javanano_out, e.g.:./protoc '--javanano_out=\java_package=src/proto/simple-data.proto|my_package,\java_outer_classname=src/proto/simple-data.proto|OuterName\:.' src/proto/simple-data.proto
于是乎我果断将java_out修改为javanano_out:    
protoc --proto_path=examples --javanano_out=examples examples/addressbook.proto
生成的xx.java文件如下:   
public interface AddressBookProtos {public static final class Person extendscom.google.protobuf.nano.MessageNano {// enum PhoneTypepublic static final int MOBILE = 0;public static final int HOME = 1;public static final int WORK = 2;public static final class PhoneNumber extendscom.google.protobuf.nano.MessageNano {private static volatile PhoneNumber[] _emptyArray;public static PhoneNumber[] emptyArray() {// Lazily initializes the empty arrayif (_emptyArray == null) {synchronized (com.google.protobuf.nano.InternalNano.LAZY_INIT_LOCK) {if (_emptyArray == null) {_emptyArray = new PhoneNumber[0];}}}return _emptyArray;}...}
看到上面的内容,终于出现了com.google.protobuf.nano.xxxxx,这样就跟grounpId对应上了,对应于nano版本。

Protocol buffer配置-生成jar包和java文件相关推荐

  1. java 多目录 编译jar_javac编译多个包下的、依赖其他jar包的java文件

    问题: 多个*.java文件编译 *.java文件依赖其他的jar包 如下文件结构: F:\jar_pra child --child01 --MyChild.java --child02 --MyC ...

  2. idea项目中有jar包,java文件却引不进来

    最近写代码又遇到了神奇的错误== 导入项目后报这个错: 但是项目中明明有这个jar包啊=.= 为啥引不进来...挠头 后来灵机一动,手动导一个试试? 在根目录下建一个lib文件夹,存放jar包 把ja ...

  3. 怎么导出ij里面的java文件_Java應用系列:命令行生成jar包(附IJ Idea導出jar方法)...

    jar包 JAR(Java Archive,Java 歸檔文件)是與平台無關的壓縮文件,通常是用於將多個class文件組合成一個,.當創建jar包的時候,如果程序中有main入口函數,同時manife ...

  4. java jar 配置_java jar包与配置文件的写法

    一个普通的java project,里面引用了config.properties配置文件,将项目打成Runnable jar,然后将config.properties放到打包后的jar路径下,执行该j ...

  5. java 单开程序_java生成jar包并且单进程运行的实例

    java文件打包jar运行 有效步骤: 1.cmd 到当前目录(默认包主类所在目录为例) set classpath = 默认包主类所在目录 2.javac 主类名.java 3.java 主类名 4 ...

  6. java生成jar包时使第三方jar_IEDA生成可运行jar包(包含第三方jar包)的方法

    最近现网需要处理一下数据,来适配一个场景.安排我来编写一个脚本来实现,由于步骤比较多,且需要调用其他服务接口,使用shell脚本来实现比较困难,所以想到了使用shell脚本调用java可执行jar包的 ...

  7. 为什么明明配置了jar包,main 方法还是 java.lang.NoClassDefFoundError ?

    一,原因 虽然你配置了jar包,但jar的作用范围没有放开! 如 IDEA 加入 tomcat 6.0.9 默认就Provied 二,解决方法 更改一下 jar包scope作用域就OK 三,什么是sc ...

  8. mvn本地生成jar包放在mvn项目依赖(将jar包传到本地仓库)

    2019独角兽企业重金招聘Python工程师标准>>> 大家在自己写项目中遇到过想在pom文件中加入自己开发依赖包,这些包肯定不是Maven仓库(http://mvnreposito ...

  9. java -uf_Java如何快速修改Jar包里的文件内容

    需求背景:写了一个实时读取日志文件以及监控的小程序,打包成了Jar包可执行文件,通过我们的web主系统上传到各个服务器,然后调用ssh命令执行.每次上传前都要通过解压缩软件修改或者替换里面的配置文件, ...

  10. IntelliJ IDEA中生成jar包并运行

    1.IntelliJ IDEA中的java项目生成jar包 IntelliJ IDEA中的java项目(比如:myproject),可以生成jar包. 本文以IntelliJ IDEA 2022.3 ...

最新文章

  1. 堆排序算法的java实现_堆排序算法的JAVA实现
  2. 2021暑假每日一题 【week5 完结】
  3. linux scull 的内存使用
  4. java面试题二十四 继承题2
  5. python appium自动化测试平台开发,Python+Appium实现自动化测试
  6. linux系统it固定资产管理系统包_固定资产管理系统单机版有哪些特点?
  7. linux上运行onedrive,教你如何在Linux中同步微软 OneDrive
  8. pybaobabdt 推荐一款超高颜值的模型可视化库
  9. 转科普CPU Cache line
  10. ai修复照片软件是哪个软件_智能照片修复
  11. 使用CBrother爬取LOL服务器状态
  12. 头脑极度开放:前额皮层大战杏仁核
  13. 网站域名如何解析到阿里云和腾讯云服务器?
  14. docker容器获取宿主机ip地址
  15. windows下安装VMware Workstation14.0Pro(VMware系列一)
  16. 大数据与算法系列之海量数据查找算法
  17. linux strace命令--跟踪系统调用
  18. 计算机设计大赛感言,计算机编程比赛获奖感言.doc
  19. 免编程让你零基础制作App
  20. 2018年大学生设计竞赛浙江赛区H题-简易功率测量装置-试题分析

热门文章

  1. 2011年 最新Gmail改版后 申请免费的Gmail企业邮箱图文教程
  2. C++中的函数原型和函数定义
  3. 公有云管理的一般建议
  4. 教程 - 【超详细】从零开始部署网站——阿里云主机CentOS系统
  5. GoogleStyle编程代码规范
  6. 论精力充沛与事业成功
  7. C程序设计语言思维导图
  8. 小游戏流量变现瓶颈,新增长点是超级App?
  9. 量化交易之股票数据的获取——同花顺软件
  10. 计算机中丢失msvcp120.dll是什么意思,win7系统玩游戏提示“msvcp120.dll丢失”怎么修复...