Как скомпилировать прото-файлы google-fhir

Глядя на readme для google-fhir, он говорит, что нужно запустить bazel build, что работает, однако ни один из файлов протокола не был скомпилирован.

Запуск protoc --proto_path=. --java_out=. proto/stu3/resources.proto возвращает кучу ошибок о том, что другие протоколы не найдены. Это идет в обратном направлении до "descriptor.proto", который не является прототипом в папке. Ни один из файлов протокола в этом каталоге не будет вручную компилироваться в файлы java.

* С другой стороны, я смог взять другие примеры протоколов из других источников и успешно их скомпилировать.

ОБНОВЛЕНИЕ

Выполнение команды protoc --proto_path=proto/stu3/ --java_out=target proto/stu3/resources.proto из базового каталога google-fhir возвращает следующий результат:

~/fhir-master$ protoc --proto_path=proto/stu3/ --java_out=target proto/stu3/resources.proto
proto/stu3/annotations.proto: File not found.
proto/stu3/codes.proto: File not found.
proto/stu3/datatypes.proto: File not found.
resources.proto: Import "proto/stu3/annotations.proto" was not found or had errors.
resources.proto: Import "proto/stu3/codes.proto" was not found or had errors.
resources.proto: Import "proto/stu3/datatypes.proto" was not found or had errors.
resources.proto:84:5: "String" is not defined.
resources.proto:87:14: "Extension" is not defined.
resources.proto:90:14: "Extension" is not defined.
resources.proto:94:5: "Reference" is not defined.
resources.proto:97:5: "PositiveInt" is not defined.
...
...


Эти файлы определенно находятся в одном каталоге proto.

ОБНОВЛЕНИЕ 2

Что ж, прямо из коробки это определенно не работает. Перемещая файлы, я смог создать целевую папку с кучей файлов Java. Однако, пытаясь их скомпилировать, я получаю ошибки для несуществующих файлов:

  symbol:   class CodeableConcept
  location: package com.google.fhir.stu3.proto
./PlanDefinition.java:30950: error: cannot find symbol
  public com.google.fhir.stu3.proto.CodeableConceptOrBuilder getJurisdictionOrBuilder(
                               ^
  symbol:   class CodeableConceptOrBuilder
  location: package com.google.fhir.stu3.proto
./PlanDefinition.java:30956: error: cannot find symbol
  private java.util.List<com.google.fhir.stu3.proto.CodeableConcept> topic_;
                                               ^
  symbol:   class CodeableConcept
  location: package com.google.fhir.stu3.proto
./PlanDefinition.java:30964: error: cannot find symbol
  public java.util.List<com.google.fhir.stu3.proto.CodeableConcept> getTopicList() {
                                              ^
  symbol:   class CodeableConcept
  location: package com.google.fhir.stu3.proto
./PlanDefinition.java:30974: error: cannot find symbol
  public java.util.List<? extends com.google.fhir.stu3.proto.CodeableConceptOrBuilder> 

  ....                                                         ^
  100 errors.

! Кроме того, я не вижу здесь этот файл: https://github.com/google/protobuf/tree/master/java/core/src/main/java/com/google/protobuf


person user8897013    schedule 20.04.2018    source источник
comment
Вы должны использовать Bazel для компиляции протоколов. Что именно ты пытаешься сделать?   -  person SLaks    schedule 21.04.2018
comment
В первом предложении я упоминаю об успешном использовании bazel. Он создает следующие папки bazel-bin bazel-fhir-master bazel-genfiles bazel-out bazel-testlogs CONTRIBUTING.md examples java LICENSE proto README.md testdata WORKSPACE. Однако файлов буфера протокола .java нет.   -  person user8897013    schedule 24.04.2018
comment
Зачем вам нужны файлы .java? Вы должны использовать Bazel для компиляции вашего Java-кода, который использует protos.   -  person SLaks    schedule 24.04.2018
comment
Я не хочу ничего особенного, я просто хочу, чтобы это работало. Насколько я понимаю, для работы с protobuf в Java мне нужно сгенерировать файлы компоновщика.   -  person user8897013    schedule 25.04.2018


Ответы (2)


похоже, что ваша команда для компиляции плохо отформатирована: --proto_path = Это путь к вашему протоколу --java_out = Это папка, в которой будет скомпилирован ваш класс

Ваш аргумент: proto / stu3 / resources.proto, поэтому я пришел к выводу, что ваши файлы находятся в proto / stu3.

Не могли бы вы попробовать эту команду и сообщить нам, сработала ли она для вас:

protoc --proto_path=proto/stu3/ --java_out=target proto/stu3/resources.proto

Если ваш прототип-дескриптор завершен, у вас не должно быть ошибок компиляции, и ваш результат должен быть в папке "target".

РЕДАКТИРОВАТЬ: глядя на ваше последнее изменение, я бы сказал, что вам следует переместить resources.proto в свой базовый каталог и выполнить следующую команду: protoc --proto_path=. --java_out=target resources.proto

Поскольку путь к вашему импорту закодирован в вашем import. С этим немного сложно помочь, поскольку у нас нет доступа ко всему вашему прототипу дескриптора. Если вы взяли его из онлайн-репо, было бы полезно, если бы вы могли поделиться им.

person Luc    schedule 21.04.2018
comment
Я этим и занимался, только из каталога proto. Пробовал из базового каталога, см. Обновление выше. Спасибо. - person user8897013; 24.04.2018
comment
Вы сами писали прото-файлы? Вам необходимо удалить proto / stu3 / в пути импорта. Если все файлы находятся в одном каталоге. В противном случае вам нужно переместить корневой протокол (resources.proto) в корневой файл и использовать: protoc --proto_path =. --java_out =. resources.proto - person Luc; 24.04.2018
comment
Нет, я не писал это сам. Спасибо, ваше предложение очевидного сработало, и файлы Java были сгенерированы. Однако я получаю 100 ошибок компиляции для файлов, которых нет в папке. Смотрите обновление, и я могу создать новый вопрос и отметить ответ на него, если вы посмотрите на него. - person user8897013; 25.04.2018
comment
Конечно я посмотрю - person Luc; 25.04.2018

Я заставил его работать, вообще не указав реальный путь к --proto_path=.

Как мне это удалось

  • Моя структура папок выглядит так: D:\dev\OpenSourceProjects\ - это моя основная папка.
  • В этой папке у меня есть google-fhir, который является моим клоном репозитория github и protoc-3.11.3-win64, который является разархивируйте исполняемые файлы протоколов
  • Так, например, для сборки resources.proto выполните в cmd следующее:

cd D:\dev\OpenSourceProjects\google-fhir

D:\dev\OpenSourceProjects\protoc-3.11.3-win64\bin\protoc.exe --proto_path= --java_out=./proto/output .\proto\stu3\resources.proto

  • Обратите внимание, что --proto_path= есть, но пусто, а все остальные пути относительны
person NitrusCS    schedule 14.02.2020