Maven
Maven是一个Java项目管理和构建工具,作用:定义(规范)项目结构、项目依赖、使用统一的方式自动化构建(clean、compile)。
提供了一套依赖管理机制:利用仓库统一管理jar包,利用依赖传递的特性解决jar包版本冲突问题。
总结
核心 | 掌握目标 |
---|---|
安装 | maven安装、环境变量、maven配置文件修改 |
工程创建 | gav属性理解、IDEA创建工程、项目结构 |
依赖管理 | 依赖添加、依赖传递、版本提取、导入依赖错误解决 |
构建管理 | 构建过程、构建场景、构建周期 |
继承和聚合 | 理解继承和聚合的作用和配置 |
- 所有依赖在父maven项目中管理,子maven无需使用版本;
- 可选依赖放入;
- 所有依赖的版本号通过管理;
- 管理所有子模块;
Maven配置文件
需要修改的地方如下:
xml
<!-- jar包下载本地地址 -->
<localRepository>D:\data\maven-repository</localRepository>
<!-- jar包下载仓库 -->
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
<mirror>
<id>huaweicloud</id>
<mirrorOf>*</mirrorOf>
<name>huawei Cloud</name>
<url>https://repo.huaweicloud.com/repository/maven/</url>
</mirror>
<mirror>
<id>central</id>
<mirrorOf>central</mirrorOf>
<name>Maven Repository Switchboard</name>
<url>https://repo2.maven.org/maven2/</url>
</mirror>
</mirrors>
约定大于配置
pom.xml详解
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.lywtimer</groupId>
<artifactId>j-pure</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 设置打包方式 默认jar,常用war,pom -->
<packaging>pom</packaging>
<modules>
<module>backend</module>
<module>demo</module>
</modules>
<!--
通常去设置依赖的版本
好处:统一管理版本;多个jar包使用同一个版本时,简化配置
${junit.jupiter.version}
-->
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<com.mysql.version>8.3.0</com.mysql.version>
<org.junit.jupiter.version>5.10.2</org.junit.jupiter.version>
</properties>
<!--
通过一个坐标信息去引用jar包
去 https://mvnrepository.com/ 中央仓库找
需要确认到本地仓库,如果出现异常问题可以删掉,重新下载。 D:\data\maven-repository\org\junit\jupiter\junit-jupiter-api\5.10.2
-->
<!-- 对子工程必须要的依赖,放在这里 -->
<dependencies>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>${com.mysql.version}</version>
</dependency>
</dependencies>
<!--
对子工程不是必须要的依赖,放在这里
虽然子工程还需要做一次依赖,但可以做版本控制
-->
<dependencyManagement>
<dependencies>
<!--
引用本地的项目,需要 install
-->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${org.junit.jupiter.version}</version>
<!--
手动排除依赖
-->
<exclusions>
<!-- <exclusion>-->
<!-- <groupId>com.mysql</groupId>-->
<!-- <artifactId>mysql-connector-j</artifactId>-->
<!-- </exclusion>-->
</exclusions>
<!--
依赖范围
编译(main/java)
测试(main/test)
运行/打包(包含在打的包中)
test 编译× 测试√ 打包× junit
provided 编译√ 测试√ 打包× servlet
compile 编译√ 测试√ 打包√ 默认
runtime 编译× 测试√ 打包√ 反射、数据库驱动
system = provided 不会依赖仓库中的jar包,结合<systemPath>使用,已经废弃
1.首先 依赖范围建议,哪怕所有的范围都设置compile,也不影响正常使用
2.中央仓库会提供scope,IDEA有自动补全功能
3.大多数包都是compile
-->
<!--作用访问是 test、provided 就不会传递-->
<scope>test</scope>
<!--是否传递 默认是false,会传递-->
<optional>false</optional>
</dependency>
</dependencies>
</dependencyManagement>
</project>
生命周期
生命周期会依次执行 clean validate compile test package verify install
Test* 的类会在 test 执行的时候被扫描
install:会下载到本地仓库
依赖传递的配置
shell
#被依赖项目的pom.xml
<groupId>com.mszlu</groupId>
<artifactId>trans</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
<!--作用访问是 test、provided 就不会传递-->
<scope>compile</scope>
<!--是否传递 默认是false,会传递-->
<optional>true</optional>
</dependency>
</dependencies>
#依赖项目的pom.xml
<dependencies>
<!--
引用本地的项目,需要 install
-->
<dependency>
<groupId>com.mszlu</groupId>
<artifactId>trans</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
#如果被依赖项目无法处理,通过两种方式可以解除依赖
#引入不一致版本的依赖(覆盖)
#使用exclusion手动排除
创建聚合工程
右键父工程目录 → New → Module → Parent选 None
xml
<!-- 父工程聚合子工程 pom.xml -->
<modules>
<module>backend</module>
<module>demo</module>
</modules>
<!-- 两个子工程依赖后,依赖就会传递 -->
<!-- 在父工程中的生命周期方法会在所有管理的模块依次执行 -->
Maven继承
聚合工程的另外一种体现,把依赖统一到父工程中。
xml
<!-- 修改子工程的 pom.xml -->
<parent>
<groupId>org.example</groupId>
<artifactId>j-pure</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<!-- 手动删除重复的配置 -->
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>