如果在使用带有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
答案 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
并将所有原型文件编译到项目源中:)