大规模集中部署指南

本指南涵盖了在拥有成百上千个 Maven 项目的大型组织中使用存储库管理器的简单优化方法。

这种方法的支柱是:

  1. 使用集中的存储库管理器
    • Maven 客户端应该从存储库管理器下载所需的工件。
    • Maven 客户端应该将专有工件上传到存储库管理器。
  2. settings.xml配置在 Maven文件中而不是在文件中下载/上传工件的位置pom.xml
  3. 集中管理settings.xml文件,并通过自动化进行分发。

存储库管理器布局

存储库管理器通常具有至少三种类型的存储库:

托管
包含上传到存储库管理器的工件
代理
代理远程存储库并缓存工件
虚拟的
将多个存储库聚合为一个

在存储库管理器中组织存储库的最简单方法是拥有一个聚合的虚拟存储库:

  • 每个公共存储库的代理存储库进行镜像。(例如:Maven 中心)
  • 发布的托管存储库
  • 快照的托管存储库
  • 可以包含发布和快照的托管存储库(仅当某些项目仍在使用 Maven 部署插件 < 2.8 时才需要。有关更多信息,请参阅管理上传到存储库管理器。)

由于需要不同的工件保留策略,单独的托管存储库通常用于发布和快照。

以下部分描述了如何将 Maven 客户端配置为:

从存储库管理器管理下载

组织中 Maven 项目使用的所有工件都应从存储库管理器的单个虚拟存储库中下载。

可以通过在 Mavensettings.xml文件中定义镜像来指示 Maven 从存储库管理器的虚拟存储库下载工件,如镜像设置指南中所述。

示例:要从公司存储库管理器的maven-virtual存储库下载工件:

<settings>
  ...
  <mirrors>
    <!-- Mirror all external repositories via the Corporate Repository Manager's Maven virtual repository -->
    <mirror>
      <id>corp-repository-manager</id>
      <name>Corporate Repository Manager</name>
      <mirrorOf>external:*</mirrorOf>
      <url>https://corp-repository-manager-host/maven-virtual</url>
    </mirror>
  </mirrors>
  ...
</settings>

管理上传到存储库管理器

组织中 Maven 项目产生的所有专有工件都应上传到存储库管理器的托管存储库。

通过在 Maven文件中定义属性,可以指示Maven 部署插件将工件上传到存储库管理器的存储库。定义这些属性后,Maven 部署插件的部署目标使用它们而不是文件部分来确定上传工件的位置。alt*DeploymentRepositorysettings.xml<distributionManagement>pom.xml

settings.xml在文件中而不是在文件<distributionManagement>部分中定义工件的上传目的地pom.xml允许对目的地进行集中管理,如果目的地需要更改,这将简化维护。换句话说,如果/当分发位置需要更改时pom.xml,您只需要更改相对较少的文件,而不是更改大量文件。 settings.xml

Maven Deploy Plugin 2.8 中添加了分别通过altReleaseDeploymentRepository和属性为发布和快照指定单独的备用部署存储库的功能。altSnapshotDeploymentRepository为了充分利用本文档中定义的方法,所有项目都应使用 Maven Deploy Plugin >=2.8。如果某些项目仍在使用旧版本的 Maven 部署插件(>=2.3 和 <2.8),则通过altDeploymentRepository指向能够包含发布和快照的存储库的属性指定一个备用部署存储库。

通常,只允许持续集成服务器将工件上传到存储库管理器。因此,这些设置应该只settings.xml在持续集成服务器上的文件中指定,而不应该在settings.xml开发者机器上的文件中。或者,如果您希望开发人员能够将工件上传到存储库管理器,则将这些属性包含在settings.xml开发人员使用的文件中。

示例:要将工件上传到公司存储库管理器的托管存储库之一:

<settings>
  ...
  <profiles>
    <profile>

      <id>corp-repository-manager</id>

      <properties>
        <!--
          For Maven Deploy Plugin >= 2.8, deploy snapshots to this repository instead of the
          distributionManagement snapshotRepository from project pom.xml files.
        -->
        <altSnapshotDeploymentRepository>corp::default::https://corp-repository-manager-host/maven-snapshots</altSnapshotDeploymentRepository>

        <!--
          For Maven Deploy Plugin >= 2.8, deploy releases to this repository instead of the
          distributionManagement repository from project pom.xml files.
        -->
        <altReleaseDeploymentRepository>corp::default::https://corp-repository-manager-host/maven-releases</altReleaseDeploymentRepository>

        <!--
          Only needed if some projects are still using Maven Deploy Plugin >=2.3 and < 2.8,
          which is the case if projects are using the default version of Maven Deploy Plugin in maven 3.x.
          For Maven Deploy Plugin >=2.3 and < 2.8, deploy both releases and snapshots to this repository
          instead of the repositories mentioned in distributionManagement from project pom.xml files.
        -->
        <altDeploymentRepository>corp::default::https://corp-repository-manager-host/maven-combined</altDeploymentRepository>
      </properties>

      <repositories>
        <repository>
          <id>corp</id>
          <!--
            This URL is overridden by the corp-repository-manager mirror above.
            Some misbehaving tools might complain if they can't resolve the host specified here.
            If you encounter this problem, use the same URL as the corp-repository-manager mirror.
          -->
          <url>https://ignored</url>
          <releases>
            <enabled>true</enabled>
            <updatePolicy>never</updatePolicy>
          </releases>
          <snapshots>
            <enabled>true</enabled>
            <updatePolicy>always</updatePolicy>
          </snapshots>
        </repository>
      </repositories>

      <pluginRepositories>
        <pluginRepository>
          <id>corp</id>
          <!--
            This URL is overridden by the corp-repository-manager mirror above.
            Some misbehaving tools might complain if they can't resolve the host specified here.
            If you encounter this problem, use the same URL as the corp-repository-manager mirror.
          -->
          <url>https://ignored</url>
          <releases>
            <enabled>true</enabled>
            <updatePolicy>never</updatePolicy>
          </releases>
          <snapshots>
            <enabled>true</enabled>
            <updatePolicy>always</updatePolicy>
          </snapshots>
        </pluginRepository>
      </pluginRepositories>

    </profile>
  </profiles>
  <activeProfiles>
    <activeProfile>corp-repository-manager</activeProfile>
  </activeProfiles>
  ...
</settings>

设置文件位置

Mavensettings.xml文件需要在任何执行 Maven 构建的地方都可用,通常是:

  • 在持续集成服务器上,以及
  • 在开发者机器上

两个位置都应具有从存储库管理器管理下载中提到的镜像设置。

通常,只有持续集成服务器应该具有管理上传到存储库管理器中提到的部署存储库设置,因为应该只允许持续集成服务器上传到存储库管理器。或者,如果您希望开发人员能够将工件上传到存储库管理器,则将部署存储库属性包含在settings.xml开发人员使用的文件中。

文件的settings.xml存储和更新方式超出了本文档的范围。一般的建议是集中管理几个settings.xml文件,然后使用自动化将它们分发到持续集成服务器和开发人员机器上。