【问题标题】:Why I am getting `Proto class is is already defined in file`?为什么我得到`Proto class is already defined in file`?
【发布时间】:2020-07-15 09:00:04
【问题描述】:

offline目录下的第一个proto文件(main.proto)

option java_package = "com.xxx.proto";
option java_outer_classname = "Service1";
option java_multiple_files = true;

message Response {
    repeated Entity entity = 1;
}

message Entity {}

这里我有第二个最近的原始文件(recent.proto)

option java_package = "com.xxx.proto";
option java_outer_classname = "Service2";
option java_multiple_files = true;

message Response {
    repeated Entity entity = 1;
    repeated Entity.Type type =2;
}
message Entity {}

我收到protoc: stdout: . stderr: offline/main.proto: "offline.Response.entitiy" is already defined in file "recent/recent.proto". 想提一下 Entity 对于这两种情况是不同的,类名是一样的

【问题讨论】:

  • 这不是很明显吗?它试图在同一个包下生成具有相同名称的类。参数不同并不重要。
  • 名字不一样,java_outer_classname不一样

标签: android protocol-buffers proto


【解决方案1】:

假设 protobuf 包是相同的(在当前情况下是相同的),那么消息具有相同的 protobuf 名称。所以这绝对是个问题。

maven 插件可能已将每个文件构建为对 protoc 的单独调用,这不会引起注意。 gradle 插件使用 protoc 的单次调用,它具有优势并且不是我期望更改的东西(但其他人可能会有不同的感觉)。

如果您生成的是两个独立的项目,那么它可能会很好。否则,protobuf 需要能够引用消息。这是按名称完成的。名称为 proto 包 + 消息名称,可能带有嵌套。

做你想做的事情的适当方法是使用嵌套消息(或简单地使用不同的名称):

message Request {
  message Foo {}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 2019-09-06
    • 2020-12-16
    • 2012-06-13
    • 2017-04-13
    相关资源
    最近更新 更多