我有一个项目,它创建了一组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的编译版本了,我不想再次编译它。
答案 0 :(得分:1)
您需要添加包名称foo_companyname以使用StatusItem消息,请尝试以这种方式:
import "foo_companyname/some-types.proto";
message EnhancedStatus{
string author = 1;
repeated foo_companyname.StatusItem status = 2;
}
答案 1 :(得分:0)
Protobuf Plugin for Gradle支持依赖项中的protobuf文件:
如果编译配置依赖于包含proto文件的项目或库jar,它们将被添加到
--proto_path
命令行的protoc
标志中,以便可以将它们导入依赖项目的proto文件。导入的proto文件将不会被编译,因为它们已经在自己的项目中编译。
答案 2 :(得分:0)
Using the google protobuf gradle plugin
plugins {
id 'com.google.protobuf' version "0.8.5"
}
You should just need to specify your dependent jar in the dependencies block (i.e, as a 'protobuf' dependency, not 'compile'):
dependencies {
protobuf "com.companyname:project-abc:0.0.1"
}
答案 3 :(得分:0)
这是对我有用的解决方案:
buildscript {
dependencies {
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.3'
}
}
dependencies {
compile(group: 'com.companyname', name: 'project-abc', version: '0.0.1')
}
import "some-types.proto";
message EnhancedStatus {
string author = 1;
repeated foo_companyname.StatusItem status = 2;
}