Проблемы с использованием protobufs с Java и Scala

У меня есть файл xxx.proto, Я скачал компилятор protobuf и установил его. Тогда я выпустил эту команду

protoc --java_out=./ xxx.proto

и это породило мой ххх.java

Теперь я хочу скомпилировать этот файл в файл класса, который я могу использовать с Scala.

javac xxx.java

Что дает мне эту ошибку

xxx.java:7: package com.google.protobuf does not exist
      com.google.protobuf.ExtensionRegistry registry) {
                         ^
xxx.java:12450: package com.google.protobuf.Descriptors does not exist
  private static com.google.protobuf.Descriptors.Descriptor
                                                ^
xxx.java:12453: package com.google.protobuf.GeneratedMessage does not exist
    com.google.protobuf.GeneratedMessage.FieldAccessorTable

...
...
...

100 errors

Теперь я догадался, у него нет пакета.

Поэтому я скопировал файлы классов пакета com.google.protobuf в ту же папку, где существует xxx.java. Примечание. Я не скомпилировал этот пакет. Я скачал флягу от другого расширения, у которого были файлы фляги. Так что я их извлек. Теперь мой текущий путь, где находится xxx.java, имеет com/google/protobuf/ *.class библиотеки protobuf.

Я снова дал команду javac.

На этот раз я получил другой набор ошибок -

    xxx.java:10: cannot find symbol
    symbol  : class MessageOrBuilder
    location: package com.google.protobuf
          extends com.google.protobuf.MessageOrBuilder {
                                     ^
    xxx.java:215: cannot find symbol
    symbol  : class MessageOrBuilder
    location: package com.google.protobuf
            extends com.google.protobuf.MessageOrBuilder {
                                       ^
    xxx.java:608: cannot find symbol
    symbol  : class MessageOrBuilder
    location: package com.google.protobuf
            extends com.google.protobuf.MessageOrBuilder {
                                       ^
    xxx.java:1017: cannot find symbol
    symbol  : class MessageOrBuilder
    location: package com.google.protobuf
            extends com.google.protobuf.MessageOrBuilder {

..... 100 errors

Я даже пытался скомпилировать исходные файлы, которые шли с google protobufs. Сгенерированные Java-классы дают те же ошибки.

Есть идеи что делать??

Ответ

Хорошо. Спасибо всем.

Основная проблема заключается в том, что пакет компиляторов протоколов буфера от Google по умолчанию не создает библиотеку Java. Я предполагал, что это делает и устанавливает это. Это действительно так, если вы работаете с Maven. Но у меня не было Maven

Поэтому я скомпилировал код в /java/src и использовал банку. ^

5 ответов

При компиляции у вас должен быть protobuf lib на вашем пути к классам. Все эти недостающие пакеты и классы взяты из protobuf lib.

Найти протубаф банку и использовать

javac -cp path/to/protobuf.jar xxx.java

Вы новичок в Java, верно?

Чего не хватает, так это файла библиотеки java (расширение.jar) для protobuf. Он должен быть в "classpath" для компилятора java и среды выполнения java. protoc генерирует ваши классы, но это зависит от библиотеки protobuf.

javac xxx.java -cp PATH_TO_PROTOBUF/protobuf-java-2.3.0.jar

Во время выполнения

java mypackage.MyMain -cp PATH_TO_PROTOBUF/protobuf-java-2.3.0.jar

Вам может понадобиться использовать версию 2.4.1 (или, по крайней мере, 2.4+) комплекта protobuf, в том числе убедиться, что вы обновили protoc (компилятор protobuf) и перекомпилировали свое определение proto с использованием нового protoc. (Другими словами, все должно быть одной версии:

  • файл protobuf-vn.nnjar;
  • проток компилятор; а также
  • вывод компиляции ваших.proto файлов с помощью protoc.

После того, как я все синхронизировал, я начал продвигаться к проекту Clojure, на который я смотрю. Возможно, вы столкнулись с той же проблемой перекоса версии.

protoc -I=$SRC_DIR --java_out=$DST_DIR $SRC_DIR/addressbook.proto

Вы можете скачать protoc.exe (новый выпуск) из >>.

https://code.google.com/p/protobuf/downloads/detail?name=protoc-2.5.0-win32.zip&can=2&q=

в вашем *.proto файле вы правильно настроили

option java_package = "com.example.package";
option java_outer_classname = "class name";

Можно установить JAR-файл protobuf, используя Ubuntu

apt-get install libprotobuf-java

Это скопирует protobuf-java-2.4.1.jar в /usr/share/java/

Надеюсь это поможет

Другие вопросы по тегам