maven 下载jar包加载顺序

在 Maven 构建过程中,依赖的下载源取决于你的 pom.xml 文件中的 配置、settings.xml 文件中的 和 配置,以及你的 Nexus 仓库的设置。以下是决定 Maven 从哪个仓库下载依赖的关键点:

仓库配置优先级

  1. 项目 pom.xml 文件中的仓库配置:优先使用在项目 pom.xml 文件中指定的仓库。
  2. 用户 settings.xml 文件中的仓库配置:如果项目中没有指定仓库,则使用用户 settings.xml 文件中的配置。
  3. 全局 settings.xml 文件中的仓库配置:如果用户 settings.xml 中也没有配置,则使用全局 settings.xml
    文件中的配置(通常位于 Maven 的安装目录中)。

仓库的匹配和下载逻辑

  1. 定义的仓库顺序:Maven 会按照仓库定义的顺序依次查询。第一个找到所需依赖的仓库将被使用。
  2. 镜像配置:如果在 settings.xml 中定义了镜像(),所有对原始仓库的请求会被重定向到镜像仓库。
  3. 本地缓存:在查询远程仓库之前,Maven 首先会在本地缓存(~/.m2/repository)中查找依赖。

示例配置和行为

pom.xml

xml 复制代码
<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>my-project</artifactId>
    <version>1.0.0</version>
    
    <repositories>
        <repository>
            <id>central</id>
            <url>https://repo.maven.apache.org/maven2</url>
        </repository>
        <repository>
            <id>nexus-releases</id>
            <url>http://nexus.mxcd.top/repository/maven-releases/</url>
        </repository>
    </repositories>
</project>

settings.xml

xml 复制代码
<settings>
    <mirrors>
        <mirror>
            <id>aliyun-repos</id>
            <name>aliyun repository</name>
            <mirrorOf>central</mirrorOf>
            <url>http://maven.aliyun.com/nexus/content/groups/public</url>
        </mirror>
    </mirrors>

    <profiles>
        <profile>
            <id>nexus</id>
            <repositories>
                <repository>
                    <id>mxc-release-repo</id>
                    <url>http://nexus.mxcd.top/repository/maven-releases/</url>
                </repository>
                <repository>
                    <id>mxc-snapshot-repo</id>
                    <url>http://nexus.mxcd.top/repository/maven-snapshots/</url>
                </repository>
            </repositories>
            <pluginRepositories>
                <pluginRepository>
                    <id>mxc-release-repo</id>
                    <url>http://nexus.mxcd.top/repository/maven-releases/</url>
                </pluginRepository>
                <pluginRepository>
                    <id>mxc-snapshot-repo</id>
                    <url>http://nexus.mxcd.top/repository/maven-snapshots/</url>
                </pluginRepository>
            </pluginRepositories>
        </profile>

        <profile>
            <id>aliyun</id>
            <repositories>
                <repository>
                    <id>central</id>
                    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
                </repository>
            </repositories>
            <pluginRepositories>
                <pluginRepository>
                    <id>central</id>
                    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
                </pluginRepository>
            </pluginRepositories>
        </profile>
    </profiles>

    <activeProfiles>
        <activeProfile>nexus</activeProfile>
    </activeProfiles>
</settings>

分析下载行为

  1. 镜像配置生效:
  • 如果你在 settings.xml 中配置了镜像 aliyun-repos,且指定 了
    central,那么所有对中央仓库的请求都会被重定向到阿里云的镜像仓库。这意味着,任何试图从中央仓库下载的依赖都会从阿里云镜像仓库下载。
  1. 项目 pom.xml 中的仓库配置:
  • 在你的 pom.xml 文件中,如果你明确指定了 nexus-releases 仓库,那么该仓库会首先被查询。如果依赖在 nexus-releases 仓库中存在,它会从该仓库下载。
  • 如果 nexus-releases 仓库中没有找到依赖,接下来会查询中央仓库(被重定向到阿里云镜像仓库)。
  1. 用户 settings.xml 中的 Profile 配置:

