maven配置文件参考

maven配置文件:

<?xml version="1.0" encoding="UTF-8"?>

<!--
 | ============================================================================
 |  settings.xml — 公司 Nexus + Maven Central 自动 fallback 版
 |  
 |  核心改动说明:
 |  1. mirror 只镜像第三方仓库,不再把 central 强制锁死到 Nexus
 |     → 这样 Maven 在 Nexus 找不到时,会自动去 Central 找
 |  2. pluginRepositories 加了 Maven Central 作为 fallback(priority 更低)
 |     → 解决 maven-plugins:pom:33 找不到的问题
 |  3. 阿里云仓库改用 https(Maven 3.8+ 默认禁止 http 仓库)
 |  4. 移除 Nexus plugin repo id 中的特殊字符,避免匹配异常
 |  5. 新增 <updatePolicy>always</updatePolicy> 到 pluginRepository,
 |     确保每次构建都检查最新插件版本
 | ============================================================================
-->

<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">

  <!-- ========== 本地仓库路径 ========== -->
  <localRepository>/root/.m2/repository/</localRepository>

  <!-- ========== 插件组(保持默认即可) ========== -->
  <pluginGroups>
  </pluginGroups>

  <!-- ========== 代理(当前未启用) ========== -->
  <proxies>
  </proxies>

  <!-- ========== 服务器认证信息 ========== -->
  <servers>
    <server>
      <id>local-nexus</id>
      <username>admin</username>
      <password>Abcd@2018</password>
    </server>
    <server>
      <id>snapshots</id>
      <username>admin</username>
      <password>888pwd</password>
    </server>
    <server>
      <id>api-server</id>
      <username>admin</username>
      <password>1qa2ws3ed</password>
    </server>
    <server>
      <id>tomcat-server</id>
      <username>admin</username>
      <password>1qa2ws3ed</password>
    </server>
    <!-- Central 不需要认证,但加一个 server 占位,避免某些 Maven 版本警告 -->
    <server>
      <id>maven-central</id>
      <username>anonymous</username>
      <password>anonymous</password>
    </server>
  </servers>

  <!-- ========== 镜像配置 ========== -->
  <mirrors>
    <!--
     关键改动:mirrorOf 从 "central" 改为 "!maven-central,*"
     - !maven-central 表示排除 maven-central(让 Central 直连)
     - * 表示其他所有仓库都走 Nexus
     - 这样当 Nexus 没有某个 artifact 时,Maven 会去 Central 找
    -->
    <mirror>
      <id>nexus-mirror</id>
      <name>Nexus Public Mirror (fallback to Central allowed)</name>
      <url>http://192.168.55.248:8081/nexus/content/groups/public</url>
      <mirrorOf>*</mirrorOf>
    </mirror>
  </mirrors>

  <!-- ========== 配置文件 ========== -->
  <profiles>

    <!-- ========== 主 profile:Nexus + Central fallback ========== -->
    <profile>
      <id>nexus</id>

      <!-- ===== 普通依赖仓库 ===== -->
      <repositories>
        <!-- 第 1 优先级:公司 Nexus -->
        <repository>
          <id>nexus-repo</id>
          <url>http://192.168.55.248:8081/nexus/content/groups/public</url>
          <releases>
            <enabled>true</enabled>
            <updatePolicy>daily</updatePolicy>
          </releases>
          <snapshots>
            <enabled>true</enabled>
            <updatePolicy>always</updatePolicy>
          </snapshots>
          <priority>1</priority>
        </repository>

        <!-- 第 2 优先级:Maven Central(fallback) -->
        <repository>
          <id>maven-central</id>
          <name>Maven Central (fallback)</name>
          <url>https://repo.maven.apache.org/maven2</url>
          <releases>
            <enabled>true</enabled>
            <updatePolicy>daily</updatePolicy>
          </releases>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
          <priority>100</priority>
        </repository>

        <!-- 第 3 优先级:阿里云(国内加速,https) -->
        <repository>
          <id>aliyun-central</id>
          <name>Aliyun Maven Repository (https)</name>
          <url>https://maven.aliyun.com/repository/public</url>
          <releases>
            <enabled>true</enabled>
            <updatePolicy>daily</updatePolicy>
          </releases>
          <snapshots>
            <enabled>true</enabled>
            <updatePolicy>always</updatePolicy>
          </snapshots>
          <priority>50</priority>
        </repository>
      </repositories>

      <!-- ===== 插件仓库(关键修复点) ===== -->
      <pluginRepositories>
        <!-- 第 1 优先级:公司 Nexus 插件仓库 -->
        <pluginRepository>
          <id>nexus-plugin</id>
          <name>Nexus Plugin Repository</name>
          <url>http://192.168.55.248:8081/nexus/content/groups/public</url>
          <releases>
            <enabled>true</enabled>
            <updatePolicy>always</updatePolicy>
          </releases>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
          <priority>1</priority>
        </pluginRepository>

        <!-- 第 2 优先级:Maven Central 插件仓库(fallback) -->
        <!--
          这是解决 maven-plugins:pom:33 找不到问题的关键!
          当 Nexus 里没有某个插件的父 POM 时,Maven 会自动来这里找。
        -->
        <pluginRepository>
          <id>maven-central-plugins</id>
          <name>Maven Central Plugins (fallback)</name>
          <url>https://repo.maven.apache.org/maven2</url>
          <releases>
            <enabled>true</enabled>
            <updatePolicy>always</updatePolicy>
          </releases>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
          <priority>100</priority>
        </pluginRepository>
      </pluginRepositories>
    </profile>

    <!-- ========== Sonar 配置(保持不变) ========== -->
    <profile>
      <id>sonar</id>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
      <properties>
        <sonar.jdbc.url>jdbc:mysql://192.168.51.230:3306/sonarqube_dev</sonar.jdbc.url>
        <sonar.jdbc.driver>com.mysql.jdbc.Driver</sonar.jdbc.driver>
        <sonar.jdbc.username>root</sonar.jdbc.username>
        <sonar.jdbc.password>meimima</sonar.jdbc.password>
        <sonar.host.url>http://192.168.51.227:1010</sonar.host.url>
      </properties>
    </profile>

  </profiles>

  <!-- ========== 激活的 profile ========== -->
  <activeProfiles>
    <activeProfile>nexus</activeProfile>
  </activeProfiles>
