如何使用gradle从依赖jar导入.proto文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用gradle从依赖jar导入.proto文件相关的知识,希望对你有一定的参考价值。

我有一个项目,创建一组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找到.proto来自jar文件的源代码?或者我需要将jar文件的.proto提取到我自己的/ proto目录中吗?这会导致冲突,因为jar已经有some-types.proto的编译版本,我不想再次编译它。

答案

您需要为使用StatusItem消息添加包名称foo_companyname,请尝试以下方式:

import "foo_companyname/some-types.proto";

message EnhancedStatus{
    string author = 1;
    repeated foo_companyname.StatusItem status = 2;
}
另一答案

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

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

另一答案

使用谷歌protobuf gradle插件

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

你应该只需要在依赖块中指定你的依赖jar(即,作为'protobuf'依赖,而不是'compile'):

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

以上是关于如何使用gradle从依赖jar导入.proto文件的主要内容,如果未能解决你的问题,请参考以下文章

gradle导入具有传递依赖性的本地jar

在 Android Gradle 构建中,如何从包含的 jar 文件中排除依赖项?

idea引用本地lib包(gradle)

从 Gradle 创建可执行 jar 文件并在 maven 中导入 jar

如何使用 spring boot 插件 2.0.x 从一个具有不同依赖项的 gradle 项目生成 2 个 jars

gradle使用本地jar包