3

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

所以我创建了这个文件

syntax = "proto3";

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

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

但是,我有两个问题。

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

  2. 我需要一种protoc在某个包下生成 Java 对象的方法,例如,我有两个项目,一个是com.myorg.TickerProducer另一个是com.myorg.TickerConsumer我需要分别在包/命名空间中protoc生成 Java 对象。我知道我可以在文件中使用,但是我有不同的项目使用相同的文件,并且每个项目都希望在它们的命名空间下生成 Java 对象。有没有办法做到这一点?com.myorg.TickerProducer.Entitiescom.myorg.TickerConsumer.Entitiesoption java_packageproto

谢谢你。

4

2 回答 2

3

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

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


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

如果您可以将它们添加到包含其他常见定义等的包中,那将是最好的,但如果缺少这些,那么单独的包,尽管它很丑,可能是您最安全的选择。

于 2018-02-15T12:40:04.603 回答
2

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

请注意,只要您不使用“任何”功能,protobuf 在运行时并不关心类型名/包/命名空间;所以 anX.Y.Z可以与 an 互换,A.B.C只要它们实际上是相同的基本形状。只要您不使用 json,即使是字段名也无关紧要。

于 2018-02-15T12:24:36.530 回答