【问题标题】:How do I Import a .proto file from a dependency jar using gradle如何使用 gradle 从依赖项 jar 导入 .proto 文件
【发布时间】:2018-07-19 09:33:27
【问题描述】:

我有一个创建一组 protobuf 对象和 GRPC 存根的项目。

我依赖于一个包含其他 .proto 文件的 jar,我想在我的项目中使用它。

即:

project-abc-0.0.1.jar 包含一个文件:/some-types.proto 它包含以下部分:

package foo_companyname;
message StatusItem {
    string status = 1;
    string statusDescription = 2;
}

我的项目有一个 build.gradle 文件,我试图将其导入其中:

buildscript {
    dependencies {
        classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.3'
    }
}

dependencies {
    compile(group: 'com.companyname', name: 'project-abc', version: '0.0.1')
}

然后,在我的新“enhanced-status.proto”中,我正在这样做:

import "foo_companyname/some-types.proto";

message EnhancedStatus{
    string author = 1;
    repeated StatusItem status = 2;
}

如果我不引用其他 .proto,一切正常 - 我能够生成所有正确的 java 任何 python 类。只要我添加它,我就会得到这个:

Execution failed for task ':generateProto'.
> protoc: stdout: . stderr: foo_companyname/some-types.proto: File not found.
  enhanced-status.proto: Import "foo_companyname/some-types.proto" was not found or had errors.
  enhanced-status.proto:26:19: "StatusItem" is not defined.

我假设有一些技巧可以让 gradle 或 protoc 找到 jar 文件中的 .proto 源?还是我需要将 jar 文件的 .proto 提取到我自己的 /proto 目录中?这会导致冲突,因为 jar 已经有 some-types.proto 的编译版本,我不想再次编译它。

【问题讨论】:

  • 我用一堆 gradle hacks 解决了这个问题:我用一个任务将 .protos 提取到 /src 树中,然后在 jar 任务发生之前用另一个任务删除它们和 .class 文件。呃。

标签: gradle protocol-buffers


【解决方案1】:

使用 google protobuf gradle 插件

plugins {
   id 'com.google.protobuf' version "0.8.5"
}

您应该只需要在依赖项块中指定您的依赖 jar(即,作为“protobuf”依赖项,而不是“编译”):

dependencies {           
    protobuf "com.companyname:project-abc:0.0.1"
}

【讨论】:

  • 我已经用一堆 gradle hacks 解决了这个问题,但我最近有时间重新审视它,而且效果很好。
【解决方案2】:

Protobuf Plugin for Gradle 在依赖项中支持 protobuf 文件:

如果编译配置依赖于包含 proto 文件的项目或库 jar,它们将被添加到 protoc 命令行的 --proto_path 标志中,以便可以在 proto 文件中导入它们依赖项目。导入的 proto 文件不会被编译,因为它们已经在自己的项目中编译过。

【讨论】:

  • 我已经在使用它了:classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.3'
  • 在这种情况下,也许你的路径是错误的。导入的.proto 文件位于.jar 文件中的什么位置?
  • 它在 jar 文件的根目录下。我也试过: import "some-types.proto";并没有什么区别。
  • @Kylar 我面临同样的问题。我无法从依赖项中导入 .proto 文件。你是怎么解决的?
【解决方案3】:

使用StatusItem消息需要加上包名foo_companyname,这样试试:

import "foo_companyname/some-types.proto";

message EnhancedStatus{
    string author = 1;
    repeated foo_companyname.StatusItem status = 2;
}

【讨论】:

    【解决方案4】:

    这是对我有用的解决方案:

    1. 将 JAR 添加为依赖项(正如您所做的那样)
    buildscript {
        dependencies {
            classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.3'
        }
    }
    
    dependencies {
        compile(group: 'com.companyname', name: 'project-abc', version: '0.0.1')
    }
    
    1. 直接导入 proto 文件没有包名(见@Lukas 提到的)
    import "some-types.proto";
    
    1. 使用包名引用导入的 proto 文件中的模型
    message EnhancedStatus {
        string author = 1;
        repeated foo_companyname.StatusItem status = 2;
    }
    

    【讨论】:

      【解决方案5】:

      我遇到了同样的情况,这里没有人回答对我有用。 这些行动对我有帮助:

      1. 添加包含(“build/extracted-include-protos/main/data/*.proto”)
      dependencies {
          implementation("com.google.protobuf:protobuf-java:3.8.0")
          implementation("org.jetbrains.kotlin:kotlin-reflect")
          implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
          implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2")
          implementation("io.grpc:grpc-kotlin-stub:1.1.0")
          implementation("io.grpc:grpc-protobuf:1.38.0")
          implementation("my-external-lib-with-compiled-proto-jar") //!!!!
      }
      
      protobuf {
          protoc {
              artifact = "com.google.protobuf:protoc:3.17.2"
          }
          plugins {
              id("grpc") {
                  artifact = "io.grpc:protoc-gen-grpc-java:1.38.0"
              }
              id("grpckt") {
                  artifact = "io.grpc:protoc-gen-grpc-kotlin:1.1.0:jdk7@jar"
              }
              generateProtoTasks {
                  all().forEach {
                      it.plugins {
                          id("grpc")
                          id("grpckt")
                      }
                  }
              }
          }
      }
      
      sourceSets {
          main {
              proto {
                  srcDirs("src/main/proto")
                  include("build/extracted-include-protos/main/data/*.proto")//!!!
              }
              java {
                  java.srcDir("build/generated/source/proto/main/java")
                  java.srcDir("build/generated/source/proto/main/grpc")
                  java.srcDir("build/generated/source/proto/main/grpckt")
              }
            }
         }
      
      1. 要使当前 proto 中的外部 proto 变为绿色,我们可以在 Idea settings Languages/Protobuf/.. 路径中添加到 YOUR_PATH/lib/build/extracted-include-protos/main,fox 示例: enter image description here

      【讨论】:

        猜你喜欢
        • 2020-02-05
        • 2020-08-27
        • 1970-01-01
        • 2022-08-02
        • 1970-01-01
        • 2016-01-28
        • 1970-01-01
        • 1970-01-01
        • 2022-08-14
        相关资源
        最近更新 更多