Ошибка компиляции при компиляции Protobufs в Java с использованием инструмента сборки SBT

Я использую платформу Play (которая использует инструмент сборки SBT) с Java, где мне нужно использовать Protobuf. Итак, у меня есть файл xxx.proto. Я получил компилятор бинарного протокола и добавил его в путь к классу. так я вижу -

протокол --версия
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.protobuf jar.

Мой 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? Как мне исправить эту ошибку компиляции?


person Richa Gupta    schedule 24.11.2016    source источник
comment
Я просто хочу добавить, что у меня уже есть jar protobuf-java-2.0.5 в корне моей библиотеки.   -  person Richa Gupta    schedule 24.11.2016
comment
По какой-то причине компилятор не видит библиотеку protobuf, вероятно, проблема с правилом сборки sbt. Вы уверены, что sbt использует корень вашей библиотеки? Вы пытались скомпилировать xxx.java вручную с помощью javac и protobuf-java-2.0.5.jar в пути к классам?   -  person Stefan Haustein    schedule 25.11.2016
comment
Да, javac xxx.java -cp $PATH_TO_Protobuf_jar/protobuf-java-2.5.0.jar Но все равно выдает ошибки -xxx.java:6188: ошибка: пакет com.google.protobuf.GeneratedMessageV3 не существует com.google.protobuf .GeneratedMessageV3.FieldAccessorTable ^ xxx.java:6193: ошибка: пакет com.google.protobuf.GeneratedMessageV3 не существует com.google.protobuf.GeneratedMessageV3.FieldAccessorTable   -  person Richa Gupta    schedule 25.11.2016
comment
Доступна ли более новая версия? Суффикс V3, кажется, предполагает, что вам понадобится protobuf-java-3.0.0.jar или более поздняя версия?   -  person Stefan Haustein    schedule 25.11.2016


Ответы (3)


Вы должны убедиться, что используете одни и те же версии protoc и libprotobuf.jar. Судя по тому, что вы написали, вы используете protoc версии 3.1.0, но libprotobuf 2.5.0. Вместо этого вам нужно использовать libprotobuf 3.1.0, иначе вы получите ошибки компиляции, подобные тем, которые вы цитируете.

person Kenton Varda    schedule 26.11.2016

Переформулируя ответ Кентона с дополнительными инструкциями:

В Intellij нажмите «Внешние библиотеки» и найдите банку для protobuf.

введите здесь описание изображения

Проверьте версию протокола:

введите здесь описание изображения

Если они не совпадают (как показано выше), вы получите ошибки компиляции.

person Janac Meena    schedule 19.06.2019

Я видел аналогичную проблему с maven после изменения некоторого типа поля в моей прото-схеме, а затем сборки без предварительной очистки. Однако выполнение очистки и сборки исправляло это каждый раз.

person magician    schedule 20.01.2021