1.Maven
-
概述: Maven项目对象模型(POM) 主要管理项目的构建,报告和文档的项目管理工具软件。
-
大型项目如何管理: 项目模块众多的情况下采用Maven管理的方式让所有的项目,都位于同一个项目环境下. 方便各个项目之间的创建/编译/更新/打包/维护
-
Maven实现jar包管理: 通过Maven工具可以统一管理jar包文件.这样其它的项目可以继承Maven统一的jar包版本. 同时也可以自己维护jar包版本. 从而实现jar包管理的目的.
2.Maven原理介绍
-
Maven仓库分类
Maven本地库: 本地磁盘中用于存储jar包的文件夹
Maven远程库:
中央仓库:Maven官方提供 https: //mvnrepository.com/ 镜像仓库:为了减轻中央仓库负担,同时更快的响应用户请求,国内外有能力的组织搭建的仓库, 这个仓库就是将中央仓库中的所有内容复制了一份存起来。比如阿里Maven镜像。 私服:一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的Maven用户使用
-
Maven工作原理
-
Maven调用流程
-
Maven仓库调用流程
-
Maven工作原理
介绍:
-
当客户端需要引入jar包文件时, 需要检查本地仓库中是否有jar包文件. 如果有该jar包文件则直接导入.
-
如果本地仓库中没有该jar包文件时,则会远程服务器中查找jar包文件, 如果有该jar包文件则直接导入.
-
如果私服镜像服务器中没有jar包文件时.则会去中央仓库中查找jar包文件.
-
Maven使用前需要在setting.xml中配置本地仓库路径, 整合idea时在setting设置中的Maven
-
-
3.Maven创建项目
-
Maven项目类型分类
Java项目:被打包为jar包。
web项目:打包为war包.
pom项目:pom项目中不写Java代码, 用来做父项目,用于进行子项目的管理
-
Maven创建web项目
-
在main下创建webapp目录
-
添加web资源 project structure --> Modules --> 选中项目点击上方+号选择web -->如下图
-
服务器部署
-
4.Maven知识
-
POM.xml 文件介绍
Project Object Model:项目对象模型。将Java工程的相关信息封装为对象作为便于操作和管理的模型。Maven工程的核心配置。可以说学习Maven就是学习pom.xml文件中的配置。
-
pom中常用配置
POM 中可以指定以下配置:
POM模型版本:modelVersion 项目坐标:groupId、artifactId、version、packaging 父模块和子模块:parent和modules 项目依赖:dependencies 项目构建:build 属性和属性文件:properties和profiles
-
Maven中的命令
-
clear是清除所有编译后的文件(target)
-
compile是编译文件
-
package 是将jar包/war包生成在target目录中. 可以当作临时测试
-
install 是将jar/war 包 在target和本地库中同时生成. 一般项目开发 成功,在本地库中存储.
-
-
pom中的坐标
-
通过maven坐标是唯一定位jar包文件的. 也是用来统一管理jar的方式.
坐标要素:
-
groupid: 一般公司域名后者组着名称倒写.
-
artifactid: 项目名称/项目模块名称 id必须唯一.
-
version: 版本号 控制项目版本信息.
-
-
本地仓库和坐标的关系
根据坐标能在本地库中找到对应的jar包文件, 所以本地仓库和坐标是一一对应的
-
-
Jar包依赖的传递性
简述: A 依赖 B , B 依赖 C
主要导入A,则B和C都会自动依赖.
A依赖B 叫做直接依赖, A依赖C 叫做间接依赖.
依赖的原理:
根据坐标在本地仓库中查找该jar包文件.
找到文件之后读取该文件下的xxx.pom文件.
根据pom文件中的依赖信息,再次执行依赖规则. 直到将所有的依赖包加载完成为止.
-
数据传输的安全性
-
SHA1
可以生成一个被称为消息摘要的160位(20字节)散列值,散列值通常的呈现形式为40个十六进制数。
-
5.Maven的依赖管理
-
Maven依赖范围
-
范围设置方式
在添加依赖时< scope>依赖范围< /scope>标签设置
-
Maven依赖范围介绍
当存在间接依赖的情况时,主工程对间接依赖的jar可以访问吗?这要看间接依赖的jar包引入时的依赖范围——只有依赖范围为compile时可以访问
-
Maven间接依赖冲突时
-
最短路径优先(离谁近依赖谁)
-
先配置先加载( 如果依赖的优先级相同,则先配制的优先 )
-
-
依赖排除
有的时候为了确保程序正确可以将有可能重复的间接依赖排除。排除掉后也可以自行依赖其他版本。
<dependency> <groupId>com.atguigu</groupId> <artifactId>maven_a</artifactId> <version>1.0-SNAPSHOT</version> <exclusions> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency>
-
Maven版本统一管理
-
问题描述: 以对Spring的jar包依赖为例:Spring的每一个版本中都包含Spring-core、Spring-context等jar包。我们应该导入版本一致的Spring jar包, 如果其中的版本号需要修改 如果一个一个改比较繁琐, 此时就需要使用jar包统一管理
-
jar包统一方式管理
利用properties 定义属性 <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <Spring.version>5.2.5.RELEASE</Spring.version> </properties> 配置Spring依赖 使用${xxxx} 为数据赋值 <!--Spring jar包文件导入--> <dependency> <groupId>org.Springframework</groupId> <artifactId>Spring-core</artifactId> <version>${Spring.version}</version> </dependency> <dependency> <groupId>org.Springframework</groupId> <artifactId>Spring-context</artifactId> <version>${Spring.version}</version> </dependency> .................
-
6.Maven继承
-
可以解决非compile范围的依赖信息是不能在“依赖链”中传递的,所以有需要的工程只能单独配置的问题。
使用场景: 每个模块中都用到了同一个jar包, 当需要修改该jar包版本时,如果逐一修改不可取, 使用继承机制就可以将这样的依赖信息统一提取到父工程模块中进行统一管理。
-
实现步骤
-
创建父级工程(pom中打包方式设置为pom)
-
在该父类工程下创建子模块
-
-
父子级项目说明
-
父级项目 有如下标识信息
<modules> <module>maven_son</module> </modules>
-
子级项目标识父级项目
<parent> <artifactId>maven_parent</artifactId> <groupId>com.atguigu</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>maven_son</artifactId>
-
-
jar包继承关系: 通过parent属性继承父级项目,则会将所有的父级中的jar包文件全部引入.
-
Maven 依赖管理
-
使用场景: 有时候一个父项目可能有多个子项目,但是并不是父项目的所有依赖,每个子项目都需要。但是按照继承的规则,子项目将可以继承并使用父项目的所有的依赖。这个时候可以通过dependencyManagement元素对父项目的依赖进行管理。
-
实现步骤
-
父级定义依赖管理
在父项目中通过dependencyManagement指定的依赖,只是声明,父项目中本身也不具有。子项目自然也无法继承 <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <Spring.version>5.2.5.RELEASE</Spring.version> </properties> <!--在父级中定义依赖管理--> <dependencyManagement> <dependencies> <!--Spring jar包文件导入--> <dependency> <groupId>org.Springframework</groupId> <artifactId>Spring-core</artifactId> <version>${Spring.version}</version> </dependency> <dependency> <groupId>org.Springframework</groupId> <artifactId>Spring-context</artifactId> <version>${Spring.version}</version> </dependency> .............. </dependencies> </dependencyManagement>
-
子级项目按需导入
在子项目中重新指定需要的依赖,删除范围和版本号;如果需要不同的版本,就需要指定版本。 <!--子级项目按需导入--> <dependencies> <!--由于父级已经定义了版本号 所以子级可以省略 --> <dependency> <groupId>org.Springframework</groupId> <artifactId>Spring-core</artifactId> </dependency> <dependency> <groupId>org.Springframework</groupId> <artifactId>Spring-context</artifactId> </dependency> </dependencies>
-
-
依赖管理和依赖标签的区别
dependencyManagement标签 dependencyManagement里只是声明依赖,并不实现引入,因此,子项目需要显示声明依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的; 子项目中声明该依赖项,并且没有指定具体版本,才会从父项目中继承该配置项,并且version和scope都读取自父pom;另外,如果子项目中指定了版本号,那么会使用子项目自己指定的jar版本。 dependencies标签: 相对于dependencyManagement,所有声明在dependencies里的依赖都会自动引入,并默认被所有的子项目继承。 dependencies即使在子项目中不写该依赖项,那么,子项目仍然会从父项目中继承该依赖项(全部继承)
-
7.Maven聚合工程
-
概念:
聚合关系是指多个项目共同组成一个项目。 用一个“总工程”将各个“模块工程”汇集起来,作为一个整体对应完
整的项目。对外看起来是一个项目。
父项目和子项目在形式上不是并列关系,而是包含和被包含的关系。
必须先有继承关系。在聚合工程中, 是一个双向的关系。父项目是整体,子项目是部分。
-
创建聚合工程
-
注意
1.在聚合关系中, 子项目明确父项目, 但是父项目明确子项目,是双向关系 2.聚合关系其实是一个大项目包含多个子项目,对父项目进行clear、compile、install等命令,是对所有子项 3.目进行clear、compile、install命令。但是如果对一个子项目进行maven操作,不影响其他子项目。
4.聚合Maven项目间的继承是pom资源间的继承,不是项目功能代码的继承 子项目可以继承父项目的资源(父项目POM文件中资源),即使test、provided资源也可以继承 子项目无法继承父项目自身资源,所以父项目不进行java代码开发
5.和继承一样,可以在父项目中通过dependencyManagement来管理依赖
6.聚合的目的是能够快速的构建项目,继承的目的是减少重复配置。