Maven介绍
(1)Maven就是专门为Java项目打造的管理和构建工具,它的主要功能有:
提供了一套标准化项目结构;
提供了一套标准化的构建流程(编译,测试,打包,发布);
提供了一套依赖管理机制
(2)一个使用Maven管理的Java项目,它的目录结构默认如下:
项目的根目录是a-maven-project是项目名,它有一个项目描述文件pom.xml,存放Java源码的目录时src/main/java,存放资源文件的目录是src/main/resource,存放测试源码的目录src/test/java,存放测试资源的目录是src/test/resource,最后,所有编译打包生成的文件都放在target目录里面,这些就是一个Maven项目的标准目录结构。所有的目录结构都是约定好的标准结构,我们千万不要随意修改目录结构。使用标准结构不需要做任何配置,Maven就可以正常使用。
(3)使用/声明一个依赖后,Maven就会自动下载这个依赖包并把它放到classpath中。
(4)pom.xml:
其中,groupId类似于java的包名,通常是公司或者组织名称。artifactId类似于java的类名,通常是项目名称,再加上version,一个Maven工程就是由groupId,artifactId和version作为唯一标识。
依赖管理
(1)Maven解决了依赖管理问题,我们声明了自己的项目需要abc,Maven会自动导入abc的jar包,再判断出abc需要xyz,又会自动导入xyz的jar包,这样,最终我们的项目会依赖abc和xyz两个jar包。
(2)maven定义了几种依赖关系,分别是compile、test、runtime和provided;
compile:编译时需要用到该jar包(默认)
test:编译Test时需要用到该jar包
runtime:编译时不需要,但运行时需要
provieded 编译是需要用到,但运行时由jdk或某个服务器提供
其中,默认的compile是最常用的,Maven会把这种类型的依赖直接放入classpath。
test依赖表示仅在测试时使用,正常运行时并不需要,最常用的test依赖就是JUnit。
runtime依赖表示编译时不需要,但运行时需要,最典型的runtime依赖是JDBC驱动,例如MySQL驱动;
provided依赖表示编译时需要,但运行时不需要。最典型的provided依赖是Servlet API,编译的时候需要,但是运行时,Servlet服务器内置了相关的jar所以运行期不需要。
(3)最后一个问题是,Maven如何知道从何处下载所需要的依赖,答案是Maven维护了一个中央仓库,所有第三方库将自身的jar以及相关信息上传至中央仓库,Maven就可以从中央仓库把所需依赖下载到本地。Maven并不会每次都从中央仓库下载jar包,一个jar包一旦被下载过,就会被Maven自动缓存在本地仓库中,所以,除了第一次编译时因为下载需要比较慢,后悔过程因为本地缓存,并不会重复下载同样的jar包。
(4)Maven通过对jar包进行PGP签名确保任何一个jar包一旦经过发布就无法修改。修改已发布jar包的唯一方法是发布一个新版本。只有以-SNAPSHOT结尾的版本号会被Maven视为开发版本,开发版本每次都会重复下载,这种SNAPSHOT版本只能用于内部私有的Maven repo,公开发布的版本不允许出现SNAPSHOT。
构建流程
(1)Maven不但有标准化的项目结构,而且还有一套标准化的构建流程,可以自动化实现编译,打包,发布等。
(2)Lifecycle和Phase
使用maven时,我们首先要了解什么是maven的声明周期(lifecycle)。Maven的生命周期由一系列阶段(phase)构成,以内置的生命周期default为例,它包含以下阶段:
如果我们运行mvn package, Maven就会执行default生命周期,它会从开始一直运行到package这个phase为止;
如果我们运行mvn compile,Maven就会执行default声明周期,但这次它只会运行到compile。
Maven另一个常用的声明周期是clean,它会执行三个phase:
pre-clean;clean;pose-clean
所以,我们使用mvn这个命令时,后面的参数是phase,Maven自动根据生命周期运行到指定的phase。
(3)Goal
执行一个phase又会触发一个或者多个goal:
goal的命名总是abc:xyz这种形式。作为类比:
lifecycle相当于Java的package,它包含一个或者多个phase;
phase相当于java的class,它包含一个或者多个goal
goal相当于class的method,它其实才是真正干活的。
大多数情况下,我们只要指定phase,就默认执行这些phase默认绑定的goal,只有少数情况下,我们可以直接指定运行一个goal,例如,启动Tomcat服务器:
mvn tomcat:run
使用插件
(1)使用Maven构建项目就是执行lifecycle,执行到指定的阶段为止,每个阶段会执行自己默认的一个或者多个goal,goal是最小任务单元。实际上,执行每个phase,都是通过某个插件(plugin)来执行的,Maven本身其实并不知道如何执行compile,它只是负责找到对应的compiler插件,然后执行默认的compiler:compile这个goal来完成编译。所以,使用Maven,实际上就是配置好需要使用的插件,然后通过phase调用他们。
(2)如果标准插件无法满足需求,我们还可以使用自定义插件。
模块管理
(1)Maven可以有效地管理多个模块,我么你只需要把每个模块当做一个独立的Maven项目,它们有各自的pom.xml