一、Maven介绍
1、Maven介绍
Maven是一款为 Java 项目构建、依赖管理的工具(软件),使用Maven可以自动构建、测试、打包和发布项目,大大提高了开发效率和质量。
2、Maven主要作用理解
①依赖管理:
Maven可以管理项目的依赖,包括自动下载所需依赖库、自动下载依赖需要的依赖并且保证版本没有冲突、依赖版本管理等。
②构建项目:
项目构建是指将源代码、配置文件、资源文件等转化为能够运行或部署的应用程序或库的过程。
当前理解:就是六个指令
清理——>编译———>测试———>打包——>报告——>部署
二、Maven安装和配置
1、安装
2、Maven环境配置
①配置maven_home
②配置path
3 、Maven功能配置
我们需要需改maven/conf/settings.xml配置文件,来修改maven的一些默认配置。我们主要休要修改的有三个配置:
1.依赖本地缓存位置(本地仓库位置)
2.maven下载镜像
3.maven选用编译项目的jdk版本
①配置本地仓库地址
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
<!-- conf/settings.xml 55行 -->
<localRepository>D:\repository</localRepository>
②配置国内阿里镜像
<!--在mirrors节点(标签)下添加中央仓库镜像 160行附近-->
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
③配置jdk17版本项目构建
<!--在profiles节点(标签)下添加jdk编译版本 268行附近-->
<profile>
<id>jdk-17</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>17</jdk>
</activation>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<maven.compiler.compilerVersion>17</maven.compiler.compilerVersion>
</properties>
</profile>
4、idea配置本地Maven软件
三、基于IDEA创建Maven工程
1、梳理Maven工程GAVP属性
- GAVP四大属性
- GroupId:com.公司名.业务线
- ArtifactId:项目名/模块名 shop-user、shop-order
- Version:版本号 默认是1.0-SNAPSHOT
- Packaging:打包方式,jar、war、pom
2、IDEA构建Maven-Java-SE工程
3、IDEA构建Maven-Java-EE工程
- 安装插件JBLJavaToWeb
- 创建一个javasemaven工程
- 右键、使用插件快速补全web项目
4、Maven工程项目结构说明
Maven是一个强大的构建工具,它提供一种标准化的项目结构,可以帮助开发者更容易地管理项目依赖、构建、测试和发布等任务。
|-- pom.xml # Maven 项目管理文件
|-- src
|-- main # 项目主要代码
| |-- java # Java 源代码目录
| | `-- com/example/myapp # 开发者代码主目录
| | |-- controller # 存放 Controller 层代码的目录
| | |-- service # 存放 Service 层代码的目录
| | |-- dao # 存放 DAO 层代码的目录
| | `-- model # 存放数据模型的目录
| |-- resources # 资源目录,存放配置文件、静态资源等
| | |-- log4j.properties # 日志配置文件
| | |-- spring-mybatis.xml # Spring Mybatis 配置文件
| | `-- static # 存放静态资源的目录
| | |-- css # 存放 CSS 文件的目录
| | |-- js # 存放 JavaScript 文件的目录
| | `-- images # 存放图片资源的目录
| `-- webapp # 存放 WEB 相关配置和资源
| |-- WEB-INF # 存放 WEB 应用配置文件
| | |-- web.xml # Web 应用的部署描述文件
| | `-- classes # 存放编译后的 class 文件
| `-- index.html # Web 应用入口页面
`-- test # 项目测试代码
|-- java # 单元测试目录
`-- resources # 测试资源目录
四、基于IDEA进行Maven工程构建
1、构建概念和构建过程
项目构建是指将源代码、依赖库和资源文件等转换成可执行或可部署的应用程序的过程,在这个过程中包括编译源代码、链接依赖库、打包和部署等多个步骤。
自动化构建:
- 清理:清理上次编译后的结果,为下一次编译做准备
- 编译:将java编译成 .class
- 测试:测试主程序代码
- 打包:将项目打包成jar/war包。jar包存储在仓库里。war包部署在服务器上
- 安装:将项目打包后,安装到本地仓库。G+A+V是目录层级,AV是jar包的名字。
- 报告:生成当前工程相关信息。变成index.html
- 部署:将项目打包后,部署在公司服务器上的仓库(私服)。
2、命令方式项目构建
命令 | 描述 |
mvn compile | 编译项目,生成target文件 |
mvn package | 打包项目,生成war文件 |
mvn clean | 清理编译或打包后的项目结构 |
mvn install | 打包后上传到maven本地仓库(本地部署) |
mvn deploy | 只打包,上传到maven私服仓库(私服部署) |
mvn site | 生成站点(报告) |
mvn test | 执行测试代码(测试) |
maven自带打包插件和jdk版本不匹配:pom.xml 添加以下代码即可
<build>
<!-- jdk17 和 war包版本插件不匹配 -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
</plugins>
</build>
3、可视化方式项目构建
4、 Maven生命周期
构建周期作用:会简化构建过程
例如:项目打包 mvn clean package即可。
主要三个构建生命周期:
-
清理周期:主要是对项目编译生成文件进行清理
包含命令:clean
-
默认周期:定义了真正构件时所需要执行的所有步骤,它是生命周期中最核心的部分
包含命令:compile - test - package - install / deploy
-
报告周期
包含命令:site
打包: mvn clean package 本地仓库: mvn clean install
五、基于IDEA进行Maven依赖管理
1、依赖管理概念
Maven 依赖管理是 Maven 软件中最重要的功能之一。 Maven 的依赖管理能够帮助开发人员自动解决软件包依赖问题,使得开发人员能够轻松地将其他开发人员开发的模块或第三方框架集成到自己应用程序或模块中,避免出现版本冲突和依赖缺失等问题。
2、Maven工程核心信息配置和解读(GAVP)
<!-- 模型版本 -->
<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.0</version>
<!--打包方式
默认:jar
jar指的是普通的java项目打包方式! 项目打成jar包!
war指的是web项目打包方式!项目打成war包!
pom不会讲项目打包!这个项目作为父工程,被其他工程聚合或者继承!后面会讲解两个概念
-->
<packaging>jar/pom/war</packaging>
3、 Maven工程依赖管理配置
<!--
通过编写依赖jar包的gav必要属性,引入第三方依赖!
scope属性是可选的,可以指定依赖生效范围!
依赖信息查询方式:
1. maven仓库信息官网 https://mvnrepository.com/
2. mavensearch插件搜索
-->
<dependencies>
<!-- 引入具体的依赖包 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
<!--
生效范围
- compile :main目录 test目录 运行打包 [默认]
- provided:main目录 test目录 Servlet
- runtime: 打包运行 MySQL
- test: test目录 junit
-->
<scope>runtime</scope>
</dependency>
</dependencies>
版本统一提取和维护
<!--声明版本-->
<properties>
<!--命名随便,内部制定版本号即可!-->
<junit.version>4.11</junit.version>
<!-- 也可以通过 maven规定的固定的key,配置maven的参数!如下配置编码格式!-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<!--引用properties声明版本 -->
<version>${junit.version}</version>
</dependency>
</dependencies>
六、Maven依赖传递和依赖冲突
1、Maven依赖传递特性
概念:
假如有Maven项目A,项目B依赖A,项目C依赖B。那么我们可以说C依赖A。也就是说,依赖关系为:C——>B——>A,那么我们执行项目C时,会自动把B、A都下载导入到C项目的jar包文件中,这就是依赖的传递性。
传递原则:在A依赖B,B依赖C的前提下,C是否能够传递到A,取决于B依赖C时使用的依赖范围。
- B依赖C时使用compile范围:可以传递
- B依赖C时使用test或provided范围:不能传递,所以需要这样的jar包时,就必须在需要的地方明确配置依赖才可以。
当我导入spring-context,Maven自动给我导入spring-aop、spring-beans、spring-core、spring-expression这几个依赖jar包。
2、Maven依赖冲突特性
当直接引用或者间接引用出现了相同的jar包!这时呢,一个项目就会出现相同的重复jar包,这就算作冲突!依赖冲突避免出现重复依赖,并且终止依赖传递!
解决依赖冲突(如何选择重复依赖)方式:
1)自动选择原则
-
短路优先原则(第一原则)
A—>B—>C—>D—>E—>X(version 0.0.1)
A—>F—>X(version 0.0.2)
则A依赖于X(version 0.0.2)。
-
依赖路径长度相同情况下,则“先声明优先”(第二原则)
A—>E—>X(version 0.0.1)
A—>F—>X(version 0.0.2)
在<depencies></depencies>中,先声明的,路径相同,会优先选择
2)手动排除
<dependency>
<groupId>com.atguigu.maven</groupId>
<artifactId>pro01-maven-java</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
<!-- 使用excludes标签配置依赖的排除 -->
<exclusions>
<!-- 在exclude标签中配置一个具体的排除 -->
<exclusion>
<!-- 指定要排除的依赖的坐标(不需要写version) -->
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
七、Maven工程继承和聚关系
1、Maven工程继承关系
1)继承概念
继承概念:Maven继承指在Maven的项目中,让一个项目从另一个项目中继承配置信息的机制。继承可以让我们在多个项目中共享同一配置信息,简化项目的管理和维护工作。
2)继承作用
在父工程中统一管理项目中的依赖信息。
对于一个比较大型的项目进行了模块拆分,一个 project 下面,创建了很多个 module,每一个 module 都需要配置自己的依赖信息。
它们背后的需求:多个模块要使用同一个框架,它们应该时同一个版本,项目中使用的框架版本需要统一管理。使用框架时所需要的 jar 包组合(或者说依赖信息组合)需要经过长期摸索和反复调试,最终确定一个可用组合。这个耗费很大精力总结出来的方案不应该在新的项目中重新摸索。通过父工程中为整个项目维护依赖信息的组合既保证了整个项目使用规范、准确的 jar 包;又能够将以往的经验沉淀下来,节约时间和精力。
3)继承语法
父工程
<groupId>com.atguigu.maven</groupId>
<artifactId>pro03-maven-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 当前工程作为父工程,它要去管理子工程,所以打包方式必须是 pom -->
<packaging>pom</packaging>
子工程
<!-- 使用parent标签指定当前工程的父工程 -->
<parent>
<!-- 父工程的坐标 -->
<groupId>com.atguigu.maven</groupId>
<artifactId>pro03-maven-parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<!-- 子工程的坐标 -->
<!-- 如果子工程坐标中的groupId和version与父工程一致,那么可以省略 -->
<!-- <groupId>com.atguigu.maven</groupId> -->
<artifactId>pro04-maven-module</artifactId>
<!-- <version>1.0-SNAPSHOT</version> -->
4)父工程依赖统一管理
父工程声明版本
<!-- 使用dependencyManagement标签配置对依赖的管理 -->
<!-- 被管理的依赖并没有真正被引入到工程 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
...
</dependencies>
</dependencyManagement>
子工程引用版本
<!-- 子工程引用父工程中的依赖信息时,可以把版本号去掉。 -->
<!-- 把版本号去掉就表示子工程中这个依赖的版本由父工程决定。 -->
<!-- 具体来说是由父工程的dependencyManagement来决定。 -->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
...
</dependencies>
2、 Maven工程聚合关系
1)聚合概念
Maven 聚合是指将多个项目组织到一个父级项目中,以便一起构建和管理的机制。聚合可以帮助我们更好地管理一组相关的子项目,同时简化它们的构建和部署过程。
2)聚合作用
①管理多个子项目:通过聚合,可以将多个子项目组织在一起,方便管理和维护。
②构建和发布一组相关项目:通过聚合,可以在一个命令中构建和发布多个相关的项目,简化了部署和维护工作。
③优化构建顺序:通过聚合,可以对多个项目进行顺序控制,避免出现构建依赖混乱导致构建失败的情况。
④统一管理依赖项:通过聚合,可以在父项目中管理公共依赖项和插件,避免重复定义。
3)聚合语法
父项目中包含子项目列表
<project>
<groupId>com.example</groupId>
<artifactId>parent-project</artifactId>
<packaging>pom</packaging>
<version>1.0.0</version>
<modules>
<module>child-project1</module>
<module>child-project2</module>
</modules>
</project>
八、了解Maven仓库之间的关系和优先级
Maven 仓库主要分为本地仓库、中央仓库和远程仓库三种类型。
仓库的优先级顺序为:本地仓库 > 远程仓库 > 中央仓库。也就是说,如果本地仓库中已经存在所需依赖项,Maven 将直接使用本地仓库中的该依赖项,而不会再去远程仓库或中央仓库下载。