Protobuf java代码有构建错误

时间:2012-07-28 01:46:35

标签: java protocol-buffers

如果在使用带有java的protobufs时遇到类似这样的构建错误,请查看以下内容。

The method getOptions() from the type Descriptors.Descriptor refers to the missing type MessageOptions

The import com.google.protobuf.DescriptorProtos cannot be resolved

FileDescriptorProto cannot be resolved to a type

2 个答案:

答案 0 :(得分:34)

好的,对于protobufs所谓的Java tutorial实际上没有提到如何将protobuf库放入你的项目中。这意味着所有代码都在你单个生成的.java文件中,这实际上非常好,但事实并非如此。

查看源代码,您将看到com.google.protobuf的引用,您可以在protobuf源的java/src/main/java目录中找到它。然而,将其复制到您的项目中,它将会出现构建错误。

解决方案位于README.txt文件中。是的,也许我应该阅读它,但是不应该开始教程所需的所有信息?无论如何,这样做:

# From the protobuf directory.
cd java
protoc --java_out=src/main/java -I../src ../src/google/protobuf/descriptor.proto

然后然后将java文件复制到您的项目中。

答案 1 :(得分:0)

另一种选择是编辑源中包含的pom.xml。您可以更改它以在验证生命周期中编译proto文件并将它们写入源目录。

应用此差异或类似(或创建新的构建配置文件):

$ diff -u ~/Downloads/protobuf-2.6.0/java/pom.xml pom.xml
--- /c/Users/MYNAME/Downloads/protobuf-2.6.0/java/pom.xml     Mon Aug 25 20:52:36 2014
+++ pom.xml     Tue Dec  2 13:51:56 2014
@@ -74,12 +74,12 @@
         <executions>
           <execution>
             <id>generate-sources</id>
-            <phase>generate-sources</phase>
+            <phase>validate</phase>
             <configuration>
               <tasks>
                 <mkdir dir="target/generated-sources" />
-                <exec executable="../src/protoc">
-                  <arg value="--java_out=target/generated-sources" />
+                <exec executable="protoc">
+                  <arg value="--java_out=src/main/java" />
                   <arg value="--proto_path=../src" />
                   <arg value="../src/google/protobuf/descriptor.proto" />
                 </exec>
@@ -92,12 +92,12 @@
           </execution>
           <execution>
             <id>generate-test-sources</id>
-            <phase>generate-test-sources</phase>
+            <phase>validate</phase>
             <configuration>
               <tasks>
                 <mkdir dir="target/generated-test-sources" />
-                <exec executable="../src/protoc">
-                  <arg value="--java_out=target/generated-test-sources" />
+                <exec executable="protoc">
+                  <arg value="--java_out=src/test/java" />
                   <arg value="--proto_path=../src" />
                   <arg value="--proto_path=src/test/java" />
                   <arg value="../src/google/protobuf/unittest.proto" />

现在,您可以运行mvn validate并将所有原型文件编译到项目源中:)