maven是一个项目管理工具,主要作用是在项目开发阶段对Java项目进行依赖管理和项目构建。 依赖管理:就是对jar包的管理,通过导入maven坐标,就相当于将仓库中的jar导入了当前项目中 项目构建:通过maven的一个命令就可以完成项目从清理、编译、测试、报告、打包、部署整个过程。
maven的仓库类型:
- 本地仓库
- 远程仓库
- maven中央仓库
- maven私服(公司局域网内的仓库)
- 其他公共远程仓库
查找的顺序:本地仓库 -> maven 私服 -> maven中央仓库
maven的常用命令:
clean:清理
compile:编译
test:测试
package:打包(war或jar包)
install:安装
Maven 依赖传递
在maven中,依赖是可以传递的,假设存在三个项目,分别是项目A、项目B以及项目C。项目C依赖项目B,项目B依赖项目A,那么就可以说项目C也依赖传递了项目A。项目C既可以用到项目B中的资源,也可以用到项目A中的资源。
解决依赖冲突
如何解决依赖冲突问题?
如下图所示,产生了依赖冲突,spring-beans的依赖存在5.1.5和5.1.6的版本
但是项目真正依赖的beans的版本是5.1.5的。而我们希望引入工程中的beans是5.1.6的版本要如何做呢?
依赖冲突:由于依赖传递所引起的一个问题,在同一个工程中依赖传递了不同版本的相同jar包
如果解决依赖冲突:
- 使用maven提供的依赖调解原则
- 第一声明者优先原则
- 路径近者优先原则
- 排除依赖
-
第一声明者优先原则 【不常用】
如下,按照写入顺序为准,所以spring-beans就是5.1.5版本,如果要想使用5.1.6的版本则将spring-aop放在spring-mvc上面即可。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.1.6.RELEASE</version>
</dependency>
路径近者原则
直接依赖beans,大于依赖传递
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.1.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>5.1.6.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>5.1.7.RELEASE</version> </dependency>
直接依赖大于传递依赖,所以在工程中直接使用的beans就是5.1.7版本。
排除依赖
可以使用
exclusions
标签将传递依赖直接排除出去。<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.1.5.RELEASE</version> <exclusions> <!-- 排除的依赖 --> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>5.1.6.RELEASE</version> </dependency>
我们可以看到 spring-mvc的依赖中的spring-beans已经没有了
锁定版本 【重点掌握】
采用直接锁定版本的方法确定依赖jar包的版本,版本锁定后则不考虑依赖的声明顺序或依赖的路径,以锁定的版本为准添加到工程中,此方法在企业开发中经常使用。
锁定版本的使用方式: 在
dependencyManagement
标签中锁定依赖的版本,并不能将依赖引入工程中.<!-- 锁定jar包版本 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>5.1.7.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.1.7.RELEASE</version> </dependency> </dependencies> </dependencyManagement>
在
dependencies
标签中声明需要导入的maven坐标,无需在指定版本了<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> </dependency> </dependencies>
properties 标签
在我们实际开发中,在
dependencyManagement
指定jar包的版本,如果依赖过多,后期要升级版本,就需要一个一个的去修改,难以维护.所以需要在properties标签中
配置统一的一个类似变量的版本号<properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <!-- 配置统一的版本 --> <spring.version>5.1.8.RELEASE</spring.version> </properties> <!-- 锁定jar包版本 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> </dependencies> </dependencyManagement>
Maven 聚合工厂-分模块
在企业项目开发中,由于项目规模大, 业务复杂,参与的人员较多,一般会通过合理的模块拆分讲一个大型的项目拆分为N多个小模块,而且拆分出的模块可以非常容易的被其他模块复用
常见的拆分方式:
- 按照业务模块进行拆分,每个模块拆分成一个maven工程,例如将一个项目分为用户模块、订单模块、购物车模块等,每个模块对应就是一个maven工程。
- 按照层进行拆分,例如持久层、业务层、表现层、每个层对应一个maven工程。
不管使用哪种拆分方式,通常都会提供一个父工程,将一些公共的代码和配置提取到父工程中进行统一管理和配置。
maven_pojo:存放的是实体类
maven_dao:存放的数据库交互代码
maven_service: 存放的是业务逻辑代码
maven_web: 接收请求和响应、视图跳转
maven工程的继承
maven工程之间可以继承,子工程继承父工程后,就可以使用在父工程中引入的依赖,继承的目的是为了消除重复代码。
父工程的打包方式一般都为pom
.
新建项目,创建一个名为:maven_parent
模块
在pom.xm
如下代码:packaging
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.prim</groupId>
<artifactId>maven_parent</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
</project>
父工程,通常都是进行管理jar包版本和依赖,如下代码:
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<spring.version>5.1.5.RELEASE</spring.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
</dependencies>
创建子工程maven_pojo
,继承的父工程maven_parent
看一下子工程的pom文件:子工程通过parent
标签继承父工程
<parent>
<artifactId>maven_parent</artifactId>
<groupId>com.prim</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
maven 工程的聚合
在maven工程的pom.xml文件中可以使用<modules>
标签将其他maven工程聚合到一起,聚合的目的是为了进行统一操作。
例如:拆分后的maven工程有多个,如果要进行打包,就需要针对每个工程分别执行打包命令,操作起来非常繁琐。这时就可以使用<modules>
标签将这些工程统一聚合到maven父工程中,需要打包的时候,只需要在此工程中执行一次打包命令,其下被聚合的工程就都会被打包了。
在父工程的pom文件中添加module
聚合子工程:
<modules>
<module>maven_pojo</module>
</modules>
运行mvn package,我们可以看到maven_pojo也进行了打包