Буферы протокола Недопустимая проблема встроенного дескриптора - PullRequest
2 голосов
/ 24 июня 2010

У меня возникают проблемы во время выполнения с некоторыми из моих сгенерированных классов буферов протокола.

Мой макет проекта выглядит следующим образом:

module/
  protobuf-api/
    proto/
      com/foo/api/Service.proto
      com/foo/shared/Shared.proto
      org/bar/api/Message1.proto
      org/bar/api/Message2.proto

Файл Service.proto зависит от общего ресурса.proto и некоторые файлы Message * .proto.Из каталога protobuf-api я запускаю следующую команду для компиляции:
find . -name *.proto -exec protoc --java_out=java -I=proto {} \;

При попытке запустить мою службу я получаю следующее исключение:

java.lang.ExceptionInInitializerError
    at com.linkedin.history.api.protobuf.HistoryServiceProtos$HistoryServiceQuery.(HistoryServiceProtos.java:544)
    at com.linkedin.history.api.serializer.HistoryServiceSerializer.serialize(HistoryServiceSerializer.java:47)
     at test.history.serializer.TestSerializer.testHistoryServiceQuery(TestSerializer.java:38)
    at test.fwk.util.core.BaseTestSuiteCore.run(BaseTestSuiteCore.java:304)
     at test.fwk.util.core.BaseTestSuiteConf.run(BaseTestSuiteConf.java:186)
    at test.fwk.lispring.BaseTestSuite.run(BaseTestSuite.java:232)
    at test.fwk.lispring.BaseTestSuite.callAppropriateRun(BaseTestSuite.java:265)
    at test.fwk.util.core.BaseTestSuiteCore.run(BaseTestSuiteCore.java:199)
Caused by: java.lang.IllegalArgumentException: Invalid embedded descriptor for "com/linkedin/history/api/protobuf/HistoryService.proto".
     at com.google.protobuf.Descriptors$FileDescriptor.internalBuildGeneratedFileFrom(Descriptors.java:268)
     at com.linkedin.history.api.protobuf.HistoryServiceProtos.(HistoryServiceProtos.java:1794)
Caused by: com.google.protobuf.Descriptors$DescriptorValidationException: com/linkedin/history/api/protobuf/HistoryService.proto: Dependencies passed to FileDescriptor.buildFrom() don't match those listed in the FileDescriptorProto.
     at com.google.protobuf.Descriptors$FileDescriptor.buildFrom(Descriptors.java:221)
     at com.google.protobuf.Descriptors$FileDescriptor.internalBuildGeneratedFileFrom(Descriptors.java:266)

Я прочитал пост здесь , но я думаю, что все делаю правильно.Любые предложения о том, почему у меня возникают ошибки инициализатора?Я компилирую все с тем же флагом -I.

Ответы [ 2 ]

5 голосов
/ 24 июня 2010

Я подозреваю , что проблема в том, что когда вы находите файл прото, вы указали ему полный путь, например proto / com / foo / api / Service.proto, но когда он обращается к нему через каталог include, он использует com / foo / api / Service.proto

Простое исправление - запустите его из каталога proto:

find . -name *.proto -exec protoc --java_out=../java -I=. {} \;

Я должен признать, что не могу вспомнить многие детали protoc (что мне действительно следует), но я подозреваю, что это сработает.

Другая альтернатива, которая может работать:

protoc --java_out=java `find . -name '*.proto'`

т.е. передать все файлы proto в один вызов protoc.

1 голос
/ 31 марта 2016

У меня был тот же тип ошибки в C #, и здесь была моя проблема: я вызвал protoc на этапе предварительной сборки в моем проекте.Там я использовал встроенные макросы Visual Studio, такие как $(SolutionDir) и $(ProjectDir), чтобы получить необходимые пути.Поскольку я ссылался на *.proto файлы из других проектов, я использовал две опции --proto_path: одну для корневого пути (для разрешения import путей) и одну для самого файла.Мой файл решения находился в подкаталоге корневого каталога, поэтому я использовал относительный путь .., чтобы добраться до корня.Прото-файлы всегда находятся в подкаталоге gen конкретного проекта.В общем, команда была такой:

protoc.exe --proto_path=$(SolutionDir).. --proto_path=$(ProjectDir)gen  $(ProjectDir)gen\DemoFile.proto

Она скомпилировалась нормально, но я получил System.TypeInitializationException во время выполнения при вызове метода CreateBuilder().Проблема заключалась в том, что оба пути $(SolutionDir).. и $(ProjectDir) (хотя они фактически указывают на один и тот же каталог) имели различное текстовое представление из-за относительного компонента пути ...Я решил проблему, последовательно используя один и тот же путь:

protoc.exe --proto_path=$(SolutionDir).. $(SolutionDir)..\My\Demo\Project\Directory\gen\DemoFile.proto

Мне потребовалось почти 3 дня, чтобы сузить и распознать проблему, поэтому я поделюсь своим решением здесь в надежде, что это сэкономит времядля кого-то.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...