Maven 从 0 到 1:安装、配置与依赖管理一站式指南

  • Maven 从 0 到 1:安装、配置与依赖管理一站式指南
    • 一、Maven 是什么?
    • 二、核心概念:POM
    • 三、Maven 是如何工作的?—— 仓库机制
    • 四、安装Maven
    • 五、在 IntelliJ IDEA 里配置Maven
    • 六、解析 Maven 坐标
      • 6.1 Maven 坐标的核心组成部分
      • 6.2 一个具体的例子
      • 6.3其他重要概念
      • 6.4总结
    • 七、Maven 依赖配置超简三步走
      • 第 1 步:找到依赖项信息
      • 第 2 步:将依赖项添加到 pom.xml
      • 第 3 步:排除依赖
    • 八、Maven 生命周期核心讲解
      • 1. 三大生命周期 (Lifecycle)
      • 2. 生命周期阶段 (Phase)
      • 3. 在IDEA里面使用Maven命令
      • 4. 在终端里使用Maven命令

Maven 从 0 到 1:安装、配置与依赖管理一站式指南

你是否曾经在开始一个 Java 项目时,面对一堆需要下载的 .jar 包感到头疼?是否因为项目结构混乱,导致团队协作困难?别担心,Maven 就是来解决这些问题的!

这篇文章将用最通俗易懂的方式,带你从零开始认识 Maven。


一、Maven 是什么?

简单来说,Maven 是一个项目管理和构建工具

你可以把它想象成一个非常智能、全能的项目助理。你只需要告诉它你的项目需要什么(比如需要 Spring 框架版本 5.x,需要 JUnit 来测试),它就会自动帮你:

  1. 下载和管理这些依赖的库(.jar 包)。
  2. 编译你的源代码。
  3. 运行测试用例。
  4. 打包你的项目(打成 .jar.war 文件)。
  5. 部署你的项目。

它的核心思想是 “约定优于配置” 。这意味着 Maven 已经为你规定好了一个标准的项目目录结构。只要你按照这个结构来放置文件,Maven 就知道该去哪里找源代码、资源文件等,你就不需要再写一大堆配置去告诉它了。


二、核心概念:POM

Maven 的所有行为都围绕一个核心文件展开:pom.xml

POM 的全称是 Project Object Model(项目对象模型)。它就像是你这个项目的“身份证”和“说明书”,存放在你项目的根目录下。

在这个 pom.xml 文件里,你定义了关于你项目的所有重要信息,Maven 正是通过读取这个文件才知道该如何工作的。

一个最基本的 pom.xml 长这样:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><!-- 项目坐标:这三个信息唯一标识了你的项目 --><groupId>com.mycompany</groupId>   <!-- 公司或组织名,倒叙域名 --><artifactId>my-first-app</artifactId> <!-- 项目名 --><version>1.0.0-SNAPSHOT</version>     <!-- 版本号 --><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><!-- 依赖列表 --><dependencies><!-- 一个具体的依赖 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope> <!-- 作用域:只在测试时使用 --></dependency></dependencies>
</project>

什么是“坐标”?

  • groupId, artifactId, version 这三个属性组成了 Maven 世界的“坐标”,通过这个坐标,Maven 可以唯一地定位到任何一个第三方库。这也是它能够自动下载依赖的秘诀。

三、Maven 是如何工作的?—— 仓库机制

Maven 通过仓库来统一管理所有依赖。

  1. 本地仓库:在你个人电脑上的一个文件夹。Maven 会先把所有下载好的 jar 包放在这里。默认路径是 ~/.m2/repository
  2. 中央仓库:由 Maven 社区维护的全球唯一仓库。当你声明了一个依赖后,Maven 会首先在本地仓库查找,如果找不到,就会自动去中央仓库下载到你本地。
  3. 私服:一些大公司会在内部搭建的私有仓库服务器,作为中央仓库的镜像,目的是节省带宽和加速构建。

这个过程完全是自动的,你只需要在 pom.xml 中声明 “我需要什么”,而不需要手动搜索、下载、添加。这极大地解决了依赖管理带来的混乱。

在这里插入图片描述


四、安装Maven

Maven官网下载地址:https://maven.apache.org/download.cgi

在这里插入图片描述

下载好了之后将压缩包解压在没有中文路径的地方。

  1. 配置一个本地仓库(新建一个名为mvn_repo的文件夹)
    我此处的路径为:D:\apache-maven-3.9.11\mvn_repo
  2. 修改配置文件,用记事本打开"D:\apache-maven-3.9.11\conf\settings.xml"
    在这里插入图片描述
    添加这串代码
  <localRepository>D:\apache-maven-3.9.11\mvn_repo</localRepository>
  1. 将镜像替换为阿里云镜像
    <mirror><id>alimaven</id><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url><mirrorOf>central</mirrorOf></mirror>

