维护内部 Maven 存储库的技巧?
Posted
技术标签:
【中文标题】维护内部 Maven 存储库的技巧?【英文标题】:Tips for maintaining an internal Maven Repository? 【发布时间】:2010-11-05 13:52:34 【问题描述】:我有兴趣为我的组织维护一个 Maven2 存储库。有哪些有用的提示和陷阱。
在发布代码时,用户在设置从存储库下载或发布自己的工件到存储库的标准时应遵循哪些准则?你对这类事情有什么样的治理/规则?您在开发者指南/文档中包含了哪些相关内容?
更新:我们已经建立了 Nexus,并且对此非常满意 - 遵循了 Sal 的大部分指导方针,没有遇到任何问题。此外,我们通过 Hudson CI 服务器限制了部署访问和自动构建/部署快照工件。 Hudson 可以分析所有上游/下游项目的依赖关系,因此如果编译问题、测试失败或其他一些违规行为导致构建中断,则不会发生部署。不要在 Maven2/Maven3 中进行快照部署,因为元数据在两个版本之间发生了变化。 “仅 Hudson”快照部署策略将缓解这种情况。我们不使用发布插件,但在将快照移动到发布时围绕Versions plugin 编写了一些管道。我们还使用 m2eclipse,它似乎与 Nexus 配合得很好,因为从设置文件中它可以看到 Nexus 并且知道从那里索引工件信息以进行查找。 (尽管我不得不调整其中一些设置以使其完全索引我们的内部快照。)如果您有兴趣这样做,我还建议您将带有工件的源 jar 部署为标准做法。我们在超级 POM 中进行配置。
UPDATE2:我遇到过this Sonatype whitepaper,它详细说明了采用/成熟度的不同阶段,每个阶段对于 Maven 存储库管理器都有不同的使用目标。
【问题讨论】:
【参考方案1】:我建议设置一个至少包含四个存储库的 nexus 服务器。我不会推荐神器。免费版的 nexus 非常适合不到 20 人、不到三个小组的开发团队。如果您有更多的用户,请帮自己一个忙并为 Sonatype 版本付费。 LDAP 集成是物有所值的。
-
内部发布
内部快照
内部第 3 方,用于内部使用的来自外部来源的代码,或用于经过认可的第 3 方版本。将 JDBC 驱动程序、javax.* 内容以及来自客户和合作伙伴的内容放在这里。
外部代理所有常用来源(如 m2、codehaus 等)的通用代理
将 Nexus 配置为对内部存储库执行以下操作
-
定期删除旧快照
发布时删除快照
构建索引文件。这也加快了本地构建速度
有一个通用的 settings.xml 文件,它使用这四个且仅使用这四个源。如果您需要在此之外进行自定义,请尝试保留设置的通用部分文件并使用配置文件来找出差异。不要让您的客户只是滚动他们自己的设置,否则您最终会得到构建在一台机器上而不是在任何其他机器上的代码。
为您的客户端提供一个通用代理。在 Nexus 中,您可以将一堆代理添加到通用 Maven 源(Apache、JBoss、Codehaus),并将一个代理暴露给内部客户端.这使得从您的客户中添加和删除源变得更加容易。
不要在同一个存储库中混用内部和第 3 方工件。 Nexus 允许您通过 web gui 将 jars 添加到内部存储库。我推荐将 JDBC 驱动程序和其他外部代码添加到 3rd 方的方式。与大多数企业软件相比,用户界面非常好用。
定义一个通用父 POM,通过 distributionManagement 标签定义内部快照和发布仓库。我知道很多人告诉你不要这样做。虽然我坦率地承认这样做存在各种问题,但如果客户只构建版本和快照以部署到单个内部存储库,那么它就可以了。
如果您有一个管理不善的现有 Maven 存储库,请创建一个名为 Legacy 的第 5 个存储库并将整个存储库放在那里。设置一个 cron 任务,以便在旧文件一岁后从旧文件中删除它们。这给了每个人一年的时间来摆脱它并更新他们的 pom。
为内部工件建立一个易于遵循的命名约定。我更喜欢 Department.Function.Project 的 GroupID 和该 componentName 的 ArtifactId >。对于内部存储库,com/org/net 和公司名称可能无关紧要。如果公司更名,那就错了。销售、会计或库存部门更名的可能性要小得多。
【讨论】:
作为更新,Sonatype 在 2010 年初的 1.5 版本中开源了他们对 Nexus 的 LDAP 支持。 对于那些按照 sal 的建议为现有内容创建遗留存储库的人,这里有一个方便的链接:blog.sonatype.com/people/2010/04/…【参考方案2】:作为 原始问题(构建 M2 存储库时要考虑的技术问题),我建议创建只读用户来浏览存储库和每个管理员的管理用户(也就是说:一个读取-所有非管理员用户的唯一用户)。 此外,我建议定期生成备份图像(也许一天一次?)。如果您的存储库很大,或者您不时安装自己的工件,这两者都非常重要。
最后但同样重要的是,在添加新的远程存储库时,您必须添加包含/排除过滤器,以便更快地在存储库中查找工件。
还有很多其他问题需要考虑,但这些是我在管理 Maven 内部存储库时遇到的主要问题。
为了记录,我同时使用 Nexus 和 Artifactory;我可以清楚地指出,虽然 Nexus 非常简单和可操作(尽管我有时在 Ubuntu 上的安装过程中遇到问题),但它的免费版本无法与 Artifactory 的社区(免费)版竞争。 除去 Artifactory 令人敬畏的 web 2 UI,它的主要功能,例如安全管理、定期备份和可访问性问题,远远超出了 Nexus。
【讨论】:
【参考方案3】:需要考虑的其他事项:
http://archiva.apache.org/
【讨论】:
还有这个:sonatype.com/people/2009/07/… 哦,一个 sonatype 博客上的“案例研究”,多么公正。为什么不直接链接到产品,让人们自己决定。 Arnaud 写了那篇博客,最初用法语发布在他的个人网站上。我们只是让他翻译成英文。那是怎么回事?【参考方案4】:我自己也在使用 Artifactory,我喜欢它的用户界面和易于部署/维护的特性。也就是说,我从未使用过 Nexus,因此无法真正帮助您进行适当的功能比较。
以下是我非常喜欢 Artifactory 的一些事情(请记住,Nexus 可能也有这些功能):
-
漂亮的 Web 2.0 界面。
能够导入本地 Maven 存储库以帮助您入门。
易于与现有 LDAP 服务器集成以确保安全(我非常喜欢使用单一存储库来存储凭据)。
鉴于实际上只有两个主要的 Maven 存储库实现,如果您真的想确保自己做出了正确的选择,我建议您都尝试一下,然后自己决定您更喜欢哪个。
【讨论】:
感谢您对 Artifactory 与 Nexus 的选择进行权衡...我同意最好的方法是尝试两者。你对具体使用一个有什么建议吗?此外,您的组织是否遇到任何障碍或障碍? 真的没有具体的建议,它太简单了,真的没什么。 Artifactory 没有遇到任何问题。【参考方案5】:一定要使用Nexus。 :P
我使用过 Nexus 和 Artifactory。 Nexus 的界面更加健壮,更加可配置,当然,它是由 Sonatype 编写的,他几乎很好地代表了 Maven 的所有内容。
话虽如此,Artifactory 还是不错的,而且可行。
A review of Nexus vs. Artifactory Oh my! Of course, here's a SO quesiton about the matter. Sonatype does a feature comparison jFrog (maker of Artifactory) does a feature comparison【讨论】:
您能解释一下使其在鸟瞰级别上稳健/可配置的功能类型吗? 有人知道这些工具是否也可以维护 Ivy 存储库吗? @skaffman 他们中的任何一个都应该能够,因为 Ivy 具有读取 Maven 2 存储库的内置功能。我可以亲自验证 Nexus 和 Archiva 与 Ivy 一起运行良好。 Ant 和 Ivy 自己正在部署到 Apache 的 Nexus 存储库,因此 Ivy/Nexus 集成绝对没有问题。【参考方案6】:使用Artifactory。
【讨论】:
为什么?与替代品相比,它有什么优势? 简单易用且免费。 Nexus 限制了免费版本的功能,但如果这不是问题(没有那么不同的功能集或免费部分),它也很好。我放弃了“绝对”,这有点太强了,因为 altCognito 叫我。 我不会说 Nexus 限制了功能,Pro 版本中还有其他功能,但其中大部分是企业功能,在任何其他工具中根本不存在。【参考方案7】:也许这很明显,但是为了重现性,开发人员永远不应该覆盖工件,它们应该是新版本。
这也适用于上游存储库。如果您下载 Apache-commons 版本 1.2.3,您真的不应该再次下载它。修复来自较新的版本,不适用于现有版本。
【讨论】:
感谢您的澄清 - 我的意思是在使用发布插件将他们自己拥有的工件版本发布到存储库的上下文中。将编辑问题。以上是关于维护内部 Maven 存储库的技巧?的主要内容,如果未能解决你的问题,请参考以下文章