【问题标题】:IntelliJ IDEA doesn't see classes generated from protobuf files in a subprojectIntelliJ IDEA 看不到从子项目中的 protobuf 文件生成的类
【发布时间】:2021-03-20 23:45:55
【问题描述】:

我有一个带有模块的 Gradle 项目。 moduleA 仅包含 protobuf 文件并生成一个 jar 文件,其中包含从 .proto 文件生成的类。 moduleB 取决于 moduleA (implementation project(':moduleA'))。

moduleA
│   build.gradle
│   src
│   └───main
│       └───proto  <-- proto file defining gRPC services
moduleB
│   build.gradle
│   src            <-- code dependent on classes generated from moduleA
build.gradle

如果我从 Gradle 构建/运行项目,该项目运行良好。

问题: IntelliJ IDEA 在moduleB 的源代码中看不到从moduleA 生成的类(导入为红色)。

问题:如何让 IntelliJ IDEA 正确识别由.proto 文件构建的类?

我正在使用 IntelliJ IDEA 2020.2.4(终极版)。

【问题讨论】:

    标签: java gradle intellij-idea grpc proto


    【解决方案1】:

    对于从依赖模块解析类和导入的 IDE,这些类应该存在并且它们必须位于依赖模块的 source directory 中。看起来这些类生成到一个 IDE 无法识别为 source 目录的目录中。尝试将此生成的目录添加为 Gradle 源集。在 moduleA 的 Gradel 构建文件中添加:

    sourceSets {
        main {
            java {
                srcDirs = ['build/generated/source/proto/main/java']
            }
        }
    }
    

    其中'build/generated/source/proto/main/java' - 生成源的目录。

    IntelliJ IDEA 有一个相关问题:IDEA-209418

    【讨论】:

    • protobuf-gradle-plugin 正在向 IDEA 模型添加生成的代码:github.com/google/protobuf-gradle-plugin/blob/… 它应该可以开箱即用(我自己尝试过)。唯一的问题是生成的代码必须已经存在。
    • @voidzcy 我正在使用 Quarkus。它生成代码到不同的目录。也许这就是Idea没有选择它的原因。
    【解决方案2】:

    这与在同一个模块中使用 proto 生成的代码相同,它需要先存在,然后才能被 IDE 拾取。

    无法静态解决此类依赖关系。只有在moduleA构建之后,原型生成的类才可用。您需要至少构建一次 moduleA(并在必要时刷新 IDE 导入)以使其生成的代码可以访问到 moduleB

    【讨论】:

    • moduleA 会在每次构建 moduleB 时自动构建。但我也尝试手动构建moduleA - 没有帮助。
    • moduleA 生成源文件到哪个位置? IDE 是否将此目录检测为source directory type?可以分享一个示例项目吗?
    • - 每次构建 moduleB 时都会自动构建 moduleA。那不是重点。编译总能在构建时找到生成的代码。但是您希望在构建 moduleB 之前让 IDE 获取生成的代码。那么您必须在moduleA 可访问中生成代码。 - IDE 是否将此目录检测为源目录类型? protobuf-gradle-plugin 已与 IDEA 集成,生成代码的目录会自动标记为模块 srcDirs。
    • 确保在moduleA 中生成代码后刷新IDE 导入(在Intellij Gradle 工具栏上,单击重新导入所有Gradle 项目)。
    • @voidzcy 我将创建一个示例项目并与您分享。刷新项目,重建它,将构建目录标记为源目录,所有这些都没有帮助。我必须按照another answer 中的建议手动添加目录
    【解决方案3】:

    开箱即用的 Intellij 不知道从 .proto 文件生成的类的位置。 'com.google.protobuf' gradle 插件使用生成的代码为 Intellij 注册源目录,以查看何时在 moduleA 的 build.gradle 文件中应用 idea' gradle 插件。

    有关 protobuf gradle 插件文档,请参阅 IntelliJ IDEA tips for com.google.protobuf gradle plugin

    此设置适用于 Intellij IDEA 2021.1。

    简答:将idea gradle 插件应用到模块A。

    【讨论】:

      猜你喜欢
      • 2017-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-05
      • 2021-03-24
      • 1970-01-01
      相关资源
      最近更新 更多