maven settings.xml配置详解

 

我们直接来个示例,然后逐步介绍每一部分的配置:

以下是一个按环境区分(dev/test/release)的 settings.xml 示例,适合将构建产物分别部署到三个不同环境的私有仓库

settings.xml

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">

    <!-- 镜像加速(不影响私有仓库) -->
    <mirrors>
        <mirror>
            <id>aliyun</id>
            <mirrorOf>central,jcenter,!szsh-dev,!szsh-test,!szsh-release</mirrorOf>
            <name>aliyun-public</name>
            <url>https://maven.aliyun.com/nexus/content/groups/public</url>
        </mirror>
    </mirrors>

    <!-- 仓库认证信息 -->
    <servers>
        <server>
            <id>szsh-dev</id>
            <username>你的dev用户名</username>
            <password>你的dev密码</password>
        </server>
        <server>
            <id>szsh-test</id>
            <username>你的test用户名</username>
            <password>你的test密码</password>
        </server>
        <server>
            <id>szsh-release</id>
            <username>你的release用户名</username>
            <password>你的release密码</password>
        </server>
    </servers>

    <!-- 按环境配置部署地址 -->
    <profiles>
        <!-- 开发环境 -->
        <profile>
            <id>dev</id>
            <properties>
                <altSnapshotDeploymentRepository>
                    szsh-dev::default::https://packages.aliyun.com/your-path/maven/szsh-dev  # 最前面的szsh-dev要和上面server中的id保持一致,表示用相应的认证信息
                </altSnapshotDeploymentRepository>
            </properties>
        </profile>

        <!-- 测试环境 -->
        <profile>
            <id>test</id>
            <properties>
                <altSnapshotDeploymentRepository>
                    szsh-test::default::https://packages.aliyun.com/your-path/maven/szsh-test
                </altSnapshotDeploymentRepository>
            </properties>
        </profile>

        <!-- 生产环境 -->
        <profile>
            <id>release</id>
            <properties>
                <altReleaseDeploymentRepository>
                    szsh-release::default::https://packages.aliyun.com/6825923df9ff7623b1ecd74f/maven/szsh-release
                </altReleaseDeploymentRepository>
            </properties>
        </profile>
    </profiles>

    <!-- 默认启用哪个环境(可以为空) -->
    <activeProfiles>
        <!-- <activeProfile>dev</activeProfile> -->
    </activeProfiles>
</settings>

使用方法:

环境命令说明
dev mvn clean deploy -Pdev 发布 SNAPSHOT 到 dev 仓库
test mvn clean deploy -Ptest 发布 SNAPSHOT 到 test 仓库
release mvn clean deploy -Prelease 发布 release 到生产仓库

 

注意:发布 snapshot 版本的前提是 pom.xml 中版本后缀为 -SNAPSHOT,否则不会触发 snapshot 部署逻辑。

 

下面是带认证信息的完整简化 settings.xml 示例,可用来 拉取和发布 私仓中的 JAR 包(release 和 snapshot):

