1

我正在尝试构建一些预先存在的 Java 代码,其中包括其传输层中的谷歌协议缓冲区。我正在使用的插件已包含在我的 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 插件调用)生成的代码没有实现从 protobuf 库中定义的父类的抽象函数,该 protobuf 库从 maven 导入到我的项目中。这是错误:

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

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

4

1 回答 1

1

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

您可以通过以下方式检查正在使用的protoc版本

protoc --version

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

如果你有 2.4.1

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

或者尝试使用protobuf jar的2.5.0版本。

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

于 2013-11-20T02:47:20.223 回答