【问题标题】:Can't import proto file from java file Intellij id无法从 java 文件 Intellij id 导入 proto 文件
【发布时间】:2020-07-31 12:34:19
【问题描述】:

我正在尝试从 IntelliJ IDEA 中的 java 文件导入 proto 文件。

我有一个名为 A.proto 的文件和一个名为 B.java 的文件。我尝试从 B.java 文件中的 A.proto 文件中导入一个类 Info,如下所示:

import A.Info;

但是,IntelliJ IDEA 并不支持 proto 文件,并表示我的类不存在。我安装了两个插件Protobuf SupportProtocol Buffer Editor。但它仍然不起作用。任何想法?

【问题讨论】:

    标签: java intellij-idea protocol-buffers proto


    【解决方案1】:

    proto 文件只是消息格式的描述。它不包含可以在 java 上下文中直接解释的代码。 proto 文件的想法是提供一个通用的、与语言无关的消息格式规范。

    根据proto文件,可以生成对应的java代码。然后可以在您的 java 项目中使用和导入此代码。

    在这里查看如何从 proto 文件生成代码:https://developers.google.com/protocol-buffers/docs/javatutorial#compiling-your-protocol-buffers

    【讨论】:

      【解决方案2】:

      问题

      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>
      

      Protocol Buffer 类的依赖关系:

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

      使用此插件,Intellij 将在最初创建源代码后找到创建的 Java 类。 这样,只有您的协议缓冲区文件需要在源代码管理中。您让插件负责编译为 Java。

      创建 Java 类后,您可以在其余代码中使用它们。 您甚至可以在 Maven 项目的 target/generated-sources 文件夹中查看生成的 Java 类。

      Protocol Buffers 和 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

      【讨论】:

      • 我有一个 Maven 项目,我已经尝试过这个插件,但它仍然不起作用......
      • 你在 Git 的某个地方有这个项目吗?我可以快速浏览一下。我在上面的解决方案中链接了我的个人项目。也许您可以快速检查一下,看看它是否适合您?
      • 我的协议缓冲区的包名。名称来自一个爱好项目,我试图用协议缓冲区模拟 Pokemon Go。除了包名之外,它是无关紧要的。我添加了单元测试来展示协议缓冲区是如何工作的。你应该检查一下。
      • 我的 proto 缓冲区位于 main/src/ressources/protobuf 目录中,如何从 /main/src/java/example/A.java 导入它们?
      • 首先运行 mvn clean package。该插件将为您创建 Java 类,Protocol Buffer 包为 Java 包,消息的名称为类名。
      【解决方案3】:

      以防有人仍然卡住 -

      我发现指定 Intellij 的路径可以解决问题:

      首选项 -> 语言和框架 -> 协议缓冲区 -> 取消选中“自动配置”

      然后添加文件的路径。

      它应该对 xolstice 或 os72 有好处!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-16
        • 1970-01-01
        相关资源
        最近更新 更多