15

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

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

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

4

2 回答 2

6

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

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

项目/a/src/main/resources/a.proto

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

b.proto:导入“a.proto”;

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

于 2012-10-31T22:37:38.070 回答
2

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

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

于 2012-10-31T21:04:17.750 回答