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

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

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

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

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

所有需要发生的事情都是将.proto文件包含在依赖项的包中,我通过将其作为资源来实现:

项目/ A / src目录/主/资源/ a.proto

现在在projects / b / pom.xml中,添加’a’作为常规Maven依赖项,只需从b.proto导入a.proto,就好像它存在于本地:

b.proto:import“a.proto”;

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

您可以将.proto文件打包在生成它们的项目中的单独.jar / .zip中,并使用专用分类器将它们发布到您的存储库中。 使用程序集插件可能有助于发布在发布期间构建的“源jar”附近的内容。

然后,在使用它们的项目上,将先前创建的工件添加为依赖项。 将依赖插件与“unpack-dependencies”目标一起使用,并将其绑定到“compile”之前的阶段。