带认证和私仓配置的 settings.xml<?xml version="1.0" encoding="UTF-8"?>

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">

  <mirrors>
    <mirror>
      <id>aliyun-mirror</id>
      <mirrorOf>central,jcenter,!szsh-release,!szsh-snapshot</mirrorOf>
      <name>Aliyun Maven Mirror</name>
      <url>https://maven.aliyun.com/nexus/content/groups/public</url>
    </mirror>
  </mirrors>

  <servers>
    <server>
      <id>szsh-release</id>
      <username>682ad2040601d2fea63dd8c0</username>
      <password>_aIfa[kvnYNy</password>
    </server>
    <server>
      <id>szsh-snapshot</id>
      <username>682ad2040601d2fea63dd8c0</username>
      <password>_aIfa[kvnYNy</password>
    </server>
  </servers>

  <profiles>
    <profile>
      <id>rdc</id>
      <properties>
        <altReleaseDeploymentRepository>
              szsh-release::default::https://packages.aliyun.com/6825923df9ff7623b1ecd74f/maven/szsh-release
        </altReleaseDeploymentRepository>
        <altSnapshotDeploymentRepository>
              szsh-snapshot::default::https://packages.aliyun.com/6825923df9ff7623b1ecd74f/maven/szsh-snapshot
        </altSnapshotDeploymentRepository>
      </properties>
      <repositories>
        <repository>
          <id>szsh-release</id>
              <url>https://packages.aliyun.com/6825923df9ff7623b1ecd74f/maven/szsh-release</url>
               <releases><enabled>true</enabled></releases>
              <snapshots><enabled>false</enabled></snapshots>
        </repository>
        <repository>
          <id>szsh-snapshot</id>
          <url>https://packages.aliyun.com/6825923df9ff7623b1ecd74f/maven/szsh-snapshot</url>
          <releases><enabled>false</enabled></releases>
          <snapshots><enabled>true</enabled></snapshots>
        </repository>
      </repositories>
    </profile>
  </profiles>

<activeProfiles> <activeProfile>rdc</activeProfile> </activeProfiles> </settings>

拉取依赖mvn clean installmvn compile,Maven 会尝试从你私仓拉取 jar。

发布 jar 到私仓

mvn deploy -DaltDeploymentRepository=szsh-release::default::https://packages.aliyun.com/6825923df9ff7623b1ecd74f/maven/szsh-release

1. 拉取依赖

  • repositories 配置了私有仓库(szsh-releaseszsh-snapshot);

  • servers 中提供了这两个仓库的认证信息;

  • 激活了对应 profile(你用了 <activeProfile>rdc</activeProfile>);

所以只需要正常执行:

mvn clean install

就可以从私仓拉取 jar 包。

2. 发布构建产物

配置中通过 <altReleaseDeploymentRepository><altSnapshotDeploymentRepository> 指定了发布地址。

Maven 发布时是使用 deploy 阶段,会读取这些 <properties>

  • 对于 release 版本:

    mvn deploy

    Maven 会自动发布到 szsh-release 仓库。

  • 对于 snapshot 版本:
     pom 中版本必须是 1.0.0-SNAPSHOT 这类形式,Maven 才会推送到 szsh-snapshot 仓库。

 发布注意事项

  • 必须执行 mvn deploy,不是 install

  • 必须提供正确版本号

    • 1.0.0 → 发布到 release 仓库;

    • 1.0.0-SNAPSHOT → 发布到 snapshot 仓库;


小结

功能是否支持条件
拉取私仓依赖 已配置 <repositories> 和认证信息
发布私仓 已配置 <altReleaseDeploymentRepository><servers>

 

 

在 Maven 的 settings.xml 中,不同的配置片段有明确的用途,我们可以从“拉取依赖” 和 “发布构建产物” 两大功能进行拆解:

用于 拉取依赖 的配置

这部分是为了从仓库中下载 jar 包、插件等依赖:

<mirrors>
    <mirror>
        <id>mirror</id>
        <mirrorOf>central,jcenter,!szsh-release,!szsh-snapshot</mirrorOf>
        <url>https://maven.aliyun.com/nexus/content/groups/public</url>
    </mirror>
</mirrors>
  • 设置中央仓库(或公共镜像)的替代地址;

  • 排除私仓(否则会被镜像覆盖,导致无法从私仓拉取);

<repositories>
    <repository>
        <id>szsh-release</id>
        <url>https://packages.aliyun.com/.../szsh-release</url>
        ...
    </repository>
    <repository>
        <id>szsh-snapshot</id>
        <url>https://packages.aliyun.com/.../szsh-snapshot</url>
        ...
    </repository>
</repositories>

指定私有仓库用于拉取 release 和 snapshot 类型的依赖。

servers(拉取时用于认证)

<servers>
    <server>
        <id>szsh-release</id>
        <username>...</username>
        <password>...</password>
    </server>
</servers>
  • <repositories> 中的 id 对应;

  • 拉取私仓 jar 包时提供认证凭据。

用于 发布构建产物 的配置

这部分是为了将构建好的 jar 上传到私有仓库:

profiles > profile > properties

<properties>
    <altReleaseDeploymentRepository>
      szsh-release::default::https://packages.aliyun.com/.../szsh-release
    </altReleaseDeploymentRepository>

    <altSnapshotDeploymentRepository>
      szsh-snapshot::default::https://packages.aliyun.com/.../szsh-snapshot
    </altSnapshotDeploymentRepository>
</properties>
  • 告诉 Maven deploy 阶段,release 和 snapshot 构件应分别发布到哪个仓库;

  • 注意格式是:<id>::layout::url

servers(发布时也会用到认证)

<servers>
    <server>
        <id>szsh-release</id>   <!-- 与发布目标仓库 id 匹配 -->
        <username>...</username>
        <password>...</password>
    </server>
</servers>

总结对照表

配置位置用途说明
<mirrors> 拉取 设置公共仓库镜像
<profiles> > <repositories> 拉取 指定依赖仓库(含私仓)
<profiles> > <pluginRepositories> 拉取插件 用于构建插件依赖
<servers> 拉取 & 发布 仓库认证
<profiles> > <properties> > altXXXDeploymentRepository 发布 指定 jar 上传地址

 

 

这里是一个 按环境(dev/test/prod)划分的 Maven settings.xml 配置示例,支持不同环境使用不同的私有仓库(带认证),并自动拉取依赖和发布构建产物。

示例结构说明

  • 使用 <profile> 来区分环境:devtestprod

  • 每个环境使用不同的 altDeploymentRepository

  • 每个环境支持从私仓拉取 + 向私仓发布。

  • 使用 <activeProfiles> 选择当前环境。

完整示例:分环境配置 settings.xml

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">

    <mirrors>
        <!-- 公共仓库镜像,排除私有仓库 -->
        <mirror>
            <id>aliyun-public</id>
            <mirrorOf>central,jcenter,!dev-repo,!test-repo,!prod-repo</mirrorOf>
            <name>aliyun-maven</name>
            <url>https://maven.aliyun.com/nexus/content/groups/public</url>
        </mirror>
    </mirrors>

    <servers>
        <server>
            <id>dev-repo</id>
            <username>your-username-dev</username>
            <password>your-password-dev</password>
        </server>
        <server>
            <id>test-repo</id>
            <username>your-username-test</username>
            <password>your-password-test</password>
        </server>
        <server>
            <id>prod-repo</id>
            <username>your-username-prod</username>
            <password>your-password-prod</password>
        </server>
    </servers>

    <profiles>

        <!-- 开发环境 -->
        <profile>
            <id>dev</id>
            <properties>
                <altReleaseDeploymentRepository>
                    dev-repo::default::https://your-dev-repo-url
                </altReleaseDeploymentRepository>
                <altSnapshotDeploymentRepository>
                    dev-repo::default::https://your-dev-repo-url
                </altSnapshotDeploymentRepository>
            </properties>
            <repositories>
                <repository>
                    <id>dev-repo</id>
                    <url>https://your-dev-repo-url</url>
                    <releases><enabled>true</enabled></releases>
                    <snapshots><enabled>true</enabled></snapshots>
                </repository>
            </repositories>
        </profile>

        <!-- 测试环境 -->
        <profile>
            <id>test</id>
            <properties>
                <altReleaseDeploymentRepository>
                    test-repo::default::https://your-test-repo-url
                </altReleaseDeploymentRepository>
                <altSnapshotDeploymentRepository>
                    test-repo::default::https://your-test-repo-url
                </altSnapshotDeploymentRepository>
            </properties>
            <repositories>
                <repository>
                    <id>test-repo</id>
                    <url>https://your-test-repo-url</url>
                    <releases><enabled>true</enabled></releases>
                    <snapshots><enabled>true</enabled></snapshots>
                </repository>
            </repositories>
        </profile>

        <!-- 生产环境 -->
        <profile>
            <id>prod</id>
            <properties>
                <altReleaseDeploymentRepository>
                    prod-repo::default::https://your-prod-repo-url
                </altReleaseDeploymentRepository>
                <altSnapshotDeploymentRepository>
                    prod-repo::default::https://your-prod-repo-url
                </altSnapshotDeploymentRepository>
            </properties>
            <repositories>
                <repository>
                    <id>prod-repo</id>
                    <url>https://your-prod-repo-url</url>
                    <releases><enabled>true</enabled></releases>
                    <snapshots><enabled>true</enabled></snapshots>
                </repository>
            </repositories>
        </profile>

    </profiles>

    <!-- 默认激活的环境(可以改成 dev/test/prod) -->
    <activeProfiles>
        <activeProfile>dev</activeProfile>
    </activeProfiles>
</settings>

如何切换环境?

有两种方式:

方法 1:编辑 settings.xml

<activeProfiles>
    <activeProfile>prod</activeProfile>  <!-- 改成 prod 就是生产 -->
</activeProfiles>

方法 2:命令行传参(推荐)

mvn deploy -Pprod

发布 & 拉取说明

  • 拉取依赖时:Maven 会使用当前环境下的 <repositories>

  • 发布构建产物时(mvn deploy):使用该 profile 中的 altReleaseDeploymentRepositoryaltSnapshotDeploymentRepository

  • 两者都依赖 <servers> 中的认证信息(id 要一致)。

 

posted @ 2025-05-28 17:48  羊脂玉净瓶  阅读(476)  评论(0)    收藏  举报