维护内部 Maven 存储库的提示?

2022-09-01 12:56:41

我有兴趣为我的组织维护一个 Maven 2 存储库。有哪些指针和陷阱会有所帮助。

在设置从存储库下载代码或将自己的工件发布到存储库的标准时,用户应遵循哪些准则?对于这类事情,您有什么样的治理/规则?您在开发人员的指南/文档中包含了哪些有关它的内容?

更新:我们已经建立了Nexus,并对此非常满意 - 遵循了Sal的大部分准则,没有任何麻烦。此外,我们还通过 Hudson CI 服务器限制了快照工件的部署访问和自动构建/部署。Hudson 可以分析所有上游/下游项目依赖项,因此,如果编译问题、测试失败或其他一些违规行为导致构建中断,则不会发生部署。厌倦了在 Maven2/Maven3 中执行快照部署,因为两个版本之间的元数据已更改。“仅限哈德逊”快照部署策略将缓解此问题。我们不使用发布插件,但是在要移动快照以发布时,已经围绕版本插件编写了一些管道。我们还使用m2eclipse,它似乎与Nexus配合得很好,因为从设置文件中,它可以看到Nexus,并知道索引工件信息以便从那里进行查找。(尽管我不得不调整其中一些设置,使其完全索引我们的内部快照。如果您有兴趣这样做,我还建议您部署一个包含工件的源jar作为标准做法。我们在超级POM中配置它。

我遇到了这个Sonatype白皮书,其中详细介绍了采用/成熟度的不同阶段,每个阶段都有Maven存储库管理器的不同使用目标。


答案 1

我建议设置一个至少包含四个存储库的nexus服务器。我不建议使用伪像。nexus的免费版本对于少于三个组中少于20人的开发团队来说完全没问题。如果您拥有更多的用户,请帮自己一个忙,并为Sonatype版本付费。LDAP集成可以收回成本。

  1. 内部发布
  2. 内部快照
  3. 内部第三方,用于内部使用的来自外部来源的代码,或用于认可的第三方版本。把 JDBC 驱动程序、javax.* 这些东西以及来自客户和合作伙伴的东西放在这里。
  4. 外部代理所有常用源(如 m2、codehaus 等)的通用代理

配置 Nexus 以对内部存储库执行以下操作

  1. 定期删除旧快照
  2. 发布时删除快照
  3. 生成索引文件。这也加快了本地构建的速度

具有通用设置.xml文件,该文件仅使用这四个源,并且仅使用这四个源。如果您需要在此范围之外进行自定义,请尝试保留设置文件的公共部分,并使用配置文件来区分差异。不要让你的客户端只是滚动他们自己的设置,否则你最终会得到在一台计算机上构建的代码,而不是在任何其他计算机上构建的代码。

为客户端提供通用代理。在Nexus中,你可以向常见的Maven源(Apache,JBoss,Codehaus)添加一堆代理,并将单个代理公开给内部客户端。这使得在客户端添加和删除源变得更加容易。

不要在同一存储库中混合使用内部和第三方工件。Nexus允许您通过Web GUI将jars添加到内部存储库中。我建议将此作为将JDBC驱动程序和其他外部代码添加到第三方的方法。与大多数企业软件相比,UI使用起来相当不错。

定义一个通用的父 POM,该父 POM 通过 distributionManagement 标记定义内部快照和发布存储库。我知道很多人告诉你不要这样做。虽然我坦率地承认这样做存在各种问题,但如果客户端只构建要部署到单个内部存储库的版本和快照,那就可以了。

如果你有一个管理不善的现有 Maven 存储库,请创建一个名为 Legacy 的第 5 个存储库,并将整个存储库放在那里。设置 cron 任务,以便在旧文件一年后从旧文件中删除旧文件。这给了每个人一年的时间来摆脱它并更新他们的pom。

为内部工件建立易于遵守的命名约定。我更喜欢Partent.Function.Project的GroupID和该组件Name的ArtifactId。对于内部存储库,com/org/net 和公司名称可能无关紧要。如果公司改名,那就错了。销售、会计或库存部门重命名的可能性要小得多。


答案 2

一定要使用Nexus。:P

我同时使用了Nexus和Artifatory。Nexus的界面更加健壮,它更具可配置性,当然,由Sonatype编写,他几乎憎恨Maven的一切。

话虽如此,Artifactory是体面和可行的。


推荐