Como dijimos en otro post, estamos usando Protocol Buffers para comunicar datos entre Java y C++.
El presente post se centra en la instalación y utilización de la librería por una aplicación JEE 6.
Como imaginé – a pesar que no se encuentra en la Central >> – para usarla en Java vamos a usar Maven.
De todos modos antes tenemos que compilar el ejecutable en C++.
Para instrucciones de cómo hacerlo, refiérase a este post >> (si ud. usa Windows, déjeme decirle que tiene un problema serio, pero aún así puedo compilar Protocol Buffers >>).
Una vez hecho ésto, podemos verificar que el ejecutable esté disponible en la consola
$ protoc --version libprotoc 2.4.1
Entonces, siguiendo el README al pie de la latra, nos situamos en la carpeta java/de la librería y corrremos los tests
protobuf-2.4.1/java$ mvn test
y nos aseguramos que todos pasen
------------------------------------------------------- T E S T S ------------------------------------------------------- ... Running com.google.protobuf.DeprecatedFieldTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.007 sec Results : Tests run: 252, Failures: 0, Errors: 0, Skipped: 0
Entonces dejamos el jar disponible en nuestro repositorio localpara usarlo en nuestra app
$ mvn install
Con éso ya podemos incluírla como dependencia en nuestro pom.xml.
Si tenemos m2eclipse lo más fácil es buscarla en la pestaña Dependencies.
Sino, ésta es la dependencia en xml
<dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>2.4.1</version> </dependency>
Entonces hagamos una prueba a ver si ésto funciona.
Creamos un .proto con una lista de algún tipo de dato básico
//evita conflictos dentro de protocol buffers package ejemplo; //especifico para Java con dominio institucional option java_package = "com.numerica.cl.proto"; //nombre de la clase, no puede coincidor con el del message option java_outer_classname = "CosaPB"; message Cosa{ optional int64 cdg=1;//Long optional string nombre=2; optional int32 x=3; } message Cosas{ repeated Cosa cosa=1; }
Ésto lo compilamos con protoc
protoc --java_out=/home/dir/app/src/main/java/ CosaPB.proto
(nótese que en rigor hay que darle una directiva -I con la localización del .proto, por defecto es el directorio en que estás parado)
Una vez generada la clase, podemos usarla
import com.numerica.cl.proto.CosaPB.Cosas; import com.numerica.cl.proto.CosaPB.Cosa; //inicializamos Cosas.Builder cosasB = Cosas.newBuilder(); for(MiCosa c : misCosas){ Cosa cPB= Cosa.newBuilder().setCdg(c.getCdg()).setNombre(c.getNombre()).setX(c.getX()).build(); cosasB.addCosa(cPB); } //construimos lista Cosas cosas = cosasB.build(); //serializamos FileOutputStream output = new FileOutputStream("CosasProtoBuff"); cosasB.writeTo(output); output.close();
Era