Проблемы с использованием 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/
Надеюсь это поможет