[目录]
结合实例看 maven 传递依赖与优先级
Maven 安装与配置
Maven POM
Maven 工程结构和内容被定义在一个 xml 文件中 - pom.xml
,是 Project Object Model (POM) 的简称,此文件是整个 Maven 系统的基础组件。
所有 POM 文件都需要 project 元素和三个必需字段:groupId
,artifactId
,version
。
节点 | 描述 |
---|---|
project | 工程的根标签。 |
modelVersion | 模型版本需要设置为 4.0 |
groupId | 这是工程组的标识。它在一个组织或者项目中通常是唯一的。例如,一个银行组织 com.companyname.project-group 拥有所有的和银行相关的项目。 |
artifactId | 这是工程的标识。它通常是工程的名称。例如,消费者银行。groupId 和 artifactId 一起定义了 artifact 在仓库中的位置。 |
version | 这是工程的版本号。在 artifact 的仓库中,它用来区分不同的版本。例如: com.company.bank:consumer-banking:1.0 , com.company.bank:consumer-banking:1.1 |
例子:
<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>
<!-- 公司或者组织的唯一标志,并且配置时生成的路径也是由此生成, 如com.companyname.project-group,maven会将该项目打成的jar包放本地路径:/com/companyname/project-group -->
<groupId>com.companyname.project-group</groupId>
<!-- 项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 -->
<artifactId>project</artifactId>
<!-- 版本号 -->
<version>1.0</version>
</project>
父(Super)POM
父(Super)POM是 Maven 默认的 POM。所有的 POM 都继承自一个父 POM(无论是否显式定义了这个父 POM)。父 POM 包含了一些可以被继承的默认设置。因此,当 Maven 发现需要下载 POM 中的 依赖时,它会到 Super POM 中配置的默认仓库 http://repo1.maven.org/maven2 去下载。
Maven 使用 effective pom(Super pom 加上工程自己的配置)来执行相关的目标,它帮助开发者在 pom.xml 中做尽可能少的配置,当然这些配置可以被重写。
使用以下命令来查看 Super POM 默认配置:
mvn help:effective-pom
Maven 构建配置文件
构建配置文件是一系列的配置项的值,可以用来设置或者覆盖 Maven 构建默认值。使用构建配置文件,你可以为不同的环境,比如说生产环境(Producation)和开发(Development)环境,定制构建方式。
配置文件在 pom.xml 文件中使用 activeProfiles 或者 profiles 元素指定,并且可以通过各种方式触发。配置文件在构建时修改 POM,并且用来给参数设定不同的目标环境(比如说,开发(Development)、测试(Testing)和生产环境(Producation)中数据库服务器的地址)。
pom.xml 中定义和使用变量
如下
properties
中定义了 mybatisplus.version
在 version
中使用
<properties>
<mybatisplus.version>3.1.0</mybatisplus.version>
</properties>
<dependencies>
<!--MyBatis-Plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>${mybatisplus.version}</version>
</dependency>
</dependencies>
pom.xml 的 parent 引用
Maven 重新导入依赖
先清除缓存
点击 Invalidate and Restart
pom.xml
右键,Maven
-Reimport
或者在右侧 Maven
-Reimport All Maven Project
查看 Maven 依赖
右侧 Maven
-Show Dependencies
解决 jar 包冲突
手动分析
比如项目中应用了下面两个
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>6.0.9</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.3.23</version>
</dependency>
使用 mvn dependency:tree
查看依赖关系或者通过 Maven
-项目
-依赖项
查看依赖关系
这里如果 spring-aop
冲突了,我想排除掉 spring-webmvc
中的 spring-aop
,可以手动修改 pom
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>6.0.9</version>
<exclusions>
<exclusion>
<artifactId>spring-aop</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.3.23</version>
</dependency>
使用插件 Maven Helper
Plugin
中搜索 Maven Helper
安装,重启就可以使用了。
Maven Helper 使用方式:安装成功以后,打开 pom 文件,黄色箭头中内容 Dependency Analyzer
出现就是安装成功。
切换到依赖分析面板 Dependency Analyzer
,然后搜索冲突的 jar,这里我搜索 eureka
在 All Dependencies as Tree
界面就可以 Exclude
,很方便的找到冲突的 jar
Exclude
最终也是在对应引用上添加 <exclusion>
来解决冲突
DependencyManagement 和 Dependencies
distributionManagement
<!--
使用分发管理将本项目打成 jar 包,直接上传到指定服务器
用来发布 jar 到 maven 仓库,repoisotry 的 id 需要与 maven 的 setting.xml 保持一致
通过命令 mvn clean package, mvn deploy 发布
-->
<distributionManagement>
<!-- 正式版本 -->
<repository>
<!-- nexus 服务器中用户名:在 setting.xml 中 <server> 的 id -->
<id>internal.releases</id>
<!-- 这个名称自己定义 -->
<name>internal repository for releases</name>
<url>http://localhost/nexus/content/repositories/thirdparty/</url>
</repository>
<!-- 快照 -->
<snapshotRepository>
<id>internal.snapshots</id>
<name>internal repository for snapshots</name>
<url>http://localhost/nexus/content/repositories/thirdparty-snapshots/</url>
</snapshotRepository>
</distributionManagement>