Protobuf - java 包名称和跨项目共享原型文件

Protobuf - java package name and sharing proto file across projects

我有两个 java 项目生成和使用来自 Kafka 的消息, 一个项目生成 Ticker 类型的消息,另一个项目使用此消息。

所以我创建了这个文件

syntax = "proto3";

message Ticker {
    string symbol = 1;
    float ask = 2;
    float bid = 3;
}

我知道要为这种消息类型创建 Java 个对象,我使用 protoc

但是,我有两个问题。

  1. 我需要一种在整个项目中共享 proto 文件的方法(我现在拥有的 2 个项目以及任何未来需要访问 Ticker 的项目) .最好的方法是什么?我听说过 git 子树或子模块,这是 good/reliable 方式吗?

  2. 我需要一种方法让protoc在某个包下生成Java对象,例如,我有两个项目,一个是com.myorg.TickerProducer和另一个是 com.myorg.TickerConsumer 我需要 protoc 分别在 packages/namespaces com.myorg.TickerProducer.Entitiescom.myorg.TickerConsumer.Entities 中生成 Java 个对象。我知道我可以在 proto 文件中使用 option java_package,但是我有不同的项目使用相同的文件,每个项目都希望在它们的命名空间下生成 Java 对象。有办法吗?

谢谢。

单个 .proto 文件将始终在相同的 package/namespace 中生成代码,因此如果您想在两个项目中使用两种不同的布局,则需要两个 .proto 文件。不过,坦率地说,我认为 正确 将它放在相同的 package/namespace 中:它仍然 是同一件事 ,最终。

请注意,只要您不使用 "any" 功能,protobuf 就不太关心运行时的类型名/包/命名空间;所以 X.Y.Z 可以与 A.B.C 互换,只要它们实际上是相同的 形状 。只要您不使用 json.

,即使字段名称也无关紧要

处理这个问题的最明智的方法可能是为这些实体提供一个单独的包,供消费者和生产者使用。只要您不希望消费者依赖生产者,反之亦然。

如果您使用 Gradle,则有一个 protobuf-plugin 将 protobufs 的构建集成到消费者项目的代码中。


一般来说,protobuf 的使用方式之间存在轻微的阻抗不匹配,因为 Google 有一个存储库,其中每个构建单元/包在技术上都可以依赖于每个其他构建单元/包,以及它们在世界其他地方的使用方式,那里的项目有很多存储库,这些存储库充当构建单元和包之间可见性和依赖性的硬边界。

如果您可以将它们添加到一个包含其他通用定义等的包中,那将是最好的,但如果没有,一个单独的包,尽管它很丑陋,可能是您最安全的选择。