Protocol buffer配置-生成jar包和java文件
2016-08-12 18:22
896 查看
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,并加入环境变量,例如:
下载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敲入如下指令:
遗憾的是,没有成功,报错了:
意思是说,addressbook.proto 文件中需要使用syntax = "proto2",这个属性,根据proto的版本来的。在addressbook.proto中加上这句话:
再重新执行上面的命令,结果成功生成了AddressBookProtos.java文件,文件路径:../examples/com/example/tutorial/AddressBookProtos.java:
那么好,有点小激动,终于生成了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:
而在非nano版本中,groupId为: <groupId>com.google.protobuf</groupId>,回去看看生成的AddressBookProtos.java文件,会有部分类似于下面这条语句的内容:
所有这些内容,对于nano版本都是错误的,前面的com.google.protobuf都应该对应于groundId,所以对于nano版本,应该为:
那么问题出在哪里,要跳出这个坑,还需要认真阅读文档,请参阅protobuf-3.0.0-alpha-2/javanano/README.tet,
或者https://github.com/google/protobuf/tree/master/javanano。有这么一段内容:
于是乎我果断将java_out修改为javanano_out:
生成的xx.java文件如下:
看到上面的内容,终于出现了com.google.protobuf.nano.xxxxx,这样就跟grounpId对应上了,对应于nano版本。
具体在实际开发中,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 extends com.google.protobuf.nano.MessageNano { // enum PhoneType public static final int MOBILE = 0; public static final int HOME = 1; public static final int WORK = 2; public static final class PhoneNumber extends com.google.protobuf.nano.MessageNano { private static volatile PhoneNumber[] _emptyArray; public static PhoneNumber[] emptyArray() { // Lazily initializes the empty array if (_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版本。
相关文章推荐
- java工程生成jar,配置文件放在jar外面,读写配置文件
- java工程生成jar,配置文件放在jar外面,读写配置文件
- java项目生成"可运行jar"或"exe"的配置文件注意点
- 【JAVA】使用Eclipse依赖生成jar包时,避免最外层同时生成资源文件的配置。
- 如何把JAVA工程生成一个.JAR文件,而不是一堆JAR(ECLIPSE生成JA
- java连接oracle数据库(利用MyEclipse开发工具反向生成 bean与配置文件)
- Java程序如何生成Jar、exe及安装文件
- Hibernate配置(一):用MiddleGen生成映射文件和用hbm2java生成pojo
- 如何将java程序直接运行(生成.jar文件)
- java 读取配置文件或者图片文件,然后打jar包的问题
- 在C#中调用Java生成的jar库文件的方法
- 使用hibernate扩展工具Hbm2JavaTask根据配置文件生成持久化对象类(2.1.2)
- Java入门--生成可执行jar文件的教程
- java中Itext.jar中根据html生成Word文件(包含图片)
- 发布Java类的步骤(Java源文件生成jar文件)
- 第1章 Java基本概念及环境配置——FAQ1.17 怎样制作鼠标双击就可以运行的Jar文件?
- flash(as3.0)调用EXE文件,及java程序打JAR包和生成EXE过程
- Java入门-生成可执行jar文件的教程
- 运用URLClassLoader加载外部jar包的java类,生成Class文件
- JAVA----Hibernate介绍与配置文件、jar包的说明(一)