Mac安装Protobuf编译Java

本文整理了再在Mac上安装Protobuf 和编译Java的详细过程

  1. 在Mac上安装protobuf
  2. 创建一个java项目,编写.proto文件
  3. 用protobuf编译生成java文件,测试
  4. 用wire编译生成java文件,测试
1.protobuf下载地址:https://github.com/google/protobuf/tags?after=v3.0.0-alpha-1

Github:https://github.com/google/protobuf

我先下载了2.6.1版本的,安装了之后protoc命令报一个错

[html]  view plain  copy
  1. dyld: Library not loaded: /usr/local/lib/libprotobuf.9.dylib  
google了一下然而并没有解决,然后就下载2.5.0版本的继续试,结果安装正常。


安装过程:

解压压缩包

cd到brotofbuf-2.5.0 目录  

指定安装目录    ./configure --prefix=/User/Dev/Tools/protobuf     /User/Dev/Tools/protobuf安装目录

安装                   make

                          make install

环境变量           sudo vi .bash_profile

[java]  view plain  copy
  1. export PROTOBUF=/Users/mingwei/Dev/protobuf  
  2. export ANDROID_HOME=/Users/mingwei/Dev/android-sdk-mac/platform-tools  
  3. export PATH=${PATH}:$ANDROID_HOME:$PROTOBUF/bin  
环境变量生效    source .bash_profile

测试                  protoc --version

参考:http://my.oschina.net/KingPan/blog/283881?fromerr=8vajR5S9


2.可以自己写,也可以复制example中的文件过来

protobuf.proto

[plain]  view plain  copy
  1. option java_package = "com.example.demo";  
  2.   
  3. option java_outer_classname = "PersonPb";  
  4.   
  5. message Person {  
  6.     required string name = 1;  
  7.     required int32 id = 2;  
  8.     optional string email = 3;  
  9.   
  10.     enum PhoneType {  
  11.         MOBILE = 0;  
  12.         HOME = 1;  
  13.         WORKE = 2;  
  14.     }  
  15.   
  16.     message PhoneNumber {  
  17.         required string number = 1;  
  18.         optional PhoneType type = 2 [default = HOME];  
  19.     }  
  20.   
  21.     repeated PhoneNumber phone = 4;  
  22.   
  23.     message CountryInfo {  
  24.         required string name = 1;  
  25.         required string code = 2;  
  26.         optional int32 number = 3;  
  27.     }  
  28.   
  29. }  
  30.   
  31. message AddressBook {  
  32.     repeated Person person = 1;  
  33. }  

3.编译生成Java    protoc -I=src/main/resource/proto --java_out=src/main/java src/main/resource/proto/protobuf.proto

PersonPb.java

[java]  view plain  copy
  1. private PersonPb() {}  
  2.   public static void registerAllExtensions(  
  3.       com.google.protobuf.ExtensionRegistry registry) {  
  4.   }  
  5.   public interface PersonOrBuilder  
  6.       extends com.google.protobuf.MessageOrBuilder {  
  7.   
  8.     // required string name = 1;  
  9.     /** 
  10.      * <code>required string name = 1;</code> 
  11.      */  
  12.     boolean hasName();  
  13.     ...  
  14.     ...内容很多,(稍后附件中有)  
  15.     ...  
  16.     com.google.protobuf.Descriptors.FileDescriptor  
  17.       .internalBuildGeneratedFileFrom(descriptorData,  
  18.         new com.google.protobuf.Descriptors.FileDescriptor[] {  
  19.         }, assigner);  
  20.   }  
  21.   
  22.   // @@protoc_insertion_point(outer_class_scope)  
  23. }  

使用:

[java]  view plain  copy
  1. public class MainTest {  
  2.     public static void main(String[] args) {  
  3.         System.out.println("Test_Systemout");  
  4.   
  5.         PersonPb.AddressBook.Builder build = PersonPb.AddressBook.newBuilder();  
  6.   
  7.         PersonPb.Person person1 = PersonPb.Person.newBuilder().setId(1).setName("xxxxxxi").setEmail("[email protected]").  
  8.                 addPhone(PersonPb.Person.PhoneNumber.newBuilder().setNumber("15211112222").setType(PersonPb.Person.  
  9.                         PhoneType.HOME).build()).build();  
  10.   
  11.         build.addPerson(person1);  
  12.         PersonPb.Person person2 = PersonPb.Person.newBuilder().setId(2).setName("sasasasas").setEmail("[email protected]").  
  13.                 addPhone(PersonPb.Person.PhoneNumber.newBuilder().setNumber("15211112222").setType(PersonPb.Person.  
  14.                         PhoneType.HOME).build()).build();  
  15.   
  16.         build.addPerson(person2);  
  17.   
  18.         for (int i = 0; i < build.getPersonList().size(); i++) {  
  19.             System.out.println("name=" + build.getPersonList().get(i).getName());  
  20.         }  
  21.     }  
  22. }  

生成的PersonPb.java 代码加注释一共3600多行,如果代码一多对于移动端显然是一个负担。so...应用而生的Wire就来了,Wire是一个专门针对Android端的轻量级的protobuf。

参考:http://www.bubuko.com/infodetail-781200.html

Github:https://github.com/square/wire


4.使用wire
在gradle中添加wire所需的jar包
[plain]  view plain  copy
  1. compile 'com.squareup.wire:wire-runtime:2.1.0'  
libs中用到的压缩时用到的wire包
wire-compiler-1.8.0-jar-with-dependencies.jar   (稍后附件中有)
wire的文档中写道用命令:
java -jar wire-compiler-1.7.0-jar-with-dependencies.jar --proto_path=. --java_out=. addressbook.proto
可以生成java文件,但是我敲的时候不报错,也不生成任何文件,没找到原因。
然后采用了这种方式
[java]  view plain  copy
  1. task generateWireFile(type: JavaExec ) {  
  2.     classpath = files("libs/wire-compiler-1.8.0-jar-with-dependencies.jar")  
  3.     args = ["--proto_path=src/main/resource/proto""--java_out=src/main/java",  
  4.             "protobuf.proto"]  
  5.     main = "com.squareup.wire.WireCompiler"  
  6. }  

在Gradle中添加:


然后双击图中选中的那一项等待编译完成就可以了
生成   Person.java   AddressBook.java


demo:http://download.csdn.net/detail/u013045971/9419552

猜你喜欢

转载自blog.csdn.net/sd19871122/article/details/80134566