29

我有兴趣为我的组织维护一个Maven 2 存储库。有哪些有用的提示和陷阱。

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

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

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

4

7 回答 7

28

我建议设置一个至少包含四个存储库的 nexus 服务器。我不会推荐神器。免费版的 nexus 非常适合不到 20 人、不到三个小组的开发团队。如果您有更多的用户,请帮自己一个忙并为 Sonatype 版本付费。LDAP 集成为自己付出了代价。

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

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

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

有一个通用的 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 和公司名称可能无关紧要。如果公司更名,那就错了。销售、会计或库存部门更名的可能性要小得多。

于 2009-10-30T15:13:32.217 回答
7

绝对使用Nexus。:P

我用过 Nexus 和 Artifactory。Nexus 的界面更健壮,更易于配置,当然,它是由Sonatype编写的,他几乎可以很好地反映 Maven 的所有内容。

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

于 2009-06-24T16:33:03.033 回答
4

使用神器

于 2009-06-24T16:20:46.657 回答
4

我自己也在使用 Artifactory,我喜欢它的用户界面和易于部署/维护的特性。也就是说,我从未使用过 Nexus,并且无法真正帮助您进行适当的功能比较。

以下是我非常喜欢 Artifactory 的一些事情(请记住,Nexus 也可能具有这些功能):

  1. 漂亮的 Web 2.0 界面。
  2. 导入本地 Maven 存储库以帮助您入门的能力。
  3. 易于与现有 LDAP 服务器集成以确保安全(我非常喜欢使用单个存储库来存储凭据)。

鉴于实际上只有两个主要的 Maven 存储库实现,如果您真的想确保您做出了正确的选择,我建议您尝试两个,并自己决定您更喜欢哪个。

于 2009-06-24T17:04:33.387 回答
3

也许这很明显,但是,为了重现性,开发人员不应该覆盖工件,它们应该是新版本。

这也适用于上游存储库。如果你下载 Apache-commons 1.2.3 版,你真的不应该再次下载它。修复来自较新的版本,不适用于现有版本。

于 2009-06-24T16:16:30.760 回答
3

还有一点需要考虑:

http://archiva.apache.org/

于 2009-06-25T09:25:24.430 回答
3

作为原始问题(构建 M2 存储库时要考虑的技术问题),我建议为每个管理员创建只读用户来浏览存储库和管理用户(也就是说:一个只读用户用于所有那些不是管理员)。此外,我建议定期生成备份图像(也许一天一次?)。如果您的存储库很大或者您不时安装自己的工件,这两者都非常重要。

最后但并非最不重要的一点是,在添加新的远程存储库时,您必须添加包含/排除过滤器,以便更快地在存储库中查找工件。

还有很多其他问题需要考虑,但这些是我在管理 Maven 内部存储库时遇到的主要问题。

作为记录,我同时使用 Nexus 和 Artifactory;我可以清楚地指出,虽然 Nexus 非常简单和可操作(尽管我有时在 Ubuntu 上的安装过程中遇到问题),但它的免费版本无法与 Artifactory 的社区(免费)版竞争。除去 Artifactory 令人敬畏的 web 2 UI,它的主要功能,如安全管理、定期备份和可访问性问题,远远超出了 Nexus。

于 2009-10-30T08:31:21.430 回答