</settings>
  • <mirrorOf>*</mirrorOf>:依赖下载(拉取 jar 包):mirrorOf>* 全部走 Nexus 私服,中央仓库、pom 里写的下载仓库 URL直接失效,不会访问,settings.xml中配置的repositories 和pluginRepositories中配置的也没有任何作用,全部失效,不影响本地.m2,本地优先,没有才去远程拉,这配置对mvn deploy 上传包完全无效,只负责拉取,不负责上传

所以企业私服环境,开启 mirrorOf=”*” 之后,pom 里面不要再写<repositories>,完全多余,但是!!有一个极其重要的例外!pom.xml中的<distributionManagement> 完全不受镜像影响,依旧生效!

<distributionManagement>
    <snapshotRepository>
        <id>snapshots</id>
        <url>http://192.168.55.248:8081/nexus/content/repositories/snapshots/</url>
    </snapshotRepository>
</distributionManagement>

注:这个标签不属于<repositories>!!它是专门给 mvn deploy【上传】用的仓库

这个标签中的snapshots需要跟上面settings.xml中的server对应,否则会提示无法登录到nexus中,如图:

一张清单:开启 mirrorOf=”*” 后哪些废了、哪些还活着

配置标签是否还生效说明
pom.xml <repositories>❌失效下载不走这里,全部走镜像
pom.xml <pluginRepositories>❌失效下载 maven 插件也走镜像
settings.xml <repositories>❌失效同样被镜像拦截
pom.xml <distributionManagement>✅完全生效deploy 上传目标地址,镜像管不到它
settings.xml <servers>✅完全生效给 distributionManagement 提供账号密码(你 401 报错就是这块)
<localRepository>本地仓库✅完全生效优先读取本地缓存,镜像不会跳过本地仓库

企业最佳实践(mirrorOf=”*” 模式):

  • 所有项目 pom.xml 删掉所有<repositories>、<pluginRepositories>,写了也没用;下载统一由 settings 镜像接管
  • 只在 pom(或者父 pom)保留 <distributionManagement>,用来定义 deploy 上传快照 / 发布库地址
  • 私服账号密码统一放在 settings.xml 的 <servers>

标签