最近重温了一遍,提炼了几个重要的知识点。详细的pom文件各个标签的解释 请看这pom标签解释
1、依赖传递和依赖的排除
依赖的传递:如果我们的项目引用了一个jar包,而jar包中又引用了其他的 jar包,那么在默认的项目编译的时候,maven会直接或者间接的引用的jar包都下载到本地
排除依赖:如果我们只想下载直接引用的Jar包,那么需要在pom.xml中做如下配置:(将需要排除的Jar包的坐标写在中)
<exclusions>
<exclusion>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</exclusion>
</exclusions>
2、依赖冲突的解决
若项目中多个Jar同时引用了相同的Jar时,会产生依赖冲突,但Maven采用了两种避免冲突的策略,因此在Maven中是不存在依赖冲突的。
a.短路优先
本项目——>A.jar——>B.jar——>X.jar
本项目——>C.jar——>X.jar
若本项目引用了A.jar,A.jar又引用了B.jar,B.jar又引用了X.jar,并且C.jar也引用了X.jar。
在此时,Maven只会引用引用路径最短的Jar。声明优先
b.若引用路径长度相同时,在pom.xml中谁先被声明,就使用谁。
==================
maven的继承和聚合是俩个概念
对于聚合是为了快速的构建项目 父模块知道引用了哪几个子模块 单子模块不知道父模块的存在
对于继承来说是为了刚好的消除重复配置以及维护引用依赖版本配置的一致性 子知父 但父不知子
==================
3、maven的聚合
什么是聚合?
将多个项目同时进行运行 称之为项目的聚合
如何实现聚合?
只需在pom中作如下配置即可实现聚合,注意项目的相对路径的引用:
<modules>
<module>../模块1</module>
<module>../模块2</module>
<module>../模块3</module>
</modules>
4、maven的继承
什么是继承?
在聚合多个项目时,如果这些被聚合的项目中需要引入相同的Jar,那么可以将这些Jar写入父pom中,各个子项目继承该pom即可。
如何实现继承?
父pom配置:将需要继承的Jar包的坐标放入 <dependencyManagement/>标签即可
注意:
1.dependencyManagement中定义的依赖子module不会共享
2.dependencies中定义的依赖子module可以共享
dependencyManagement的使用 就是方便管理版本,子项目中要引入group id和atifact id
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.2.2</version>
</dependency>
</dependencies>
</dependencyManagement>
子pom配置:
<parent>
<groupId>父pom所在项目的groupId</groupId>
<artifactId>父pom所在项目的artifactId</artifactId>
<version>父pom所在项目的版本号</version>
<!--特别注意的是配置好相对pom文件的路径 默认的是../pom.xml
是在上一层级的目录上-->
<relativePath>../account-parent/pom.xml</relativePath>
</parent>
5.maven项目默认是不加载xml属性资源文件的
解决措施:1.将mybatis的xml映射文件放在maven中的“resources”目录下
2.在maven项目的根目录的pom.xml文件中添加指定生成xml资源文件的目录
<build>
----
----
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
6.maven的三大核心 构件 插件 生命周期
maven的生命周期就是对构建过程的抽象和统一 具体工作都是由对应的插件来完成 很好体现了模板设计模式
在执行命令的时候可以跟 -Dmaven.test.skip=true
例如 mvn install -Dmaven.test.Skip =true 在执行中将会忽略执行test
7.依赖范围
编译 测试 运行
compile 默认的依赖范围 对应三种classpath 例子 spring-core
test 对应测试 编译主代码合运行项目的时候后无法使用此依赖 例子 Juint
provided 编译和测试 运行时无效 sevelet-api
runtime 后俩种在编译的时候不参与 jdbc的1接口
system 与provide一直的 但是需要在本地指定解析的路径
import 这个是与</dependencyManagement> 元素配合使用
可以在项目引入打包类型是pom中的<dependencyManagement>
例子
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.inspur</groupId>
<artifactId>ls</artifactId>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
8.在使用maven打包的war包下的会有lib文件夹 但是在项目中不会存在这个结构
maven在打包的时候会根据pom的配置会从本地仓库中复制相应的jar包