使用maven插件生成协议缓冲区导致版本错误

时间:2013-10-17 18:27:51

标签: java maven protocol-buffers

我正在尝试构建一些预先存在的Java代码,其中包含传输层中的Google协议缓冲区。我正在使用的plugin我已经在我的pom文件中包含以下元素:

<plugin>
    <groupId>com.github.igor-petruk.protobuf</groupId>
    <artifactId>protobuf-maven-plugin</artifactId>
    <version>0.6.3</version>
    <executions>
        <execution>
            <goals>
                <goal>run</goal>
            </goals>
        </execution>
    </executions>
</plugin>

我已经安装了protobuf版本2.4.1并且命令行可以使用protoc,而我在pom中包含的protobuf-java版本也是com.google.protobuf组中的2.4.1版本。我必须使用这个技术堆栈,因为我正在使用现有的代码库,如前所述,但尽管有更新版本的protobufs,但这不是我遇到的问题。

问题是protoc二进制文件生成的代码(由上面提到的maven插件调用)没有实现从maven导入到我的项目的protobuf库中定义的父类的抽象函数。这是错误:

[ERROR] <generated java class from protoc> is not abstract and does not override abstract method getParserForType() in com.google.protobuf.MessageLite

我的假设是protobuf库存在一些配置错误,并且此函数getParserForType存在于其中一个库中,而不存在于另一个库中。

1 个答案:

答案 0 :(得分:0)

这听起来像是生成的 java代码与protobuf jar库之间的不匹配。 特别是我认为java代码是使用 protoc 2.5.0 生成的,并且您正在运行 protobuf jar的早期版本( 2.4.1

您可以通过

查看正在使用的 protoc 的版本
protoc --version

如果是2.5.0生成并重新安装 protoc 版本2.4.1

如果你有2.4.1

  • 重新生成java类(手动?)
  • 与当前班级进行比较

Alternaitely尝试使用 protobuf jar 2.5.0 版本。

注意:     对于大多数协议缓冲区版本,用于生成java类的protoc版本与jar库相同并不重要。在protbuf 2.5.0中,很多方法从jar库中的基类移动到生成的代码。