2012-07-28 106 views
7

如果在使用protobufs和java时遇到类似这样的构建错误,请看下面。Protobuf java代码有构建错误

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 
+0

自述文件确实无法使它更清晰:*您仍然需要下载源代码包才能获得 Java或Python运行时库。获取它: https://github.com/google/protobuf/releases/* – 2015-08-09 23:10:56

回答

31

好,为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文件复制到您的项目。

+0

这帮了我很多。谢谢! – 2012-12-31 02:17:06

+0

@Timmmm:这有助于..谢谢..但无论如何,我只是无法理解命令“protoc --java_out = src/main/java -I ../ src ../src/google/protobuf/descriptor.proto”的含义,尽管我有一个模糊的想法..所以你可以清楚地解释一下吗? – 2014-01-03 10:27:22

+0

@aarish run protoc -h。 -I是搜索导入的目录,--java_out是放置生成的源文件的目录,最后一个参数是要从'README.md'目录编译 – doc 2014-12-02 12:54:33

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和所有的原文件将被编译到项目的源:)

0

https://github.com/google/protobuf/tree/master/java

安装 - 没有Maven的

如果你宁愿不安装Maven构建库,Y您可以按照这些说明进行操作。请注意,这些指令将跳过运行单元测试,并仅介绍如何安装核心protobuf库(不包含util软件包)。

1)构建C++代码,或获取protoc的二进制分发。如果您安装二进制分发版,请确保它与此软件包版本相同。如果有疑问,请运行:

$ protoc --version 如果您在不安装的情况下构建C++代码,则编译器二进制文件应位于../src中。

2)调用protoc构建DescriptorProtos.java:

$ protoc --java_out =芯/ SRC /主/ JAVA -I ../ SRC \ ../src/google/protobuf/descriptor。原型 3)使用任何你喜欢的方式在core/src/main/java中编译代码。

4)根据您的喜好安装类。