无法使用协议缓冲区3.1.0进行编译

时间:2016-12-02 01:47:17

标签: java serialization protocol-buffers avro

我下载/安装了协议缓冲区3.1.0,并使用 protoc 编译.proto文件,为我生成.java类。

通过此更改,一切正常/编译。 然后我用他们的最新版本替换了avro jar并尝试再次编译我的项目,但没有运气,它抱怨这个错误:

# Compile: pregen/media.proto
pregen/media.proto/serializers/protobuf/media/MediaContentHolder.java:828: error: cannot find symbol
            com.google.protobuf.Descriptors.OneofDescriptor oneof) {
                                           ^
  symbol:   class OneofDescriptor
  location: class Descriptors
pregen/media.proto/serializers/protobuf/media/MediaContentHolder.java:2669: error: cannot find symbol
            com.google.protobuf.Descriptors.OneofDescriptor oneof) {
                                           ^
  symbol:   class OneofDescriptor
  location: class Descriptors
pregen/media.proto/serializers/protobuf/media/MediaContentHolder.java:4131: error: cannot find symbol
            com.google.protobuf.Descriptors.OneofDescriptor oneof) {
                                           ^
  symbol:   class OneofDescriptor
  location: class Descriptors
3 errors

我做了很多搜索/研究但仍然没有运气,也看了这篇最相关的帖子:Problems using protobufs with java and scala 然后我将生成的.java文件和protobuf.3.1.0.jar一起编译成一个新的jar并放在我的lib /下,但是项目仍然无法编译。

有关如何解决此问题的任何帮助吗?

(我正在使用开源project来标记Java序列化性能,我也在那里发布了一个更详细的问题/ issue。)

1 个答案:

答案 0 :(得分:1)

该开源项目的作者之一帮助我解决了issue,并在此处复制了解决方案:

“问题在于avro-tools-1.8.1.jar捆绑了一些Protobuf 类文件(呃)。捆绑的类文件与那些文件不兼容 我们生成的Protobuf代码依赖于。

我们对类路径上的内容非常快速和松散;我们只是包括 “LIB / *。罐子”。在某些情况下更精确地依赖依赖项会很好 点。

但作为一个快速修复,我把avro-tools-1.8.1.jar放在“lib / extra /”中,所以它不会 默认情况下获取。 Makefile现在专门引用它 JAR只在我们需要运行Avro代码生成器时。“

感谢。