【问题标题】:proto3: Why setting java_multiple_files = true not creating separate java classes for each proto message?proto3:为什么设置 java_multiple_files = true 不为每个 proto 消息创建单独的 java 类?
【发布时间】:2022-06-11 15:43:36
【问题描述】:

我有一个带有嵌套类的原型定义

syntax = "proto3";

option java_package = "com.spot.proto.v1.config";

package v1config;

// ClusterConfig proto is used to maintain the params required by all the services at a central place.
message ClusterConfig {
  enum LogLevel {
    UNKNOWN_TYPE = 0;
    DEBUG = 1;
    INFO = 2;
    WARN = 3;
    ERROR = 4;
    FATAL = 5;
  }

  message Network {
    string ip = 1;
    int32 port = 2;
  }

  message Constants {
    message SlackNotifier {
      message Channel {
        string name = 1;
      }
      string auth_token = 1;
      map<string, Channel> channels = 2;
      bool is_enabled = 3;
    }

    message Kafka {
      string broker_list = 1;
    }

    Kafka kafka = 2;
   }
   message Support {
      Network network = 1;
   }
   Support support = 1;
    ...  
  }

当我使用option java_multiple_files = false; 生成Java 类时,它会创建一个Java 类ClusterConfigOuterClass.java,其中包含为嵌套在其中的顶级消息、服务和枚举生成的所有Java 类/枚举/等。这是意料之中的。

但是如果我使用option java_multiple_files = true;,那么我看到它会生成两个额外的类ClusterConfig.javaClusterConfigOrBuilder.java 以及ClusterConfigOuterClass.javaClusteConfig.java 现在包含嵌套类。

文档状态如下:-

java_multiple_files(文件选项):如果为 false,则只有一个 .java 文件 将为这个 .proto 文件生成,所有的 Java 类/枚举/等。为顶级消息、服务和 枚举将嵌套在外部类中(参见 java_outer_classname)。如果为 true,将生成单独的 .java 文件 对于每个 Java 类/枚举/等。为顶层生成 消息、服务和枚举,以及包装 Java 类 为此 .proto 文件生成的文件不会包含任何嵌套 类/枚举/等。这是一个布尔选项,默认为 false。 如果不生成 Java 代码,则此选项无效。

那么每个嵌套消息(如KafkaNetwork 等)不应该进入一个单独的 java 文件吗?

  • Java 11
  • 协议 - 3.10

【问题讨论】:

    标签: java protocol-buffers java-11 proto protoc


    【解决方案1】:

    只有嵌套类,java_multiple_files 不会做任何事情,这是故意的。您明确地为KafkaNetwork 等提供上下文...它们仅在其父对象中相关。

    现在,如果您真的想生成多个文件,您必须执行以下操作:

    enum LogLevel {
      UNKNOWN_TYPE = 0;
      DEBUG = 1;
      INFO = 2;
      WARN = 3;
      ERROR = 4;
      FATAL = 5;
    }
    
    message Channel {
      string name = 1;
    }
    
    message SlackNotifier {
      string auth_token = 1;
      map<string, Channel> channels = 2;
      bool is_enabled = 3;
    }
    
    message Kafka {
      string broker_list = 1;
    }
    
    message Constants {
      Kafka kafka = 2;
    }
    
    message Network {
      string ip = 1;
      int32 port = 2;
    }
    
    message Support {
      Network network = 1;
    }
    
    message ClusterConfig {
      Support support = 1;
      //...
    }
    

    然后,更进一步,如果你想给他们一个应该在其中使用这些对象的上下文(可能是因为你有团队,并且你不希望其他开发人员滥用这些对象),你可以将它们放入像这样的包:

    package mycompany.service.cluster
    

    然后以使用您的 Kafka 对象为例,他们需要提供完全限定的类型(除非它们在同一个包中):

    mycompany.service.cluster.Kafka
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-17
      • 1970-01-01
      • 1970-01-01
      • 2012-12-10
      • 1970-01-01
      • 2013-02-20
      • 2018-05-29
      • 2014-11-05
      相关资源
      最近更新 更多