在这里插入图片描述

  1. 在系统变量里面添加%MAVEN_HOME%目录选择D:\apache-maven-3.9.11
  2. 在path里面新建一个%MAVEN_HOME%\bin
  3. 在cmd里面输入mvn -v在这里插入图片描述
    若出现这个则说明安装完成

五、在 IntelliJ IDEA 里配置Maven

首先打开 IntelliJ IDEA 的设置(记得先关闭当前项目,在全局设置里面调,不然调的是项目的设置

  1. 构建、执行、部署里找到构建工具——>Maven
    更改主路径和用户设置文件
    在这里插入图片描述

  2. 在 Maven的下面的【运行程序】里面添加当前你的JRE版本
    在这里插入图片描述

  3. 检查Java编译器,项目字节码版本应该与语言级别相同
    在这里插入图片描述

  4. 创建一个新项目,在项目结构里面检查一下
    在这里插入图片描述
    ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/32a438758903401ca53b7b5fc2fc40b7.png

  5. 运行成功就说明配置好了在这里插入图片描述


六、解析 Maven 坐标

Maven 坐标是 Maven 的核心概念,它就像是一个物件的唯一身份证,通过一组标识来精确定位和管理项目所依赖的任何一个构件(Jar 包、War 包等)。

6.1 Maven 坐标的核心组成部分

一个完整的 Maven 坐标主要由以下 5 个基本元素组成,其中前三个是必选的,后两个是可选的。

元素说明是否必须举例
groupId组织/公司标识。通常使用反向域名规则,如公司域名倒序。它定义了项目所属的组织或集团,下辖多个 artifactId必须org.springframework.boot, com.google.guava
artifactId项目/模块标识。代表该组织下的一个具体项目或模块。生成的构件的名称会基于这个 artifactId必须spring-boot-starter-web, guava
version版本号。指定项目的当前版本。必须2.7.3, 31.1-jre
packaging打包方式。指定项目构建后生成的构件类型。如果未指定,默认为 jar可选jar, war, pom, maven-plugin, ear
classifier分类器。用于区分从相同 POM 但内容不同的构件。例如,javadocsources 构件。可选sources(源码包), javadoc(文档包), jdk8(针对JDK 8的版本)

6.2 一个具体的例子

我们来看一个非常常见的 Maven 依赖声明,它来自 pom.xml 文件中<dependencies> 部分:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.7.3</version></dependency>

解析这个坐标:

  1. groupId: org.springframework.boot

    • 这告诉我们,这个依赖是由 Spring Boot 这个组织(项目)维护的。所有 Spring Boot 官方提供的构件都以这个开头。
  2. artifactId: spring-boot-starter-web

    • 这是 Spring Boot 组织下的一个具体模块,名为 spring-boot-starter-web。从名字就能看出,它是用于支持 Web 应用开发的起步依赖。
  3. version: 2.7.3

    • 这个 Web 起步依赖的具体版本是 2.7.3。Maven 会根据这个版本号去仓库里寻找对应的 jar 文件。
  4. packaging: jar (默认值,未显式写出)

    • 这个依赖最终被打包成一个 Jar 文件,例如 spring-boot-starter-web-2.7.3.jar

最终,Maven 会根据这个坐标,在本地仓库或远程中央仓库中寻找名为:
org/springframework/boot/spring-boot-starter-web/2.7.3/spring-boot-starter-web-2.7.3.jar
的文件。


6.3其他重要概念

  • 坐标的唯一性groupId + artifactId + version + packaging + classifier 这五个元素组合起来,构成了一个全球唯一的标识。世界上不会有两个构件拥有完全相同的这组坐标。

  • SNAPSHOT 版本:版本号中如果带有 -SNAPSHOT(例如 1.0.0-SNAPSHOT),表示这是一个快照版本,通常处于开发阶段。Maven 会优先去远程仓库检查是否有更新的快照版本,这对于团队协作开发非常有用。

  • 版本范围:你可以指定一个版本范围而不是固定版本(如 [1.2.0,)),但不推荐使用,因为它会导致构建的不确定性。

  • <scope>:虽然不属于坐标本身,但常与坐标一同使用。它定义了依赖的作用范围(如 compile, test, provided, runtime),决定了依赖在项目生命周期哪个阶段可用。

6.4总结

Maven 坐标是一个简单而强大的寻址系统。理解它的每个部分意味着:

  • 当你需要添加一个依赖时,你知道如何去网上(如 Maven Central Repository)查找正确的 groupId, artifactIdversion
  • 当你看到一段依赖配置时,你能立刻明白它引用的是哪个组织的哪个项目的哪个版本。
  • 当出现依赖冲突时,你能根据坐标信息快速定位问题来源。

七、Maven 依赖配置超简三步走

第 1 步:找到依赖项信息

当你想要在项目中使用某个第三方库时,你需要知道它的 ​​坐标(Coordinates)​​,即三个信息:

  1. groupId​​: 通常代表组织或项目组。

  2. ​​artifactId​​: 代表项目中的具体库名。

  3. ​​version​​: 库的版本号。

​​如何找到这些信息?​​

最直接的方法是去 Maven 中央仓库https://mvnrepository.com/搜索。

  1. 打开网站,在搜索框输入你想要的库名,例如 Spring Context。

  2. 选择一个稳定且常用的版本(版本号后面有 Usage柱状图的那个),点击进去。
    在这里插入图片描述3. 页面中会直接给出它的 Maven 配置代码,复制即可。
    在这里插入图片描述

第 2 步:将依赖项添加到 pom.xml

在你的 Maven 项目根目录下,有一个最重要的文件叫 pom.xml。打开它,找到 <dependencies>标签。​​所有的依赖项都要放在这个标签里面​​。如果还没有这个标签,就在 <project>标签内,自己创建它。把你从中央仓库复制的代码,粘贴到 <dependencies>内部。

​​示例:​​
假设我们找到了 Jackson Databind版本 2.15.2,那么你的 pom.xml看起来应该是这样的:

在这里插入图片描述

点击刷新,看到maven这栏依赖项里面有就说明配置好了
在这里插入图片描述

第 3 步:排除依赖

如果需要某个依赖,但想​​排除它带来的特定子依赖​​,使用 <exclusions>标签:

    <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>6.2.7</version><exclusions><!-- 排除不需要的子依赖 --><exclusion><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId></exclusion><exclusion><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId></exclusion></exclusions></dependency></dependencies>

再次刷新过后可以发现依赖项已经被删除了在这里插入图片描述


八、Maven 生命周期核心讲解

Maven 的生命周期被设计得非常完善和有序,它包含了项目构建的所有环节。其核心思想是:生命周期由多个阶段(Phase)组成,每个阶段负责一个特定的任务,并且这些阶段是按顺序执行的。

1. 三大生命周期 (Lifecycle)

Maven 拥有三套相互独立的生命周期:

  • clean:清理生命周期,负责清除上次构建生成的文件(比如删除 target 目录)。
  • default (或 build):构建生命周期,这是最核心的部分,负责编译、测试、打包、部署等整个构建过程。
  • site:站点生命周期,负责生成项目报告、站点文档等。

2. 生命周期阶段 (Phase)

每个生命周期都由一系列按顺序排列的阶段构成。执行某个阶段,会自动执行它之前的所有阶段。

以最重要的 default(构建)生命周期为例,其关键阶段包括(按顺序):

  1. validate:验证项目是否正确且所有必要信息可用。
  2. compile:编译项目的源代码。
  3. test:使用单元测试框架(如 JUnit)运行测试。此阶段不会要求打包或部署代码。
  4. package:将编译后的代码打包成可分发格式,如 JAR、WAR 包。
  5. verify:对集成测试结果进行检查,以确保满足质量要求。
  6. install:将打包好的软件包安装到本地仓库,以便其他本地项目依赖使用。
  7. deploy:在构建环境中完成,将最终的软件包复制到远程仓库,以便其他开发者和项目共享。

3. 在IDEA里面使用Maven命令

以下面的pom.xml为例

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>Maven2</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>21</maven.compiler.source><maven.compiler.target>21</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><!-- https://mvnrepository.com/artifact/org.springframework/spring-context --><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>6.2.7</version><exclusions><!-- 排除不需要的子依赖 --><exclusion><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId></exclusion><exclusion><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId></exclusion></exclusions></dependency></dependencies>
</project>

在IDEA右侧的Lifestyle里面双击即可执行
在这里插入图片描述
以下是执行完package之后的场景,会在target里面生成一个jar包

在这里插入图片描述
运行完install之后可以在我们本地仓库里面找到安装好的jar包

此时我的 路径为D:\apache-maven-3.9.11\mvn_repo\org\example\Maven2\1.0-SNAPSHOT

<groupId>org.example</groupId>这行代码里面的org.example就是我们在本地仓库里面需要找的路径

在这里插入图片描述

4. 在终端里使用Maven命令

项目编译与打包

命令说明
mvn compile编译源代码,生成 .class 文件到 target/classes 目录
mvn test运行测试用例(会先自动执行 compile
mvn package打包项目(会先执行 test),生成 JAR/WAR 包到 target/ 目录
mvn install安装到本地仓库(会先执行 package),以便其他本地项目引用
mvn clean清理项目,删除 target 目录
mvn clean install最常用组合:先清理再安装,确保是全新构建

跳过测试相关

命令说明
mvn install -DskipTests跳过测试,但会编译测试代码
mvn install -Dmaven.test.skip=true完全跳过测试,不编译也不执行测试

依赖管理

命令说明
mvn dependency:tree显示依赖树,查看所有传递性依赖,排查 Jar 包冲突神器
mvn dependency:resolve解析依赖,下载所有依赖包
mvn dependency:purge-local-repository清理本地仓库中当前项目的依赖缓存(慎用)

其他实用命令

命令说明
mvn help:effective-pom查看有效 POM,显示所有默认配置与自定义配置合并后的最终结果
mvn --versionmvn -v查看 Maven 版本信息
mvn <phase> -h--help获取帮助,例如 mvn install -h

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/95913.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/95913.shtml
英文地址,请注明出处:http://en.pswp.cn/web/95913.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s,v1.30.4,安装使用docker

一.前置概念Docker 与 Kubernetes 共用同一个 containerd 进程 时&#xff0c;只要满足以下 3 个条件&#xff0c;就不会冲突&#xff1a;检查点要求原因cgroup-driverkubelet 与 containerd 必须同为 systemd二者不一致会导致 Pod 无法调度Unix socketkubelet 指向 /run/conta…

开源AI智能名片链动2+1模式S2B2C商城小程序服务提升复购率和转介绍率的研究

摘要&#xff1a;本文聚焦于开源AI智能名片链动21模式S2B2C商城小程序在提升客户复购率和转介绍率方面的作用。服务对于促进客户复购和转介绍的重要性不言而喻&#xff0c;维护老客户的成本远低于开发新客户&#xff0c;微商通过推出各项服务来赢得客户忠诚。本文深入探讨开源A…

[数据结构] ArrayList(顺序表)与LinkedList(链表)

目录 1.List 1.1 什么是List 1.2 常用的方法 1.3 List的使用 2. 线性表 3. ArrayList 类(顺序表) 3.1 顺序表定义 3.2 ArrayList链表的功能模拟实现 3.3 ArrayList简介 3.4 ArrayList的构造方法 3.5 ArrayList的遍历 3.5 ArrayList的具体使用实例 3.5.1 杨辉三角 …

Hive使用Tez引擎出现OOM的解决方法

环境是Hive以Tez作为引擎&#xff0c;然后使用客户端&#xff08;比如DataGrip&#xff09;连接Hive运行SQL查询&#xff0c;运行过程中报错信息如下&#xff1a;java.lang.OutOfMemoryError: Java heap space…连接工具以DataGrip为例&#xff0c;解决办法如下&#xff1a; --…

SQL面试题及详细答案150道(81-100) --- 子查询篇

《前后端面试题》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,MySQL,Linux… 。 前后端面试题-专栏总目录 文章目录 一、本文面试题目录 81. 什么是子查询?子查…

笔记:ubuntu安装matlab

记录一下ubuntu安装matlab的过程 一、进入桌面 虽然系统是ubuntu server&#xff0c;但是安装matlab最好还是有桌面。这里使用todesk等工具&#xff0c;进入桌面进行远程安装。 二、创建matlab账号 由于学校已经提供了matlab的账号&#xff0c;只需要用自己的学生邮箱进行注册即…

CentOS 7 编译安装 OpenSSL 3.4.2

CentOS 7默认已经安装了OpenSSL&#xff0c;不过版本比较低 openssl version结果为&#xff1a;OpenSSL 1.0.2k-fips 26 Jan 2017 已经无法满足需求 OpenSSL 源码下载链接&#xff1a;https://www.openssl-library.org/source/ 下载源码包为&#xff1a;https://github.com…

python advance -----object-oriented

alt shift 上下键&#xff0c;行代码上下移动0

具身智能的工程落地:视频-控制闭环的实践路径

引言&#xff1a;从“能算会说”到“会看能做” 具身智能真正的门槛&#xff0c;不在于把模型做得更大&#xff0c;而在于把感知—决策—执行焊成一条低时延、稳态可控的闭环工程链路&#xff1a;从相机/麦克风采集&#xff0c;到编解码与传输&#xff0c;再到边/端推理、指令…

STM32 - Embedded IDE - GCC - 如何在工程中定义一段 NoInit RAM 内存

导言如上所示&#xff0c;Keil创建一段NoInit内存同样是通过图形界面来完成&#xff0c;IRAM2的起始地址0x2000000&#xff0c;大小8bytes。NoInit的意思是程序初始化时&#xff0c;不会将内存清0初始化。如上所示&#xff0c;在MEMORY段&#xff0c;将64K的RAM内存划一块8byte…

MyBatisX代码生成插件在IDEA中的安装配置、连接数据库表生成代码快速开发示例

场景 MyBatisX插件介绍 MybatisX是一款基于IDEA的快速开发插件&#xff0c;由MyBatis-Plus团队开发维护&#xff0c;为效率而生。 它的主要功能如下&#xff1a; 支持mapper.xml和Mapper接口之间方法的互相导航跳转&#xff1b; 内置代码生成器&#xff0c;通过使用GUI的形…

单词分析与助记之数据建表(以production为例)

单词分析与助记数据建表&#xff08;以production为例&#xff09;&#xff1a; id&#xff08;流水号&#xff09;&#xff1a;词形&#xff1a;production配图1-标题&#xff1a;略配图1-地址&#xff1a;略配图2-标题&#xff1a;略配图2-地址&#xff1a;略配图3-标题&…

AI助力决策:告别生活与工作中的纠结,明析抉择引领明智选择

在日常生活与工作中&#xff0c;我们时常会面临各种纠结的决策。从选择一份新工作、创业方向&#xff0c;到决定是否要搬家、换车&#xff0c;每一个决策都可能对我们的未来产生深远影响。然而&#xff0c;面对复杂多变的信息和不确定的未来&#xff0c;如何做出明智的选择成为…

--定位--

GPSRTK GPS组成 GPS分为三部分。 空间星座部分&#xff1a;由至少24颗卫星组成&#xff08;目前有30多颗在轨运行&#xff09;&#xff0c;分布在6个中地球轨道上。保证全球任何地方、任何时间至少能接收到4颗以上的卫星信号。每颗卫星不断播发一种包含卫星星历​&#xff0…

音转文模型对比FunASR与Faster_whisper

FunASR简介 FunASR是由阿里巴巴达摩院开源的语音识别工具包&#xff0c;提供包括语音识别&#xff08;ASR&#xff09;、语音活动检测&#xff08;VAD&#xff09;、标点恢复、语言模型、说话人验证、说话人分离及多说话人ASR等多种功能。FunASR工具包支持工业级语音识别模型的…

uniapp阿里云验证码使用

在 UniApp 中使用阿里云验证码插件&#xff08;aliyun-captcha&#xff09;需要完成微信小程序端的插件配置和项目内的组件使用两个主要步骤&#xff0c;以下是详细流程&#xff1a; 一、微信公众平台配置插件&#xff08;必须&#xff09; 获取插件 AppID 阿里云验证码插件的…

基于开源AI大模型AI智能名片S2B2C商城小程序的情感营销策略研究

摘要&#xff1a;本文聚焦于开源AI大模型AI智能名片S2B2C商城小程序这一新兴商业工具&#xff0c;探讨情感在其营销中的核心地位。情感在营销里是需突出表现的关键要素&#xff0c;价值观与极致化生活方式均是对情感的阐释。在开源AI大模型AI智能名片S2B2C商城小程序的背景下&a…

警惕!你和ChatGPT的对话,可能正在制造分布式妄想

2021年圣诞节&#xff0c;19岁的英籍印度裔男子 贾斯旺辛格柴尔 &#xff08;Jaswant Singh Chail&#xff09;带着一把十字弩闯入温莎城堡&#xff0c;声称要 刺杀英国女王 &#xff0c;为英国历史上的暴行复仇。 这场荒谬的刺杀注定以失败告终。被捕后&#xff0c;他自称是一…

DeepSeek辅助在64位Linux中编译运行32位的asm-xml-1.4程序

在网上搜快速xml解析器时找到一个2012年的asm-xml-1.4程序说是比expat快几倍&#xff0c;有点不信&#xff0c;想编译看看。 下载了源代码, 解压缩到/par&#xff0c;其中obj目录下有预编译好的.o文件。 然后运行如下命令编译示例&#xff0c;出错了 cd /par/asm-xml-1.4/exa…

STM32CubeProgrammer软件安装

STM32CubeProgrammer软件安装 下载地址 【英文界面】STM32CubeProg | Software - STMicroelectronics 【中文界面】STM32CubeProg | Software - 意法半导体STMicroelectronics 下载 点击获取最新版本下载安装包登录ST账号进行下载当Edge浏览器下载失败时, 换个浏览器下载下…