Maven是一个项目管理工具,它包含了一个项目对象模型,一组标准集合,一个项目生命周期,一个依赖管理系统和用来运行在生命周期阶段中插件目标的逻辑。
Maven的两个经典作用:依赖管理、一键构建
依赖管理:
涉及多模块的项目,管理以来就变成了一项困难的工作,传统的WEB项目中,必须将工程所依赖的jar包复制到工程中,导致工程变得很大,而Maven工程不直接将jar包导入工程中,而是通过pom.xml文件中添加所需要jar的坐标,这样就很好的避免了jar直接引入项目,在需要用到ja包的时候只要查找pom.xml文件,再通过pom.xml文件中的坐标,到一个专门用于存放jar的仓库(maven仓库)中根据坐标找到这些jar包从而使用。
一键构建:
项目从编译、测试、运行、打包、安装、部署整个过程都交给maven进行管理,这个过程称为构建。
在整个构建过程中,使用maven一个命令可以轻松完成整个工作。
下载并配置maven
下载好maven进入maven根目录
首先配置环境变量
打开cmd输入mvn -v查看maven版本信息,能够查到则配置成功。
在说明maven依赖管理时提到仓库,那么Mavne仓库的种类和关系是怎样的呢?
首先去本地仓库搜索依赖,如果没有找到默认会从中央从库下载jar包。
如果中央从库没有找到并且有远程仓库的设置则从远程仓库中搜索依赖否则抛出异常
首先就需要我们配置maven本地仓库,打开maven的配置文件settings.xml
那么对应的位置文件就是我们的本地仓库(路径不要有中文)
在settings.xml中配置阿里云镜像,可以加快从网上下载jar包的速度
Maven简单配置就完成了。
Maven生命周期
Maven生命周期分为三套
清理生命周期:在进行真正的构建之前进行一些清理工作
默认生命周期:构建的核心部分,编译、测试、打包、部署等
站点生命周期:生成项目报告,站点、发布站点等
命令介绍
1.compile:compile是Maven工程的编译命令,作用是将src/main/java下的文件编译为class文件输出到target目录下
2.test:test是maven工程的测试命令,会执行src/test/java下的单元测试类
3.clean:clean是maven工程的清理命令,执行clean会删除target目录及内容
4.package:package是maven工程的打包命令,对于java工程执行package达成jar包,对于web工程打成war包
5.install:install是maven工程的安装命令,执行install将maven打成jar或者war发布到本地仓库
Maven创建项目
打开idea首先设置全局变量
右下角的Configure->settings->Build,Execution,Deployment->Build Tools->Maven
注意在Maven下的Runner不要忘记将JRE改为1.8
在创建好的Maven项目中导入依赖可以指定作用域
依赖范围 | 对于编译classpath有效 | 对于测试classpath有效 | 对于运行时classpath有效 | 例子 |
compile | Y | Y | Y | spring-core |
test | - | Y | - | Junit |
provided | Y | Y | - | servlet-api |
runtime | - | Y | Y | JDBC驱动 |
system | Y | Y | - | 本地的Maven仓库之外的类库 |
Maven 拆分与聚合
例如像项目中引入依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.3.8</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.0.7.RELEASE</version>
</dependency>
打开依赖关系图
可以看到,左边的spring-beans被项目依赖。spring-beans就是项目的直接依赖
在spring-context中的依赖中,右边也有spring-beans的包。spring-beans是项目的传递依赖
因为项目两个直接依赖版本不同,导致他们各自的传递spring-core版本不同。
pom 中引入 jar 包的顺序是,从上往下导入 jar 包。生效的是上方的依赖,但在不同模块中引用时,可能需要下方的core版本,那么就会引起版本冲突。
所以就需要统一管理jar包版本
在导入依赖时,jar 包版本就可以这样编写 ${spring.version}
Maven工程拆分和聚合的思想
Maven把一个完整的项目,分成不同的独立模块,这些模块都有独立的坐标,那个地方需要某个模块就直接引用该模块的坐标。可以将拆分零散的模块聚合到一起写一个完整的项目,这就是maven聚合思想。
Maven父子工程的创建
工程和模块的区别
工程是独立的,具有自己的内部资源。模块不是独立的,属于某一个工程,并且可以使用该工程的所有资源
创建一个项目都当作父工程,在父工程右键创建子模块
分别创建子模块dao,service,web
在父工程的pom中能看到有几个子模块
在子模块中也能看到父工程的依赖
各个模块之间是没有关系的,只需要引用即可
例如在service中引入dao
那么这个父子工程所需要的依赖只需要夫工程引入即可。