在 Maven 项目之间导入协议缓冲区定义

2022-09-03 07:46:34

我目前管理着几个单独的Maven项目,在这些项目中,我使用Protobufs作为序列化格式并通过网络。我正在使用David Trott的maven-protoc插件在编译时生成代码。

一切都很好,直到我希望这些项目彼此之间进行通信 - 或者更确切地说,使用彼此的原型。protobuf语言有一个“import”指令,它可以做我想要的,但我面临着让项目A导出一个“.proto”文件(或者可能是一些中间格式?)供项目B依赖的挑战。

Maven为项目提供了一种捆绑资源但AFAIK的方法,这些资源应该在运行时由代码使用,而不是在编译/源代码生成阶段的目标 - 至少我无法找到描述我想要实现的文档。


答案 1

我找到了另一种实现方式,它不涉及任何Maven魔法。深入研究maven-protoc插件的代码,我发现这是一个受支持的用例 - 该插件将在依赖jar中查找并收集和.proto文件,并将它们解压缩到临时目录中。然后,该目录被设置为原型调用的导入路径。

所有需要做的就是将.proto文件包含在依赖项的包中,我通过使其成为资源来做到这一点:

projects/a/src/main/resources/a.proto

现在,在 projects/b/pom.xml 中,添加 'a' 作为常规的 Maven 依赖项,然后从 b.proto 导入 a.proto,就好像它存在于本地一样:

b.proto: import “a.proto”;

这并不理想,因为文件名可能会在各种项目之间发生冲突,但这种情况应该很少发生。


答案 2

您可以将 .proto 文件打包到生成 .proto 文件的项目中的单独.jar/.zip中,并使用专用的分类器将它们发布到存储库中。使用汇编插件可能有助于在这里发布类似于在发布期间构建的“源jar”的东西。

然后,在使用它们的项目中,添加以前创建的项目作为依赖项。使用具有“解包依赖关系”目标的依赖插件,并将其绑定到“编译”之前的某个阶段。


推荐