Maven
Maven是一个Java项目管理和构建工具,作用:定义(规范)项目结构、项目依赖、使用统一的方式自动化构建(clean、compile)。
提供了一套依赖管理机制:利用仓库统一管理jar包,利用依赖传递的特性解决jar包版本冲突问题。
视频教程
总结
核心 | 掌握目标 |
---|---|
安装 | maven安装、环境变量、maven配置文件修改 |
工程创建 | gav属性理解、IDEA创建工程、项目结构 |
依赖管理 | 依赖添加、依赖传递、版本提取、导入依赖错误解决 |
构建管理 | 构建过程、构建场景、构建周期 |
继承和聚合 | 理解继承和聚合的作用和配置 |
Maven配置文件
需要修改的地方如下:
<!-- 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 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 编译× 测试√ 打包× junitprovided 编译√ 测试√ 打包× servletcompile 编译√ 测试√ 打包√ 默认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 installTest* 的类会在 test 执行的时候被扫描install:会下载到本地仓库
依赖传递的配置
#被依赖项目的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
<!-- 父工程聚合子工程 pom.xml --><modules><module>backend</module><module>demo</module></modules><!-- 两个子工程依赖后,依赖就会传递 -->
<!-- 在父工程中的生命周期方法会在所有管理的模块依次执行 -->
Maven继承
聚合工程的另外一种体现,把依赖统一到父工程中。
<!-- 修改子工程的 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>