示例操作流程

假设你的项目 pom.xml 文件和 settings.xml 文件配置如下:

xml 复制代码
pom.xml
<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>my-project</artifactId>
    <version>1.0.0</version>
    
    <repositories>
        <repository>
            <id>nexus-releases</id>
            <url>http://nexus.mxcd.top/repository/maven-releases/</url>
        </repository>
    </repositories>
</project>
xml 复制代码
settings.xml

<settings>
    <mirrors>
        <mirror>
            <id>aliyun-repos</id>
            <name>aliyun repository</name>
            <mirrorOf>central</mirrorOf>
            <url>http://maven.aliyun.com/nexus/content/groups/public</url>
        </mirror>
    </mirrors>

    <profiles>
        <profile>
            <id>nexus</id>
            <repositories>
                <repository>
                    <id>mxc-release-repo</id>
                    <url>http://nexus.mxcd.top/repository/maven-releases/</url>
                </repository>
                <repository>
                    <id>mxc-snapshot-repo</id>
                    <url>http://nexus.mxcd.top/repository/maven-snapshots/</url>
                </repository>
            </repositories>
            <pluginRepositories>
                <pluginRepository>
                    <id>mxc-release-repo</id>
                    <url>http://nexus.mxcd.top/repository/maven-releases/</url>
                </pluginRepository>
                <pluginRepository>
                    <id>mxc-snapshot-repo</id>
                    <url>http://nexus.mxcd.top/repository/maven-snapshots/</url>
                </pluginRepository>
            </pluginRepositories>
        </profile>

        <profile>
            <id>aliyun</id>
            <repositories>
                <repository>
                    <id>central</id>
                    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
                </repository>
            </repositories>
            <pluginRepositories>
                <pluginRepository>
                    <id>central</id>
                    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
                </pluginRepository>
            </pluginRepositories>
        </profile>
    </profiles>

    <activeProfiles>
        <activeProfile>nexus</activeProfile>
    </activeProfiles>
</settings>

行为总结

具体操作示例

假设你希望从 Nexus 私库下载依赖,但如果私库中没有找到依赖再从阿里云镜像下载,确保你没有在命令行中指定 profile,则 nexus profile 会被自动激活,行为如下:

bash 复制代码
sh
mvn clean install
  1. 查询 Nexus 私库:首先查询 http://nexus.mxcd.top/repository/maven-releases/http://nexus.mxcd.top/repository/maven-snapshots/。
  2. 查询阿里云镜像:如果私库中没有找到依赖,查询 http://maven.aliyun.com/nexus/content/groups/public。

这样配置可以保证在不同的构建场景下灵活选择依赖下载的源,同时提高构建过程中的效率和稳定性。

相关推荐
名字还没想好☜26 分钟前
Go 的 time.After 在 select 循环里内存泄漏:定时器堆积原理与 timer.Reset 正确姿势
java·数据库·golang·go·goroutine
圆山猫42 分钟前
[Virtualization](三):RISC-V H-extension 与 Guest 执行模式
android·java·risc-v
caishenzhibiao1 小时前
期货先行者主图 同花顺期货通指标
java·c语言·c#
史呆芬1 小时前
分布式事务实战:微服务跨服务数据一致性解决方案
java·后端·spring cloud
IT界的老黄牛1 小时前
限流命中后该怎么办:直接丢、阻塞等待、延迟重投三种姿势的取舍
java·rocketmq·redisson·令牌桶·削峰·分布式限流
daad7772 小时前
记录matlab状态机demo
java·网络·matlab
牡丹雅忻13 小时前
AES 加密模式演进:从 ECB、CBC 到 GCM 的 C# 深度实践
java·开发语言·c#
学者猫头鹰3 小时前
Java 8 核心新特性
java
冰心孤城3 小时前
Excel: xls与xlsx格式转换排坑指南
java·前端·excel
自强的小白3 小时前
maven高级(聚合和私服)以及私服的上传和下载
java·maven