7

我在需要使用 Protobuf 的地方使用带有 Java 的 Play 框架(它使用 SBT 构建工具)。所以我有xxx.proto文件。我得到了二进制协议编译器并添加到类路径中。所以我看到了——

protoc --version
libprotoc 3.1.0

我已经使用 - 编译了 xxx.proto 文件, protoc -I=$SRC_DIR --java_out=$DST_DIR $SRC_DIR/xxx.proto因此它生成了 xxx.java 文件。

现在当我编译这个 xxx.java 文件时(使用 sbt 构建工具的项目)

[error] /my_project/app/helpers/xxx.java:7: package com.google.protobuf        does not exist
[error] com.google.protobuf.ExtensionRegistryLite
[error] /my_project/app/helpers/xxx.java:11: package com.google.protobuf does not exist
[error] com.google.protobuf.ExtensionRegistry
[error] /my_project/app/helpers/xxx.java:6182: package com.google.protobuf.Descriptors does not exist
[error] com.google.protobuf.Descriptors.Descriptor
[error] /my_project/app/helpers/xxx.java:6185: package com.google.protobuf.GeneratedMessageV3 does not exist
[error] com.google.protobuf.GeneratedMessageV3.FieldAccessorTable`

我在我安装的库中看到 - com.google.protobufjar 在那里。

我的xxx.proto样子如下——

 // Generated by the protocol buffer compiler.  DO NOT EDIT!
 // source: xxx.proto

 public final class xxx {
 private xxx() {}
 public static void registerAllExtensions(
  com.google.protobuf.ExtensionRegistryLite registry) {
 }

  public static void registerAllExtensions(
  com.google.protobuf.ExtensionRegistry registry) {
   registerAllExtensions(
    (com.google.protobuf.ExtensionRegistryLite) registry);
 }
 ......

xxx.java生成文件时我遗漏了什么吗?我应该如何修复这些编译错误?

4

3 回答 3

7

您需要确保使用完全相同的版本protoclibprotobuf.jar。从您写的内容来看,听起来您使用的是 protoc 版本 3.1.0 但 libprotobuf 2.5.0。你需要改用 libprotobuf 3.1.0,否则你会得到像你引用的那样的编译错误。

于 2016-11-26T20:27:53.357 回答
1

用更多说明重新陈述肯顿的答案:

在 Intellij 中,单击 External Libraries 并找到 protobuf 的 jar。

在此处输入图像描述

检查协议的版本:

在此处输入图像描述

如果它们不匹配(如上所示),那么您将收到编译错误。

于 2019-06-19T14:47:57.477 回答
0

在我的原型模式中更改了某些字段类型然后在没有先进行清理的情况下构建之后,我已经看到了与 maven 类似的问题。但是,每次都进行清理和构建修复它。

于 2021-01-20T13:56:31.673 回答