|
|
|
@ -91,9 +91,11 @@ Micro version |
|
|
|
|
============================ |
|
|
|
|
|
|
|
|
|
The runtime and generated code for MICRO_RUNTIME is smaller |
|
|
|
|
because it does not include support for the descriptor, |
|
|
|
|
reflection or extensions. Also, not currently supported |
|
|
|
|
are packed repeated elements nor testing of java_multiple_files. |
|
|
|
|
because it does not include support for the descriptor and |
|
|
|
|
reflection, and enums are generated as integer constants in |
|
|
|
|
the parent message or the file's outer class. Also, not |
|
|
|
|
currently supported are packed repeated elements or |
|
|
|
|
extensions. |
|
|
|
|
|
|
|
|
|
To create a jar file for the runtime and run tests invoke |
|
|
|
|
"mvn package -P micro" from the <protobuf-root>/java |
|
|
|
@ -128,26 +130,24 @@ opt -> speed or space |
|
|
|
|
java_use_vector -> true or false |
|
|
|
|
java_package -> <file-name>|<package-name> |
|
|
|
|
java_outer_classname -> <file-name>|<package-name> |
|
|
|
|
|
|
|
|
|
opt: |
|
|
|
|
This changes the code generation to optimize for speed, |
|
|
|
|
opt=speed, or space, opt=space. When opt=speed this |
|
|
|
|
changes the code generation for strings so that multiple |
|
|
|
|
conversions to Utf8 are eliminated. The default value |
|
|
|
|
is opt=space. |
|
|
|
|
|
|
|
|
|
java_use_vector: |
|
|
|
|
Is a boolean flag either java_use_vector=true or |
|
|
|
|
java_use_vector=false. When java_use_vector=true the |
|
|
|
|
code generated for repeated elements uses |
|
|
|
|
java.util.Vector and when java_use_vector=false the |
|
|
|
|
java.util.ArrayList<> is used. When java.util.Vector |
|
|
|
|
is used the code must be compiled with Java 1.3 and |
|
|
|
|
when ArrayList is used Java 1.5 or above must be used. |
|
|
|
|
The using javac the source parameter may be used to |
|
|
|
|
control the version of the source: "javac -source 1.3". |
|
|
|
|
You can also change the <source> xml element for the |
|
|
|
|
maven-compiler-plugin. Below is for 1.5 sources: |
|
|
|
|
java_multiple_files -> true or false |
|
|
|
|
|
|
|
|
|
opt={speed,space} (default: space) |
|
|
|
|
This changes the code generation to optimize for speed or |
|
|
|
|
space. When opt=speed this changes the code generation |
|
|
|
|
for strings so that multiple conversions to Utf8 are |
|
|
|
|
eliminated. |
|
|
|
|
|
|
|
|
|
java_use_vector={true,false} (default: false) |
|
|
|
|
This specifies the collection class for repeated elements. |
|
|
|
|
If false, repeated elements use java.util.ArrayList<> and |
|
|
|
|
the code must be compiled with Java 1.5 or above. If true, |
|
|
|
|
repeated elements use java.util.Vector and the code can |
|
|
|
|
be compiled with Java 1.3 or above. The 'source' |
|
|
|
|
parameter of 'javac' may be used to control the version |
|
|
|
|
of the source: "javac -source 1.3". You can also change |
|
|
|
|
the <source> xml element for the maven-compiler-plugin. |
|
|
|
|
Below is for 1.5 sources: |
|
|
|
|
|
|
|
|
|
<plugin> |
|
|
|
|
<artifactId>maven-compiler-plugin</artifactId> |
|
|
|
@ -157,11 +157,8 @@ java_use_vector: |
|
|
|
|
</configuration> |
|
|
|
|
</plugin> |
|
|
|
|
|
|
|
|
|
When compiling for 1.5 java_use_vector=false or not |
|
|
|
|
present where the default value is false. |
|
|
|
|
|
|
|
|
|
And below would be for 1.3 sources note when changing |
|
|
|
|
to 1.3 you must also set java_use_vector=true: |
|
|
|
|
And below would be for 1.3 sources (note when changing |
|
|
|
|
to 1.3 you must also set java_use_vector=true): |
|
|
|
|
|
|
|
|
|
<plugin> |
|
|
|
|
<artifactId>maven-compiler-plugin</artifactId> |
|
|
|
@ -171,93 +168,241 @@ java_use_vector: |
|
|
|
|
</configuration> |
|
|
|
|
</plugin> |
|
|
|
|
|
|
|
|
|
java_package: |
|
|
|
|
The allows setting/overriding the java_package option |
|
|
|
|
and associates allows a package name for a file to |
|
|
|
|
be specified on the command line. Overriding any |
|
|
|
|
"option java_package xxxx" in the file. The default |
|
|
|
|
if not present is to use the value from the package |
|
|
|
|
statment or "option java_package xxxx" in the file. |
|
|
|
|
java_package=<file-name>|<package-name> (no default) |
|
|
|
|
This allows overriding the 'java_package' option value |
|
|
|
|
for the given file from the command line. Use multiple |
|
|
|
|
java_package options to override the option for multiple |
|
|
|
|
files. The final Java package for each file is the value |
|
|
|
|
of this command line option if present, or the value of |
|
|
|
|
the same option defined in the file if present, or the |
|
|
|
|
proto package if present, or the default Java package. |
|
|
|
|
|
|
|
|
|
java_outer_classname=<file-name>|<outer-classname> (no default) |
|
|
|
|
This allows overriding the 'java_outer_classname' option |
|
|
|
|
for the given file from the command line. Use multiple |
|
|
|
|
java_outer_classname options to override the option for |
|
|
|
|
multiple files. The final Java outer class name for each |
|
|
|
|
file is the value of this command line option if present, |
|
|
|
|
or the value of the same option defined in the file if |
|
|
|
|
present, or the file name converted to CamelCase. This |
|
|
|
|
outer class will nest all classes and integer constants |
|
|
|
|
generated from file-scope messages and enums. |
|
|
|
|
|
|
|
|
|
java_multiple_files={true,false} (no default) |
|
|
|
|
This allows overriding the 'java_multiple_files' option |
|
|
|
|
in all source files and their imported files from the |
|
|
|
|
command line. The final value of this option for each |
|
|
|
|
file is the value defined in this command line option, or |
|
|
|
|
the value of the same option defined in the file if |
|
|
|
|
present, or false. This specifies whether to generate |
|
|
|
|
package-level classes for the file-scope messages in the |
|
|
|
|
same Java package as the outer class (instead of nested |
|
|
|
|
classes in the outer class). File-scope enum constants |
|
|
|
|
are still generated as integer constants in the outer |
|
|
|
|
class. This affects the fully qualified references in the |
|
|
|
|
Java code. NOTE: because the command line option |
|
|
|
|
overrides the value for all files and their imported |
|
|
|
|
files, using this option inconsistently may result in |
|
|
|
|
incorrect references to the imported messages and enum |
|
|
|
|
constants. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
IMPORTANT: change of javamicro_out behavior: |
|
|
|
|
|
|
|
|
|
In previous versions, if the outer class name has not been |
|
|
|
|
given explicitly, javamicro_out would not infer the outer |
|
|
|
|
class name from the file name, and would skip the outer |
|
|
|
|
class generation. This makes the compilation succeed only |
|
|
|
|
if the source file contains a single message and no enums, |
|
|
|
|
and the generated class for that message is placed at the |
|
|
|
|
package level. To re-align with java_out, javamicro_out |
|
|
|
|
will now always generate the outer class, inferring its |
|
|
|
|
name from the file name if not given, as a container of the |
|
|
|
|
message classes and enum constants. To keep any existing |
|
|
|
|
single-message source file from causing the generation of |
|
|
|
|
an unwanted outer class, you can set the option |
|
|
|
|
java_multiple_files to true, either in the file or as a |
|
|
|
|
command line option. |
|
|
|
|
|
|
|
|
|
java_outer_classname: |
|
|
|
|
This allows the setting/overriding of the outer |
|
|
|
|
class name option and associates a class name |
|
|
|
|
to a file. An outer class name is required and |
|
|
|
|
must be specified if there are multiple messages |
|
|
|
|
in a single proto file either in the proto source |
|
|
|
|
file or on the command line. If not present the |
|
|
|
|
no outer class name will be used. |
|
|
|
|
|
|
|
|
|
Below are a series of examples for clarification of the |
|
|
|
|
various javamicro_out parameters using |
|
|
|
|
src/test/proto/simple-data.proto: |
|
|
|
|
various parameters and options. Assuming this file: |
|
|
|
|
|
|
|
|
|
src/proto/simple-data-protos.proto: |
|
|
|
|
|
|
|
|
|
package testprotobuf; |
|
|
|
|
|
|
|
|
|
message SimpleData { |
|
|
|
|
optional fixed64 id = 1; |
|
|
|
|
optional string description = 2; |
|
|
|
|
optional bool ok = 3 [default = false]; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
and the compiled protoc in the current working directory, |
|
|
|
|
then a simple command line to compile this file would be: |
|
|
|
|
|
|
|
|
|
package testprotobuf; |
|
|
|
|
./protoc --javamicro_out=. src/proto/simple-data-protos.proto |
|
|
|
|
|
|
|
|
|
message SimpleData { |
|
|
|
|
optional fixed64 id = 1; |
|
|
|
|
optional string description = 2; |
|
|
|
|
optional bool ok = 3 [default = false]; |
|
|
|
|
}; |
|
|
|
|
This will create testprotobuf/SimpleDataProtos.java, which |
|
|
|
|
has the following content (extremely simplified): |
|
|
|
|
|
|
|
|
|
package testprotobuf; |
|
|
|
|
|
|
|
|
|
Assuming you've only compiled and not installed protoc and |
|
|
|
|
your current working directory java/, then a simple |
|
|
|
|
command line to compile simple-data would be: |
|
|
|
|
public final class SimpleDataProtos { |
|
|
|
|
public static final class SimpleData |
|
|
|
|
extends MessageMicro { |
|
|
|
|
... |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
../src/protoc --javamicro_out=. src/test/proto/simple-data.proto |
|
|
|
|
The message SimpleData is compiled into the SimpleData |
|
|
|
|
class, nested in the file's outer class SimpleDataProtos, |
|
|
|
|
whose name is implicitly defined by the proto file name |
|
|
|
|
"simple-data-protos". |
|
|
|
|
|
|
|
|
|
This will create testprotobuf/SimpleData.java |
|
|
|
|
The directory, aka Java package, testprotobuf is created |
|
|
|
|
because on line 1 of simple-data-protos.proto is |
|
|
|
|
"package testprotobuf;". If you wanted a different |
|
|
|
|
package name you could use the java_package option in the |
|
|
|
|
file: |
|
|
|
|
|
|
|
|
|
The directory testprotobuf is created because on line 1 |
|
|
|
|
of simple-data.proto is "package testprotobuf;". If you |
|
|
|
|
wanted a different package name you could use the |
|
|
|
|
java_package option command line sub-parameter: |
|
|
|
|
option java_package = "my_package"; |
|
|
|
|
|
|
|
|
|
../src/protoc '--javamicro_out=java_package=src/test/proto/simple-data.proto|my_package:.' src/test/proto/simple-data.proto |
|
|
|
|
or in command line sub-parameter: |
|
|
|
|
|
|
|
|
|
./protoc '--javamicro_out=\ |
|
|
|
|
java_package=src/proto/simple-data-protos.proto|my_package:\ |
|
|
|
|
.' src/proto/simple-data-protos.proto |
|
|
|
|
|
|
|
|
|
Here you see the new java_package sub-parameter which |
|
|
|
|
itself needs two parameters the file name and the |
|
|
|
|
package name, these are separated by "|". Now you'll |
|
|
|
|
find my_package/SimpleData.java. |
|
|
|
|
package name, these are separated by "|". The value set |
|
|
|
|
in the command line overrides the value set in the file. |
|
|
|
|
Now you'll find SimpleDataProtos.java in the my_package/ |
|
|
|
|
directory. |
|
|
|
|
|
|
|
|
|
If you wanted to also change the optimization for |
|
|
|
|
speed you'd add opt=speed with the comma seperator |
|
|
|
|
as follows: |
|
|
|
|
|
|
|
|
|
../src/protoc '--javamicro_out=opt=speed,java_package=src/test/proto/simple-data.proto|my_package:.' src/test/proto/simple-data.proto |
|
|
|
|
./protoc '--javamicro_out=\ |
|
|
|
|
opt=speed,\ |
|
|
|
|
java_package=src/proto/simple-data-protos.proto|my_package: |
|
|
|
|
.' src/proto/simple-data-protos.proto |
|
|
|
|
|
|
|
|
|
Finally if you also wanted an outer class name you'd |
|
|
|
|
If you also wanted a different outer class name you'd |
|
|
|
|
do the following: |
|
|
|
|
|
|
|
|
|
../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 |
|
|
|
|
./protoc '--javamicro_out=\ |
|
|
|
|
opt=speed,\ |
|
|
|
|
java_package=src/proto/simple-data-protos.proto|my_package,\ |
|
|
|
|
java_outer_classname=src/proto/simple-data-protos.proto|OuterName:\ |
|
|
|
|
.' src/proto/simple-data-protos.proto |
|
|
|
|
|
|
|
|
|
Now you'll find my_package/OuterName.java and the |
|
|
|
|
message class SimpleData nested in it. |
|
|
|
|
|
|
|
|
|
Now you'll find my_packate/OuterName.java. |
|
|
|
|
As mentioned java_package, java_outer_classname and |
|
|
|
|
java_multiple_files may also be specified in the file. |
|
|
|
|
In the example below we must define |
|
|
|
|
java_outer_classname because otherwise the outer class |
|
|
|
|
and one of the message classes will have the same name, |
|
|
|
|
which is forbidden to prevent name ambiguity: |
|
|
|
|
|
|
|
|
|
As mentioned java_package and java_outer_classname |
|
|
|
|
may also be specified in the file. In the example |
|
|
|
|
below we must define java_outer_classname because |
|
|
|
|
there are multiple messages in |
|
|
|
|
src/test/proto/two-messages.proto |
|
|
|
|
src/proto/sample-message.proto: |
|
|
|
|
|
|
|
|
|
package testmicroruntime; |
|
|
|
|
package testmicroruntime; |
|
|
|
|
|
|
|
|
|
option java_package = "com.example"; |
|
|
|
|
option java_outer_classname = "TestMessages"; |
|
|
|
|
option java_package = "com.example"; |
|
|
|
|
option java_outer_classname = "SampleMessageProtos"; |
|
|
|
|
|
|
|
|
|
message TestMessage1 { |
|
|
|
|
required int32 id = 1; |
|
|
|
|
} |
|
|
|
|
enum MessageType { |
|
|
|
|
SAMPLE = 1; |
|
|
|
|
EXAMPLE = 2; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
message TestMessage2 { |
|
|
|
|
required int32 id = 1; |
|
|
|
|
} |
|
|
|
|
message SampleMessage { |
|
|
|
|
required int32 id = 1; |
|
|
|
|
required MessageType type = 2; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
message SampleMessageContainer { |
|
|
|
|
required SampleMessage message = 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
This could be compiled using: |
|
|
|
|
|
|
|
|
|
../src/protoc --javamicro_out=. src/test/proto/two-message.proto |
|
|
|
|
./protoc --javamicro_out=. src/proto/sample-message.proto |
|
|
|
|
|
|
|
|
|
and the output will be: |
|
|
|
|
|
|
|
|
|
com/example/SampleMessageProtos.java: |
|
|
|
|
|
|
|
|
|
package com.example; |
|
|
|
|
|
|
|
|
|
public final class SampleMessageProtos { |
|
|
|
|
public static final int SAMPLE = 1; |
|
|
|
|
public static final int EXAMPLE = 2; |
|
|
|
|
public static final class SampleMessage |
|
|
|
|
extends MessageMicro { |
|
|
|
|
... |
|
|
|
|
} |
|
|
|
|
public static final class SampleMessageContainer |
|
|
|
|
extends MessageMicro { |
|
|
|
|
... |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
As you can see the file-scope enum MessageType is |
|
|
|
|
disassembled into two integer constants in the outer class. |
|
|
|
|
In javamicro_out, all enums are disassembled and compiled |
|
|
|
|
into integer constants in the parent scope (the containing |
|
|
|
|
message's class or the file's (i.e. outer) class). |
|
|
|
|
|
|
|
|
|
With the result will be com/example/TestMessages.java |
|
|
|
|
You may prefer the file-scope messages to be saved in |
|
|
|
|
separate files. You can do this by setting the option |
|
|
|
|
java_multiple_files to true, in either the file like this: |
|
|
|
|
|
|
|
|
|
option java_multiple_files = true; |
|
|
|
|
|
|
|
|
|
or the command line like this: |
|
|
|
|
|
|
|
|
|
./protoc --javamicro_out=\ |
|
|
|
|
java_multiple_files=true:\ |
|
|
|
|
. src/proto/sample-message.proto |
|
|
|
|
|
|
|
|
|
The java_multiple_files option causes javamicro to use a |
|
|
|
|
separate file for each file-scope message, which resides |
|
|
|
|
directly in the Java package alongside the outer class: |
|
|
|
|
|
|
|
|
|
com/example/SampleMessageProtos.java: |
|
|
|
|
|
|
|
|
|
package com.example; |
|
|
|
|
public final class SampleMessageProtos { |
|
|
|
|
public static final int SAMPLE = 1; |
|
|
|
|
public static final int EXAMPLE = 2; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
com/example/SampleMessage.java: |
|
|
|
|
|
|
|
|
|
package com.example; |
|
|
|
|
public final class SampleMessage |
|
|
|
|
extends MessageMicro { |
|
|
|
|
... |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
com/example/SampleMessageContainer.java: |
|
|
|
|
|
|
|
|
|
package com.example; |
|
|
|
|
public final class SampleMessageContainer |
|
|
|
|
extends MessageMicro { |
|
|
|
|
... |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
As you can see, the outer class now contains only the |
|
|
|
|
integer constants, generated from the file-scope enum |
|
|
|
|
"MessageType". Please note that message-scope enums are |
|
|
|
|
still generated as integer constants in the message class. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Nano version |
|
|
|
@ -303,9 +448,19 @@ empty default. |
|
|
|
|
|
|
|
|
|
Nano Generator options |
|
|
|
|
|
|
|
|
|
java_nano_generate_has: |
|
|
|
|
java_package -> <file-name>|<package-name> |
|
|
|
|
java_outer_classname -> <file-name>|<package-name> |
|
|
|
|
java_multiple_files -> true or false |
|
|
|
|
java_nano_generate_has -> true or false |
|
|
|
|
|
|
|
|
|
java_package: |
|
|
|
|
java_outer_classname: |
|
|
|
|
java_multiple_files: |
|
|
|
|
Same as Micro version. |
|
|
|
|
|
|
|
|
|
java_nano_generate_has={true,false} (default: false) |
|
|
|
|
If true, generates a public boolean variable has<fieldname> |
|
|
|
|
accompanying the optional or required field (not present for |
|
|
|
|
accompanying each optional or required field (not present for |
|
|
|
|
repeated fields, groups or messages). It is set to false initially |
|
|
|
|
and upon clear(). If parseFrom(...) reads the field from the wire, |
|
|
|
|
it is set to true. This is a way for clients to inspect the "has" |
|
|
|
@ -324,7 +479,10 @@ To use nano protobufs: |
|
|
|
|
<protobuf-root>java/target/protobuf-java-2.3.0-nano.jar. |
|
|
|
|
- Invoke with --javanano_out, e.g.: |
|
|
|
|
|
|
|
|
|
../src/protoc '--javanano_out=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 |
|
|
|
|
./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 |
|
|
|
|
|
|
|
|
|
Contributing to nano: |
|
|
|
|
|
|
|
|
|