1.Maven简介
1.1Maven介绍
Maven 是一款为 Java 项目构建管理、依赖管理的工具(软件),使用 Maven 可以自动化构建、测试、打包和发布项目,大大提高了开发效率和质量。 总结:Maven就是一个软件,掌握软件安装、配置、以及基本功能(项目构建、依赖管理)使用就是本课程的主要目标! |
1. 2 Maven主要作用
场景1:例如我们项目需要第三方库(依赖),如Druid连接池、MySQL数据库驱动和Jackson等。那么我们可以将需要的依赖项的信息编写到Maven工程的配置文件,Maven软件就会自动下载并复制这些依赖项到项目中,也会自动下载依赖需要的依赖!确保依赖版本正确无冲突和依赖完整! 场景2:项目开发完成后,想要将项目打成.war文件,并部署到服务器中运行,使用Maven软件,我们可以通过一行构建命令(mvn package)快速项目构建和打包!节省大量时间! |
依赖管理: Maven 可以管理项目的依赖,包括自动下载所需依赖库、自动下载依赖需要的依赖并且保证版本没有冲突、依赖版本管理等。通过 Maven,我们可以方便地维护项目所依赖的外部库,而我们仅仅需要编写配置即可。 构建管理: 项目构建是指将源代码、配置文件、资源文件等转化为能够运行或部署的应用程序或库的过程! Maven 可以管理项目的编译、测试、打包、部署等构建过程。通过实现标准的构建生命周期,Maven 可以确保每一个构建过程都遵循同样的规则和最佳实践。同时,Maven 的插件机制也使得开发者可以对构建过程进行扩展和定制。主动触发构建,只需要简单的命令操作即可。
总结: 1. 提供了一套标准的项目结构。 不同开发软件创建的项目结构不一样,Maven规范了项目的结构。 2. 提供了一套标准化的构建流程。 清理-->编译-->测试-->打包(jar/war)-->部署 3. 提供了一套依赖管理的机制。(管理项目所有的jar包) 1.传统项目下载jar包,体积大,传输慢 2. jar包和jar包之间版本冲突问题 |
2.Maven安装、配置、Maven集成到IDEA中
2.1 maven安装
1.先maven官网下载maven.网址:https://maven.apache.org/docs/history.html
|
2.解压到D:\盘根目录下 注意:不能放到中文目录
3. 配置maven的环境变量
前提条件:maven需要本机安装java环境、必需包含java_home环境变量!
3.1创建MAVEN_HOME的系统环境变量
变量名 | 值 |
MAVEN_HOME | Maven的解压路径 如:D:\apache-maven-3.6.3 |
3.2编辑path环境变量,将MAVEN_HOME添加到path中.
4. 检查maven版本
打开cmd命令窗口,输入【mvn -v】,检查Maven是否安装正确。安装正确如下图:
2.2 修改Maven默认配置
在maven的解压目录下找到【conf文件夹下的setting.xml文件中】修改这个配置文件,可以对Maven进行配置(如修改仓库地址,设置代理等等);
1. 配置本地仓库地址 conf/settings.xml 55行
<localRepository>D:\repository</localRepository> |
2. 配置中央仓库的国内镜像(提高下载速度),放在<mirrors>标签中
<mirror> |
3. 配置jdk (jdk版本必须开发环境)
在profiles节点(标签)下添加jdk编译版本 268行附近
<profile> |
2.3 IDEA中修改Maven配置为自己安装的Maven
1. 打开IDEA,点击菜单栏中的【File】选择【Settings】进入IDEA配置,找到【Build,Execution,Deployment】菜单栏中的【Build Tools】中找到Maven 2. 点击Maven,在右边配置自己安装的Maven路径。如下图:
3. 创建新项目也进行相同的配置maven
打开IDEA,点击菜单栏中的【File】选择【New Projects Settings】选择【Settings For New Projects】进入IDEA配置,找到【Build,Execution,Deployment】菜单栏中的【Build Tools】中找到Maven。
3.基于IDEA创建的Maven 项目
Maven工程相对之前的工程,多出一组gavp属性,gav需要我们在创建项目的时指定,p有默认值,后期通过配置文件修改。既然要填写的属性,我们先行了解下这组属性的含义!
Maven 中的 GAVP 是指 GroupId、ArtifactId、Version、Packaging 等四个属性的缩写,其中前三个是必要的,而 Packaging 属性为可选项。这四个属性主要为每个项目在maven仓库总做一个标识,类似人的《姓-名》。有了具体标识,方便maven软件对项目进行管理和互相引用!
GAV遵循一下规则:
GroupID 格式:com.{公司/BU }.业务线.[子业务线],最多 4 级。 如:com.taobao.tddl ArtifactID 格式:产品线名-模块名 如:正例:tc-client / uic-api / tair-tool / bookstore Version版本号格式:主版本号.次版本号.修订号 1.0.0 |
3.1 File--> New-->project-->New Project-->创建一个普通JavaSE的maven项目
注意:此处省略了version,直接给了一个默认值<version>1.0-SNAPSHOT</version>
3.2 File--> New-->project-->Maven Archetype-->选择maven模版-->选择webapp-->创建一个javaEE的web的maven项目
4.Maven 项目的目录结构
src/main/java:存放项目的 Java 源代码。 src/main/resources:存放项目的资源文件,如配置文件、静态资源等。 src/main/webapp/WEB-INF:存放 Web 应用的配置文件。 src/main/webapp/index.jsp:Web 应用的入口页面。 src/test/java:存放项目的测试代码。 src/test/resources:存放测试相关的资源文件,如测试配置文件等。 pom.xml:Maven 项目管理的配置文件,用于描述项目的依赖和构建配置等信息。 |
5.pom.xml Maven 项目管理文件
<!-- 模型版本 --> <modelVersion>4.0.0</modelVersion> <!-- 项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 --> <!-- 版本号 --> |
6.依赖管理引入第三方依赖的jar坐标
每一个jar包都有一个唯一的坐标,通过坐标找到对应的jar包。
坐标组成:
|
快速查找jar的坐标的网址:http://mvnrepository.com/
<!-- 引入jdbc.jar的依赖坐标 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.25</version> </dependency> |
Maven依赖管理
本地仓库:在计算机本地创建文件夹
中央仓库:线上网址。网址:https://repo1.maven.org/maven2/
远程仓库:远程的仓库网址(自己配置)
Maven命令和关系
- <scope></scope> 指定依赖坐标范围
范围: 编译(main/java) 测试(test/java) 运行/打包
| ||||||||||||||||||||||||||||||
|
2.项目构建
项目构建是指将源代码、依赖库和资源文件等转换成可执行或可部署的应用程序的过程,在这个过程中包括编译源代码、链接依赖库、打包和部署等多个步骤。
主动触发场景: 重新编译 : 编译不充分, 部分文件没有被编译! 打包 : 独立部署到外部服务器软件,打包部署 部署本地或者私服仓库 : maven工程加入到本地或者私服仓库,供其他工程使用 |
3.执行Maven的构建命令
语法: mvn 构建命令 构建命令 ..
清理命令: mvn clean 删除taget文件夹 编译命令: mvn compile 将java源文件编译成class文件 测试命令: mvn test 测试项目,执行test目录的测试用例 注意测试用例的类名必须以Test开头,只执行以Test开头的测试类 打包命令: mvn package 将项目打成jar/war包 安装命令: mvn install 将当前项目放入到maven的本地仓库,供其它项目使用。 要求:执行maven中运行构建相关的命令时,必须进入到项目的pom.xml所在的目录。否则会报错。 也可以直接通过maven--->项目--->Lifecycle生命周期点开--->提供了一套操作。 Validate: 验证工程正确性 Verify :核实。主要是对package检查是否有效 Site: 生成项目的站点文档 Deploy:配置部署,复制到远程仓库 |
可视化方式构建 : 通过maven--->项目--->Lifecycle生命周期点开--->提供了一套操作
4. Package 项目类型,最终被打成什么项目类型
默认:jar jar 指的是普通的java项目打包方式! 项目打成jar包! war 指的是web项目打包方式!项目打成war包! pom不会将项目打包!这个项目作为父工程,被其他工程聚合或者继承! 如果一个项目有子项目就必须是pom类型 <packaging>jar/pom/war</packaging> |
注意:jdk17 和 war包版本插件不匹配,打成war包,需要引入打包插件
<build> |
5. 依赖关系
如果一个项目需要依赖于另外一个项目或jar包
通过pom.xml 中<dependency>标签引入依赖项目或jar包的坐标
<dependency>
<dependency> <groupId>com.bdqn</groupId> <artifactId>taobao-goods</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> |
依赖传递
自动下载另一个项目所依赖的所有项目jar包。 |
依赖排除 :阻止某一些jar包的传递,因为这样的jar包传递进来会和其他的jar包冲突
<dependency> |
依赖冲突:短路经优先,只会引入路径最短的jar包 相同长度路径下,声明优先,谁先声明。 <!--jackson--> |
6.聚合关系
一个项目拆成了多个工程
如:淘宝项目,拆分成用户,商品,订单。分开编码太麻烦。
商品修改后,需要重新打包发布后,订单引用才会生效。
使用一个总工程,将各个模块工程汇总起来,作为一个完整对应的项目
通过总工程将多个模块可以一起执行和管理。
1. 聚合概念
Maven 聚合是指将多个项目组织到一个父级项目中,通过触发父工程的构建,统一按顺序触发子工程构建的过程!! |
2. 聚合作用
1. 统一管理子项目构建:通过聚合,可以将多个子项目组织在一起,方便管理和维护。 2. 优化构建顺序:通过聚合,可以对多个项目进行顺序控制,避免出现构建依赖混乱导致构建失败的情况。 |
3. 实现步骤
1、创建maven父项目,new-->project-->new Project-->maven项目-->taobao-parent
1. 把src删掉,因为聚合项目通常只是管理子工程 2. 把packaging修改下,默认jar,改成pom,代表是一个逻辑父项目 3. 把子项目管理起来 |
2、创建子模块
父项目--->右键--> new-->子模块 module--> parent选None没有
3. 打开父项目的pom.xml把子项目管理起来
<modules> |
总结:
1.父项目类型必须为pom,父项目会将子项目包含进来。
2.子项目类型不是maven project,而是maven moduel
3. 父项目pom.xml通过<module>标签指定子项目信息
<modules> <module>taobao-orders</module> </modules> |
- 父项目可以统一管理所有的子项目
1.点击父项目的构建命令可以直接对所有的子项目进行编译,打包,安装等。 2.当orders引入goods的模块时,goods模块发生改变,不需要重新安装就可以自动更新。 |
7.继承关系
1. 继承概念
Maven 继承是指在 Maven 的项目中,让一个项目从另一个项目中继承配置信息的机制。继承可以让我们在多个项目中共享同一配置信息,简化项目的管理和维护工作。 |
2. 继承作用
作用:在父工程中统一管理项目中的依赖信息,进行统一版本管理! 它的背景是: 1. 对一个比较大型的项目进行了模块拆分。 2. 一个 project 下面,创建了很多个 module。 3. 每一个 module 都需要配置自己的依赖信息。 它背后的需求是: 1. 多个模块要使用同一个框架,它们应该是同一个版本,所以整个项目中使用的框架版本需要统一管理。 2. 使用框架时所需要的 jar 包组合(或者说依赖信息组合)需要经过长期摸索和反复调试,最终确定一个可用组合。这个耗费很大精力总结出来的方案不应该在新的项目中重新摸索。 通过在父工程中为整个项目维护依赖信息的组合既保证了整个项目使用规范、准确的 jar 包;又能够将以往的经验沉淀下来,节约时间和精力。 |
3.实现步骤
1、创建maven父项目,new-->project-->maven项目-->taobao-parent
1. 把src删掉,因为聚合项目通常只是管理子工程 2. 把packaging修改下,默认jar,改成pom,当前不是一个具体的包 3. 把子项目管理起来 |
2、创建子模块
父项目--->右键--> new-->子模块 module--> parent选taobao-parent
总结:
- 父项目类型必须为pom
- 子项目类型可以为jar或war.
如果当前子项目是其它项目的父项目,那么也必须为pom.
3.继承关系只是逻辑意义上的继承,父项目没有包含子项目信息
4.子项目的pom.xml中通过<parent>标签指定父项目信息
<parent> <groupId>com.bdqn</groupId> <artifactId>taobao-parent</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> |
5.如果子项目的<groupId>和<version>和父项目相同,可以省略。6.
6.父项目中<dependencies>配置的jar包坐标依赖将会被所有子项目自动继承。
7.父项目中<dependencyManagement>配置的jar包坐标依赖不会被子项目继承,但是可以统一版本控制。
8.<dependencyManagement> 标签
父工程依赖统一管理:如果子项目不继承,需要统一版本,使用dependencyManagement
1.父项目的pom.xml声明版本
<properties> </properties> <dependencyManagement> </dependencyManagement> |
2.子项目的pom.xml引用父项目版本
<dependency> |
8.Maven 核心知识点总结