README.txt
1Protocol Buffers - Google's data interchange format
2Copyright 2008 Google Inc.
3
4This directory contains the Java Protocol Buffers runtime library.
5
6Installation - With Maven
7=========================
8
9The Protocol Buffers build is managed using Maven. If you would
10rather build without Maven, see below.
11
121) Install Apache Maven if you don't have it:
13
14 http://maven.apache.org/
15
162) Build the C++ code, or obtain a binary distribution of protoc. If
17 you install a binary distribution, make sure that it is the same
18 version as this package. If in doubt, run:
19
20 $ protoc --version
21
22 You will need to place the protoc executable in ../src. (If you
23 built it yourself, it should already be there.)
24
253) Run the tests:
26
27 $ mvn test
28
29 If some tests fail, this library may not work correctly on your
30 system. Continue at your own risk.
31
324) Install the library into your Maven repository:
33
34 $ mvn install
35
365) If you do not use Maven to manage your own build, you can build a
37 .jar file to use:
38
39 $ mvn package
40
41 The .jar will be placed in the "target" directory.
42
43Installation - 'Lite' Version - With Maven
44==========================================
45
46Building the 'lite' version of the Java Protocol Buffers library is
47the same as building the full version, except that all commands are
48run using the 'lite' profile. (see
49http://maven.apache.org/guides/introduction/introduction-to-profiles.html)
50
51E.g. to install the lite version of the jar, you would run:
52
53 $ mvn install -P lite
54
55The resulting artifact has the 'lite' classifier. To reference it
56for dependency resolution, you would specify it as:
57
58 <dependency>
59 <groupId>com.google.protobuf</groupId>
60 <artifactId>protobuf-java</artifactId>
61 <version>${version}</version>
62 <classifier>lite</classifier>
63 </dependency>
64
65Installation - Without Maven
66============================
67
68If you would rather not install Maven to build the library, you may
69follow these instructions instead. Note that these instructions skip
70running unit tests.
71
721) Build the C++ code, or obtain a binary distribution of protoc. If
73 you install a binary distribution, make sure that it is the same
74 version as this package. If in doubt, run:
75
76 $ protoc --version
77
78 If you built the C++ code without installing, the compiler binary
79 should be located in ../src.
80
812) Invoke protoc to build DescriptorProtos.java:
82
83 $ protoc --java_out=src/main/java -I../src \
84 ../src/google/protobuf/descriptor.proto
85
863) Compile the code in src/main/java using whatever means you prefer.
87
884) Install the classes wherever you prefer.
89
90Micro version
91============================
92
93The runtime and generated code for MICRO_RUNTIME is smaller
94because it does not include support for the descriptor,
95reflection or extensions. Also, not currently supported
96are packed repeated elements nor testing of java_multiple_files.
97
98To create a jar file for the runtime and run tests invoke
99"mvn package -P micro" from the <protobuf-root>/java
100directory. The generated jar file is
101<protobuf-root>java/target/protobuf-java-2.2.0-micro.jar.
102
103If you wish to compile the MICRO_RUTIME your self, place
104the 7 files below, in <root>/com/google/protobuf and
105create a jar file for use with your code and the generated
106code:
107
108ByteStringMicro.java
109CodedInputStreamMicro.java
110CodedOutputStreamMicro.java
111InvalidProtocolBufferException.java
112MessageMicro.java
113WireFormatMicro.java
114
115If you wish to change on the code generator it is located
116in /src/google/protobuf/compiler/javamicro.
117
118To generate code for the MICRO_RUNTIME invoke protoc with
119--javamicro_out command line parameter. javamciro_out takes
120a series of optional sub-parameters separated by comma's
121and a final parameter, with a colon separator, which defines
122the source directory. Sub-paraemeters begin with a name
123followed by an equal and if that sub-parameter has multiple
124parameters they are seperated by "|". The command line options
125are:
126
127opt -> speed or space
128java_use_vector -> true or false
129java_package -> <file-name>|<package-name>
130java_outer_classname -> <file-name>|<package-name>
131
132opt:
133 This change the code generation to optimize for speed,
134 opt=speed, or space, opt=space. When opt=speed this
135 changes the code generation for strings so that multiple
136 conversions to Utf8 are eliminated. The default value
137 is opt=space.
138
139java_use_vector:
140 Is a boolean flag either java_use_vector=true or
141 java_use_vector=false. When java_use_vector=true the
142 code generated for repeated elements uses
143 java.util.Vector and when java_use_vector=false the
144 java.util.ArrayList<> is used. When java.util.Vector
145 is used the code must be compiled with Java 1.3 and
146 when ArrayList is used Java 1.5 or above must be used.
147 The using javac the source parameter maybe used to
148 control the version of the srouce: "javac -source 1.3".
149 You can also change the <source> xml element for the
150 maven-compiler-plugin. Below is for 1.5 sources:
151
152 <plugin>
153 <artifactId>maven-compiler-plugin</artifactId>
154 <configuration>
155 <source>1.5</source>
156 <target>1.5</target>
157 </configuration>
158 </plugin>
159
160 When compiling for 1.5 java_use_vector=false or not
161 present where the default value is false.
162
163 And below would be for 1.3 sources note when changing
164 to 1.3 you must also set java_use_vector=true:
165
166 <plugin>
167 <artifactId>maven-compiler-plugin</artifactId>
168 <configuration>
169 <source>1.3</source>
170 <target>1.5</target>
171 </configuration>
172 </plugin>
173
174java_package:
175 The allows setting/overriding the java_package option
176 and associates allows a package name for a file to
177 be specified on the command line. Overriding any
178 "option java_package xxxx" in the file. The default
179 if not present is to use the value from the package
180 statment or "option java_package xxxx" in the file.
181
182java_outer_classname:
183 This allows the setting/overriding of the outer
184 class name option and associates a class name
185 to a file. An outer class name is required and
186 must be specified if there are multiple messages
187 in a single proto file either in the proto source
188 file or on the command line. If not present the
189 no outer class name will be used.
190
191Below are a series of examples for clarification of the
192various javamicro_out parameters using
193src/test/proto/simple-data.proto:
194
195package testprotobuf;
196
197message SimpleData {
198 optional fixed64 id = 1;
199 optional string description = 2;
200 optional bool ok = 3 [default = false];
201};
202
203
204Assuming you've only compiled and not installed protoc and
205your current working directory java/, then a simple
206command line to compile simple-data would be:
207
208../src/protoc --javamicro_out=. src/test/proto/simple-data.proto
209
210This will create testprotobuf/SimpleData.java
211
212The directory testprotobuf is created because on line 1
213of simple-data.proto is "package testprotobuf;". If you
214wanted a different package name you could use the
215java_package option command line sub-parameter:
216
217../src/protoc '--javamicro_out=java_package=src/test/proto/simple-data.proto|my_package:.' src/test/proto/simple-data.proto
218
219Here you see the new java_package sub-parameter which
220itself needs two parameters the file name and the
221package name, these are separated by "|". Now you'll
222find my_package/SimpleData.java.
223
224If you wanted to also change the optimization for
225speed you'd add opt=speed with the comma seperator
226as follows:
227
228../src/protoc '--javamicro_out=opt=speed,java_package=src/test/proto/simple-data.proto|my_package:.' src/test/proto/simple-data.proto
229
230Finally if you also wanted an outer class name you'd
231do the following:
232
233../src/protoc '--javamicro_out=opt=speed,java_package=src/test/proto/simple-data.proto|my_package,java_outer_classname=src/test/proto/simple-data.proto|OuterName:.' src/test/proto/simple-data.proto
234
235Now you'll find my_packate/OuterName.java.
236
237As mentioned java_package and java_outer_classname
238may also be specified in the file. In the example
239below we must define java_outer_classname because
240there are multiple messages in
241src/test/proto/two-messages.proto
242
243package testmicroruntime;
244
245option java_package = "com.example";
246option java_outer_classname = "TestMessages";
247
248message TestMessage1 {
249 required int32 id = 1;
250}
251
252message TestMessage2 {
253 required int32 id = 1;
254}
255
256This could be compiled using:
257
258../src/protoc --javamicro_out=. src/test/proto/two-message.proto
259
260With the result will be com/example/TestMessages.java
261
262
263Usage
264=====
265
266The complete documentation for Protocol Buffers is available via the
267web at:
268
269 http://code.google.com/apis/protocolbuffers/
270