CSS--Maven
一.Maven介绍:
是对java项目进行 (构建管理,和 依赖管理)的工具(软件)。
1.学习目标:
掌握meven安装、配置、以及基本的功能(项目构建 依赖管理) 的使用
2.核心功能:
a:依赖管理:管理项目的依赖(jar包); (给项目导入jar包)
b:构建管理:构建:即实现:java源代码(.java)--打包运行代码(.class)
原来我们是直接使用idea进行构建,那我们使用maven进行构建的原因是:
1.maven构建触发方便:直接使用命令/可视化工具即可
2.构建要求项目结构:格式固定化的,用任何软件都能进行开发; 使用idea等工具书写代码,使用meven工具进行 项目构建(因为如果都在不同的软件书写+构建的话,换了开发工具,使用方式变化,所以统一使用meven构建)
3.为什么使用meven:SSM+Spring Boot 等技术都不是java原生的技术,属于第三方技术,都需要导入大量的第三方jar包,如果不适应maven,我们就需要自己手动导入jar包,如果有了mave,它就可以把依赖全都下载下来;
3.Maven的GAVP属性
G:GroupID 格式; A: ArtifactID 格式:产品线名-模块名; V: Version版本号;
P:Packaging:将项目打包为什么类型的文件; java工程:.jar包; web工程:war包; pom:不打包;
<!-- 想要哪些依赖:直接在这个pom.xml文件中写即可 -->
G属性; A属性; V属性
<!--packing:默认是jar包:代表是java普通工程-->
4.如何使用JBL工具构建web工程:(如何创建maven工程)
a:创建javase -maven工程; b:右击:JBL
5.Maven工程项目结构说明
6.maven核心功能1 --依赖管理
1.学习目标:
重点:编写 pom.xml文件。 (记忆标签的使用)
当我们程序需要第三方依赖时,我们就不需要手动导包了,只需要把“ 依赖信息 ”(标签)声明写到配置文件pom.xml文件中:最后由maven自动下载相关的依赖到项目中即可。
详情查看:javaee-maven-project-03 的pom.xml文件
2.依赖管理的两个特性:**
(1)依赖传递
1.:只需要导入一个依赖,就会自动导入依赖的依赖
eg: A 1.0-B1.0-C1.0:我们只需要导入A依赖:它就自动完成导入A,B,C依赖
2.依赖传递的好处:
1:减少重复依赖:eg:只需要导入1个即可
2:自动管理依赖:导入一个依赖,它会自动下载所需要的全部依赖。
3.!!!确保版本正确(eg:abc三个依赖直接相互兼容)
(2)依赖冲突(是好事)
1.:当发生“ 重复依赖 ”导入时,maven会终止依赖的传递,来避免“ 重复依赖 ”和“ 循环依赖 ”
eg: a->b->c
a-<-b<-c :进入了一个依赖死循环:a依赖b,b依赖c之后,c又依赖b..会及时终止依赖传递
2.依赖冲突发生的背景:重复依赖!!
3.依赖冲突解决原则:
第一原则:谁短谁优先! 引用路径长度
eg:A - C- B1.0
F - B2.0
分析:首先:A、C、F依赖肯定会导入;
之后会导入:B2.0:因为B2.0的路径比B1.0短
第二原则:谁上谁优先():在dependencies 标签中声明的先后顺序;
<dependencies>
A - B 1.0
F -B 2.0
</dependencies>
分析:两个引用路径一样长
但是 A - B 1.0先声明:所以会导入:A ,B1.0,F
依赖冲突案例:
前提(依赖关系):
A 1.1 -> B 1.1 -> C 1.1
F 2.2 -> B 2.2
pom声明:
F 2.2
A 1.1
B 2.2
分析:在pom中声明了 F 2.2,A 1.1 ,B 2.2 ;所以肯定会导入 F2.2,A1.1,B2.2
因为已经导入了B2.2, 所以就会导入B 1.1了,
而且 不会导入C 1.1了:因为B1.1发生冲突了,后续都不引用了。
注意:只要发生冲突,其后续的依赖都不会导入!!!
7.maven核心功能2--构建管理(构建动作)
1.构建概念:将java源代码通过一系列过程变成可部署的应用程序的过程
2.构建动作分!!!为:
maven 工程的本地部署:通常分为:清理、编译、测试、报告、打包、部署(部署必须是jar包形式)
clean compile test site package install/deploy
方法1:通过terminal(alt+f12):1:进入项目的跟路径(项目名称):mvn . \maven-pom-build-o5\
2.输入相关命令触发相应的插件来进行部署:mvn clean/compile/test/package/install
方法2:通过可视化工具:右侧工具栏Maven-找到进行的项目-生命周期--选择即可
3.构建命令周期:如果触发周期后的命令,会自动触发该该命令之前的命令
eg:我们直接相要打包:直接执行mvn package即可,不需要mvn compile test package install/deploy
因为会自动触发package及package前面的命令!!!
(2) 作用:简化构建过程!!!
(3)构建生命周期 分为三个阶段/周期:
清理周期:clean
构建周期:compile test package install/deploy
报告周期:site
(4)演示:
打包:mvn clean package
重新编译: mvn clean compile
本地部署: mvn clean insatll
原理图:一个周期 包含多个有序的命令 , 一个命令 对应多个插件
!周期--包含若干命令--包含活干插件
真正的构建工具是:底层的插件; 我们使用的周期来进行构建;(底层是调用插件); --->方便
8.Maven的另外两大特性**:
(1)maven继承
1.maven工程继承关系:
1.maven继承:比如我们在一个maven工程中写好版本version,其它maven工程直接继承这个父类maven工程,方便管理字工程的版本信息,且规范。
2.
父工程:主要来作配置的继承信息。使子过程继承父工程的配置信息!!!
在父工程中一般不写代码,只做配置的传递。且父工程的打包方式为pom(代表不打包,不写代码)
3.操作过程:直接在父类maven项目右击创建新模块:默认为创建的新模块为其子类
在父工程的pom文件中书写:
<!--声明版本信息: -->
<!--导入依赖! 此处导入,所有的字工程都有相应的依赖!-->
<dependencies></dependencies>
<!--声明依赖,不会下载依赖! 可子以被工程继承版本号:
比如我们声明jackson-core依赖,书写完之后,子工程shop-order和shop-user并没有导入依赖,只是继承了版本号v。之后我们比如在shop-user子工程
中导入依赖书写配置信息时:只需要写 g,a,就不需要写v版本号了,因为已经继承了父工程 -->
<dependencyManagement>
<dependencies>
<dependency>
<!--在里面插入所需依赖版本号-->
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.15.2</version>
</dependency>
</dependencies>
</dependencyManagement>
之后比如我们想要在子工程shop-user中导入jackson-core依赖:即在其pom文件中只需要书写该依赖的:g,a即可,而v版本号是继承父类的!!!!
(2)maven聚合
1.聚合概念:
Maven 聚合是指将多个项目组织到一个父级项目中,通过触发父工程的构建,统一按顺序触发子工程构建的过程!!
(这时只需要构建父工程即可,他会自动触发子工程的构建!!)
2.聚合好处:
1. 统一管理子项目构建:通过聚合,可以将多个子项目组织在一起,方便管理和维护。
2. 优化构建顺序:通过聚合,可以对多个项目进行顺序控制,避免出现构建依赖混乱导致构建失败的情况。
3.
<modules>
<module>shop-user</module>
<module>shop-order</module>
</modules>
注意:a:<!--modules:要统一管理哪些子工程的artifactId-->
当我们构建父工程时,其下面的子工程也会一并构建;
b:比如我们删除 <module>shop-order</module>,之后当我们构建父工程时,就只有shop-user字工程构建了
!!!一般情况下:继承和聚合是同时出现!!!
继承:在父工程中统一声明版本信息version,使用<independencies>和<dependencyManagement> 标签
在子工程中使用<parent>标签来指定父工程
是依赖管理的简化
聚合:通过父工程统一构建子工程:会统一构建且优化构建顺序。 。
在父工程中使用modules指定要聚合管理哪些子工程
是构建管理的简化
9.maven-项目实战
分析:
1.由图知:是继承和聚合的关系
2.创建项目工程:我们创建一个父工程:删掉src,打包方式为pom;让父工程做依赖的版本管理
创建三个子工程:记得转为web项目!!
3.导入依赖:
A:先在父工程中声明依赖!!!
(1)三个子工程的版本号相同都是:1.0.1;
方法1:在父工程中<dependencyManagement>中声明版本信息version,
父工程:<dependencyManagement>
<>
<dependencyManagement>
方法2:在每个子工程中加一个<version>1.0.2</version>即可
(2)三个子工程中的 依赖的版本号 :在父工程中声明依赖的版本号;
a:在父工程pom文件中的 properties标签中声明变量:来声明依赖的版本
b:然后在<dependencyManagement>引用!!!(<dependencyManagement>声明依赖,不会下载依赖! 可子以被工程继承版本号)
注意:依赖的传递:就只需要导入1个依赖即可!gmmmmmmmm!:发现只需要声明4个依赖即可!!!
4.之后:在每个子工程中导入对应具体的依赖即可
使用<dependencies>
<dependency>
依赖1的g、a、v;(不用写版本号v,继承父类的版本)
<dependency> cl
<dependency>
依赖2的g、a、v;(不用写版本号v,继承父类的版本)
<dependency>
<dependencies>