Protocol buffer配置-生成jar包和java文件
生活随笔
收集整理的這篇文章主要介紹了
Protocol buffer配置-生成jar包和java文件
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Protocol Buffer是谷歌開(kāi)源的一種序列化和反序列化機(jī)制,類似于XML,JSON 解析,但是Protocol Buffer 更靈活、更高效、更簡(jiǎn)單。
具體在實(shí)際開(kāi)發(fā)中,Protocal Buffer表現(xiàn)怎么樣,我也不知道,因?yàn)槲液苌儆盟?#xff0c;至于為什么會(huì)學(xué)習(xí)它,完全是因?yàn)锳ndroid Launcher3里面的backup.proto把我牽引了過(guò)去,Protocol buffer的高效性,谷歌官網(wǎng)也有實(shí)例來(lái)說(shuō)明,而執(zhí)行消耗時(shí)間精確到了納秒,關(guān)于它的詳細(xì)介紹還是看官網(wǎng):https://developers.google.com/protocol-buffers。 嗯,沒(méi)錯(cuò),又是英文,又要FQ。
這個(gè)開(kāi)源項(xiàng)目,谷歌已經(jīng)放到了github,Link:https://github.com/google/protobuf/?, release版本:https://github.com/google/protobuf/releases。
那么現(xiàn)在就以Java來(lái)配置Protocol buffer,操作系統(tǒng)是Windows,目的:手動(dòng)編譯jar包,手動(dòng)將xx.proto文件生成為xx.java文件。??
要編譯,那么就要環(huán)境。根據(jù)根據(jù)github上的文檔,它是用maven來(lái)管理的,Link:https://github.com/google/protobuf/tree/master/java
下載安裝maven,并加入環(huán)境變量,例如:? ? ?
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 可執(zhí)行文件,Link:http://central.maven.org/maven2/com/google/protobuf/protoc/?選擇對(duì)應(yīng)的版本,我使用的是: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,復(fù)制到protobuf-java-3.0.0-alpha-2/src目錄下,同樣將protoc.exe路徑加入到環(huán)境變量。
? ? 打開(kāi)cmd 切換到protobuf-java-3.0.0-alpha-2目錄,可查詢maven 和 protoc.exe的版本號(hào):
然后根據(jù)github上文檔的提示:mvn install (安裝相關(guān)庫(kù)),切換到../javanano目錄,mvn test(測(cè)試環(huán)境是否配置妥當(dāng)):
出現(xiàn)上面界面,基本上環(huán)境是沒(méi)有問(wèn)題了,就可以mvn package:
然后到目錄../javanano/target下,就會(huì)看到protobuf-javanano-3.0.0-alpha-2.jar了,至此,手動(dòng)生成JAR包,成功!
? ??
? ? 然后就來(lái)手動(dòng)解析xx.proto文件,將它生成為xx.java文件。這里以protobuf-java-3.0.0-alpha-2/example里面的例子來(lái)實(shí)驗(yàn)一下。
這個(gè)操作需要指令,官網(wǎng)和github上的文檔都有說(shuō)明:? ?
? ? protoc --proto_path=src --java_out=build/gen src/foo.proto
protoc 就是protoc.exe了,前面已經(jīng)加入到環(huán)境變量中, proto_path 就是xx.proto的路徑了,java_out就是生成的xx.java文件的存放路徑了,最后面跟著還是xx.proto文件
這里,以examples/addressbook.proto 為例。
? ? 在cmd敲入如下指令:? ?
protoc --proto_path=examples --java_out=examples examples/addressbook.proto
? ? 遺憾的是,沒(méi)有成功,報(bào)錯(cuò)了:
? ??
意思是說(shuō),addressbook.proto 文件中需要使用syntax = "proto2",這個(gè)屬性,根據(jù)proto的版本來(lái)的。在addressbook.proto中加上這句話:? ?
...syntax = "proto2";package tutorial;option java_package = "com.example.tutorial";option java_outer_classname = "AddressBookProtos";...
再重新執(zhí)行上面的命令,結(jié)果成功生成了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();......}
那么好,有點(diǎn)小激動(dòng),終于生成了xx.java文件了。不過(guò)很遺憾的是,xx.java文件是生成了,但是此文件生成的是錯(cuò)誤的,里面的內(nèi)容是有問(wèn)題的,在實(shí)際的開(kāi)發(fā)中,
當(dāng)引用這個(gè)文件中的內(nèi)容后,肯定會(huì)報(bào)錯(cuò)。那么為什么了。
剛接觸protocol buffer的朋友,肯定會(huì)跟我剛開(kāi)始一樣以為成功了,其實(shí)非也。那么請(qǐng)注意,我使用的protoc版本為nano版本,在protobuf-3.0.0-alpha-2目錄下沒(méi)有
java目錄,而是javanano目錄,對(duì),就是這個(gè)坑,我掉進(jìn)去了。
這兩個(gè)版本之前是有區(qū)別的,不妨打開(kāi)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文件,會(huì)有部分類似于下面這條語(yǔ)句的內(nèi)容:? ??
com.google.protobuf.ExtensionRegistry registry
所有這些內(nèi)容,對(duì)于nano版本都是錯(cuò)誤的,前面的com.google.protobuf都應(yīng)該對(duì)應(yīng)于groundId,所以對(duì)于nano版本,應(yīng)該為:
com.google.protobuf.nano.ExtensionRegistry registry
那么問(wèn)題出在哪里,要跳出這個(gè)坑,還需要認(rèn)真閱讀文檔,請(qǐng)參閱protobuf-3.0.0-alpha-2/javanano/README.tet,
或者h(yuǎn)ttps://github.com/google/protobuf/tree/master/javanano。有這么一段內(nèi)容:? ?
- 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;}...}
看到上面的內(nèi)容,終于出現(xiàn)了com.google.protobuf.nano.xxxxx,這樣就跟grounpId對(duì)應(yīng)上了,對(duì)應(yīng)于nano版本。
總結(jié)
以上是生活随笔為你收集整理的Protocol buffer配置-生成jar包和java文件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Protocol(一)[概述]
- 下一篇: 一建工程经济的关键数据推导及关键记忆点