在上一篇文章中,我們介紹了如何安裝Protoc,以及編譯一個proto文件.
在這篇文章中,我們將會介紹如何在項目中使用這些編譯出來的文件.
創建一個maven項目
通過下面這條命令創建一個最簡單的maven項目就好:
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
它會在當前目錄下生成一個名為my-app的項目.
這個項目的初始結構如下:
我們可以看到,其中生成的的App.java以及AppTest.java,我們并不需要,所以直接給刪掉就好了.
然后,我們需要向其中添加一個protobuf的依賴,因為生成的Java文件需要這個依賴中的內容.
在pom.xml中添加如下內容:
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.4.0</version>
</dependency>
注意上面的那個版本應該跟你安裝的protoc版本一致.
創建proto文件并生成Java文件
我們在項目的根目錄下,創建一個src/main/java/proto文件夾,并編寫一個名為addressbook.proto的文件:
syntax = "proto3";
package com.mycompany.app;
option java_package = "com.mycompany.app";
option java_multiple_files = true;
option java_outer_classname = "AddressBookProtos";
message Person {
string name = 1;
int32 id = 2;
string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
string number = 1;
PhoneType type = 2;
}
repeated PhoneNumber phones = 4;
}
message AddressBook {
repeated Person people = 1;
}
注意上面的這個文件中,option java_package部分,應該給你的項目中你想存放生成的文件的包名一致.
通過protoc --java_out=. addressbook.proto命令,可以生成Java源文件.
然后,我們需要將生成的這些源文件拷貝到項目根目錄下的src/main/java/com/mycompany/app目錄中.
這里需要注意的是,如果你在寫proto文件時,其中option java_package選項指定的目錄跟你想存放的目錄不一樣的話,需要手動修改一下生成的文件中的包名.
然后,我們在src/main/java/com/mycompany/app下,創建一個Java源文件,其內容如下:
package com.mycompany.app;
import java.io.*;
public class AddPerson {
static Person promptForAddress(BufferedReader stdin, PrintStream stdout) throws IOException {
Person.Builder person = Person.newBuilder();
stdout.print("Enter person ID: ");
person.setId(Integer.valueOf(stdin.readLine()));
stdout.print("Enter name: ");
person.setName(stdin.readLine());
stdout.print("Enter email address (blank for none): ");
String email = stdin.readLine();
if (email.length() > 0)
person.setEmail(email);
while (true) {
stdout.print("Enter a phone number (or leave blank to finish)");
String telephone = stdin.readLine();
if (telephone.length() == 0)
break;
Person.PhoneNumber.Builder phoneNumber = Person.PhoneNumber.newBuilder();
phoneNumber.setNumber(telephone);
stdout.print("Is this a mobile, home, or work phone? ");
String type = stdin.readLine();
if (type.equals("mobile"))
phoneNumber.setType(Person.PhoneType.MOBILE);
else if (type.equals("home"))
phoneNumber.setType(Person.PhoneType.HOME);
else if (type.equals("work"))
phoneNumber.setType(Person.PhoneType.WORK);
else {
stdout.print("Unknown phone type. Using default");
phoneNumber.setType(Person.PhoneType.HOME);
}
person.addPhones(phoneNumber);
}
return person.build();
}
public static void main(String[] args) throws Exception {
if (args.length != 1) {
System.err.println("Usage: AddPerson ADDRESS_BOOK_FILE");
System.exit(-1);
}
AddressBook.Builder addressBook = AddressBook.newBuilder();
try {
addressBook.mergeFrom(new FileInputStream(args[0]));
} catch (FileNotFoundException e) {
System.out.println(args[0] + " doesn't exist. Creating file.");
}
addressBook.addPeople(promptForAddress(new BufferedReader(new InputStreamReader(System.in)), System.out));
FileOutputStream fileOutputStream = new FileOutputStream(args[0]);
addressBook.build().writeTo(fileOutputStream);
fileOutputStream.close();
}
}
它的作用是,讓你輸入一個Person的信息,并且保存到你指定的文件中.
那么如何編譯這個文件呢?
進入到src/main/java這個目錄下,執行下面的命令:
** javac -cp .:/opt/mvn/resp/com/google/protobuf/protobuf-java/3.4.0/protobuf-java-3.4.0.jar com/mycompany/app/AddPerson.java**
其中你需要把protbuf-java的路徑換成你的機器上的路徑.
編譯完成后,通過java -cp .:/opt/mvn/resp/com/google/protobuf/protobuf-java/3.4.0/protobuf-java-3.4.0.jar com/mycompany/app/AddPerson hello這條命令來運行剛剛AddPerson文件.輸入完Person的信息后,我們會看到在當前目錄下,會生成一個十六進制的hello文件.
我們打開這個16進制文件,可以看到其中的內容為:
0A 08 0A 04 66 73 64 61 10 01
其中保存了一些元數據以及我輸入的數據的十六進制編碼.
就這樣就完成了.
總結
在這篇文章中,我們一步步介紹了如何創建一個Java并和protobuf結合.
這篇文章中,我只介紹了一部分用法,很不全面.
請去查看官方文檔來獲取更加全面的信息.
關于Protobuf的官方文檔,后續我可能會翻譯出來,也是放在這個系列中.