Невозможно импортировать прото-файл из java-файла Intellij id

Я пытаюсь импортировать прото-файл из java-файла в IntelliJ IDEA.

У меня есть файл A.proto и файл B.java. Я пытаюсь импортировать класс Info из файла A.proto в файл B.java следующим образом:

import A.Info;

Однако IntelliJ IDEA не поддерживает прото-файлы и говорит, что моего класса не существует. Я установил оба плагина Protobuf Support и Protocol Buffer Editor. Но все равно не работает. Любая идея?


person Paul Bénéteau    schedule 17.04.2020    source источник


Ответы (3)


Проблема

IntelliJ распознает файлы буферов протокола, но они не являются Java, поэтому компилятор Java не знает, что с ними делать.

Решение с Maven

Вы можете скомпилировать эти буферы протокола в файлы Java, и это шаг, который вам сейчас не хватает. Наилучший из известных мне способов - использовать для этого плагин Maven.

 <plugin>
            <groupId>com.github.os72</groupId>
            <artifactId>protoc-jar-maven-plugin</artifactId>
            <version>3.11.4</version>
            <executions>
                <execution>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>run</goal>
                    </goals>
                    <configuration>
                        <protocVersion>3.0.0</protocVersion> <!-- 2.4.1, 2.5.0, 2.6.1, 3.0.0 -->
                        <includeDirectories>
                            <include>src/main/resources/protobuf</include>
                        </includeDirectories>
                        <inputDirectories>
                            <include>src/main/resources/protobuf/</include>
                        </inputDirectories>
                    </configuration>
                </execution>
            </executions>
        </plugin>

И зависимость для классов буфера протокола:

<dependency>
  <groupId>com.google.protobuf</groupId>
  <artifactId>protobuf-java</artifactId>
  <version>3.11.4</version>
</dependency>

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

После создания классов Java вы можете использовать их в остальной части вашего кода. Вы даже можете просматривать сгенерированные классы Java в папке target / generated-sources в своем проекте Maven.

Вот как выглядит сопоставление буферов протокола и Java:

DistanceWalked.proto

package example;

message DistanceWalked {
    string userId = 1;
    double distance = 2;
}

DistanceWalkedOuterClass.DistanceWalked.java (сгенерировано)

package example;

public class DistanceWalked {
 //properties This class isn't pretty...
}

(Полный пример кода с буферами протокола и плагином Maven можно найти здесь: https://github.com/TomCools/protocol-buffers-example)

Ссылка на источник плагина: https://github.com/os72/protoc-jar-maven-plugin

Решение без Maven

Без Maven вам необходимо загрузить компилятор командной строки. Документацию по этому поводу можно найти здесь: https://developers.google.com/protocol-buffers/docs/javatutorial#compiling-your-protocol-buffers.

person Tom Cools    schedule 17.04.2020
comment
У меня есть проект Maven, и я уже пробовал этот плагин, но он все еще не работает ... - person Paul Bénéteau; 18.04.2020
comment
У вас где-то есть проект в Git? Я мог бы быстро взглянуть. Я связал свой личный проект с моим решением выше. Может быть, вы можете быстро проверить это и посмотреть, работает ли он для вас? - person Tom Cools; 18.04.2020
comment
Имя пакета для буферов моего протокола. Название пришло из хобби-проекта, в котором я пытался имитировать Pokemon Go с буферами протокола. Помимо названия пакета это не имеет значения. Я добавил модульные тесты, чтобы показать, как работают буферы протокола. Вы должны это проверить. - person Tom Cools; 18.04.2020
comment
Мои прототипы буферов находятся в каталоге main / src / ressources / protobuf, как мне импортировать их из /main/src/java/example/A.java? - person Paul Bénéteau; 18.04.2020
comment
Сначала запустите mvn clean package. Плагин создаст для вас классы Java, причем пакет буфера протокола является пакетом Java, а имя сообщения - именем класса. - person Tom Cools; 18.04.2020
comment
Он должен сгенерировать классы где-нибудь в папке target / generated-sources. - person Tom Cools; 18.04.2020
comment
У меня есть только папка target / annotations. - person Paul Bénéteau; 18.04.2020
comment
Я думаю, единственное, что он делает, это копирует мой прото-файл в target / clasees / protobuf / ... - person Paul Bénéteau; 18.04.2020
comment
Давайте продолжим это обсуждение в чате. - person Tom Cools; 18.04.2020

Файл proto - это просто описание формата сообщения. Он не содержит кода, который можно интерпретировать непосредственно в контексте Java. Идея прототипа файла состоит в том, чтобы предоставить общую, не зависящую от языка спецификацию формата сообщения.

На основе прото-файла вы можете сгенерировать соответствующий java-код. Затем этот код можно использовать и импортировать в ваш Java-проект.

Посмотрите, как сгенерировать код из прото-файла: https://developers.google.com/protocol-buffers/docs/javatutorial#compiling-your-protocol-buffers

person Pieterjan Deconinck    schedule 17.04.2020

На случай, если кто-то все еще застрял -

Я обнаружил, что указание пути к Intellij устраняет проблему:

Настройки -> Языки и платформы -> Буфер протокола -> Снимите флажок «Настроить автоматически»

А затем добавьте путь к файлу.

Должно быть хорошо на xolstice или os72!

person pixelsoccupied    schedule 04.06.2020