Reference
Example
Install protobuf
- Download from Git: https://github.com/protocolbuffers/protobuf
- Install protobuf
- Setup protobuf folder to PATH
- Try command: protoc

Define proto
syntax = "proto2";
package examples;
option java_package = "examples";
option java_outer_classname = "AddressBookProtos";
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phones = 4;
}
message AddressBook {
repeated Person people = 1;
}
Generate Java Code
Execute command:
protoc -I /Users/liaoisaac/projects/study-practice/src/main/resources -java_out=/Users/liaoisaac/projects/study-practice/src/main/java/ /Users/liaoisaac/projects/study-practice/src/main/resources/addressbook.proto
Java code will be generated in "/Users/liaoisaac/projects/study-practice/src/main/java/"
Example with Maven Plugin
Introduce Maven
Define Maven plugin: protobuf-maven-plugin
(注意我把 output dir 改到我想要的 generated-java folder 了)
<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.0</modelVersion>
<groupId>shooeugenesea</groupId>
<artifactId>study-examples</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.7</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.5.1</version>
<configuration>
<protocExecutable>/usr/local/bin/protoc</protocExecutable>
<outputDirectory>${basedir}/src/main/generated-java</outputDirectory>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<verbose>true</verbose>
<fork>true</fork>
<compilerVersion>1.8</compilerVersion>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
設定好之後執行 mvn clean package 就可以根據 proto generate 出 java code
Read Write generated objects
package examples;
import java.io.*;
public class ReadWriteProtobufMain {
public static void main(String[] params) throws IOException {
AddressBookProtos.Person person = AddressBookProtos.Person.newBuilder()
.setEmail("email@com")
.setName("myname")
.setId(123)
.addPhones(AddressBookProtos.Person.PhoneNumber.newBuilder()
.setType(AddressBookProtos.Person.PhoneType.HOME)
.setNumber("12345678")
.build())
.build();
try (PipedOutputStream out = new PipedOutputStream();
PipedInputStream in = new PipedInputStream(out)) {
System.out.println("write Person:\n" + person);
person.writeTo(out);
out.close();
AddressBookProtos.Person readPerson = AddressBookProtos.Person.newBuilder().mergeFrom(in).build();
System.out.println("read Person:\n" + readPerson);
}
}
}

沒有留言:
張貼留言