文章目录
1.什么是Maven
项目管理和构建工具
pom 项目对象模型
项目构建(Build):搭建项目环境的过程
代码清除(clean):删除编译后的class文件
2.maven管理依赖
自动管理依赖
dependency 依赖 就是jar包的意思
自动管理依赖关系 jar包和jar包 之间的关系
struts-core.jar -----> xwork-core.jar 依赖关系
A ----> B -----> C ----> D 要使用A必须导入BCD jar包
在使用Maven的时候 只需要导入A jar地址 Maven会自动的帮你下载A的所有依赖jar包
Maven会通过依赖坐标自动下载你需要的jar包 和相关的依赖jar
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
- 1
- 2
- 3
- 4
maven通过install将本地工程打包成jar包,放入到本地仓库中,再通过pom.xml配置依赖引入到当前工程。
pom.xml中引入的坐标首先在本地maven仓库中查找,若没有则去maven的网上中央仓库查找,并放到本地仓库供项目使用。
那么如果我们是内部项目,自定义的构建并不公开至网络上,项目成员又想依赖他怎么办呢?想想maven找寻构建的步骤。
先找寻本地仓库,本地仓库不存在,找寻远程仓库或者私服。
我们只需把自定义的构建安装至私服或者本地仓库中就行了。这就需要maven的install命令。
3.Maven的相关原理
maven远程仓库地址 https://mvnrepository.com/
4.Maven web的结构
-
src
-
main
-
java 源代码目录
-
resources 配置文件目录
-
-
test 测试包
-
测试java 源代码目录
-
resources 测试配置文件
-
-
-
pom.xml 核心配置文件 写jar包的坐标
-
target 编译文件输出目录
5.Maven生命周期、插件以及命令使用
Maven生命周期概念
三套生命周期
clean生命周期
default生命周期
对于上述未加解释的阶段,读者也应该能够根据名字大概猜到其用途,若想了解进一步的这些阶段的详细信息,可以参阅官方的解释:http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html。
site生命周期
命令行与生命周期
从命令行执行Maven任务的最主要方式就是调用Maven的生命周期阶段。
插件
插件绑定
命令行插件配置
例如,maven-surefire-plugin提供了一个maven.test.skip参数,当其值为true的时候,就会跳过执行测试。于是,在运行命令的时候,加上如下-D参数就能跳过测试:
mvn install -Dmaven.test.skip=true
- 1
参数-D是Java自带的,其功能是通过命令行设置一个Java系统属性,Maven简单地重用了该参数,在准备插件的时候检查系统属性,便实现了插件参数的配置。
在线插件信息
基本上所有主要的Maven插件都来自Apache和Codehaus。由于Maven本身是属于Apache软件基金会的,因此它有很多官方的插件,每天都有成千上万的Maven用户在使用这些插件,它们具有非常好的稳定性。详细的列表可以在这个地址得到:http://maven.apache.org/plugins/index.html,单击某个插件的链接便可以得到进一步的信息。所有官方插件能在这里下载:http://repo1.maven.org/maven2/org/apache/maven/plugins/。
plugin:
生命周期(lifecycle)由各个阶段组成,每个阶段由maven的插件plugin来执行完成。生命周期(lifecycle)主要包括clean、resources、complie、install、package、testResources、testCompile、deploy等,其中带test开头的都是用于编译测试代码或运行单元测试用例的。
各个插件的执行顺序一般是:1.clean->2.resources->3.compile->4.testResources->5.testCompile->6.test->7.jar->8.install。
maven内置的各种插件,如果pom中没有配置就调用默认的内置插件,如果pom中配置了就调用配置的插件
maven的构建过程:
由各种插件按照一定的顺序执行来完成项目的编译,单元测试、打包、布署的完成
clean插件
maven-clean-plugin
resources插件
maven-resources-plugin
compile插件
maven-compiler-plugin
单元测试插件
maven-surefire-plugin
打包插件
maven-jar-plugin、maven-assembly-plugin、maven-shade-plugin 3种
maven-jar-plugin:可执行jar与依赖包是分开的,需要建立lib目录里来存放需要的j依赖包,且需要jar和lib目录在同级目录
maven-assembly-plugin:这个插件可以把所有的依赖包打入到可执行jar包。但是该插件有个bug会缺失spring的xds文件,导致无法运行jar,同时如果同级目录还有其它可执行jar文件依赖可能会产生冲突。
maven-shade-plugin:所有的依赖包打入到可执行jar包,如果同级目录有其它可执行jar,依赖可能会产生冲突,且运行jar时,有时会出现SF、DSA、RSA文件冲突的提示,需要排除META-INF目录下的文件。
本地发布插件
maven-install-plugin
发布插件的功能就是把构建好的artifact部署到本地仓库
远程发布插件
maven-deploy-plugin
将构建好的artifact部署到远程仓库。
maven命令package、install、deploy的联系与区别
mvn clean package依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)等7个阶段。
mvn clean install依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)、install等8个阶段。
mvn clean deploy依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)、install、deploy等9个阶段。
区别:
package命令完成了项目编译、单元测试、打包功能,但没有把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库。
install命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库,但没有布署到远程maven私服仓库。
deploy命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库。
Maven的聚合与继承
聚合
为了方便用户构建项目,通常将聚合模块放在项目目录的最顶层
,其他模块则作为聚合模块的子目录存在。
关于目录结构还需要注意的是,聚合模块与其他模块的目录结构并非一定要是父子关系
。图8-2展示了另一种平行的目录结构
。
如果使用平行目录结构,聚合模块的POM也需要做相应的修改,以指向正确的模块目录:
继承
在account-aggregator下创建一个名为account-parent的子目录,然后在该子目录下建立一个所有除account-aggregator之外模块的父模块。为此,在该子目录创建一个pom.xml文件:
有了父模块,就需要让其他模块来继承它。
可继承的POM元素
dependencyManagement依赖管理
场景:将现有子模块的相同依赖抽取到父模块,但是我们无法确定将来添加的子模块就一定需要这几个依赖。
一句话,dependencyManagement元素下的依赖声明不引入实际依赖,只是声明依赖,此pom被继承后,也继承了dependencyManagement依赖声明,只需配置groupId和artifactId,省去了version(dependencyManagement已经声明了)
例如想要在另外一个模块中使用与代码清单8-14完全一样的dependencyManagement配置,除了复制配置或者继承这两种方式之外,还可以使用import范围依赖将这一配置导入
注意,上述代码中依赖的type值为pom,import范围依赖由于其特殊性,一般都是指向打包类型为pom的模块。如果有多个项目,它们使用的依赖版本都是一致的,则就可以定义一个使用dependencyManagement专门管理依赖的POM,然后在各个项目中导入这些依赖管理配置。
插件管理
当项目中的多个模块有同样的插件配置时,应当将配置移到父POM的pluginManagement元素中。即使各个模块对于同一插件的具体配置不尽相同,也应当使用父POM的pluginManagement元素统一声明插件的版本。甚至可以要求将所有用到的插件的版本在父POM的pluginManagement元素中声明,子模块使用插件时不配置版本信息,这么做可以统一项目的插件版本,避免潜在的插件不一致或者不稳定问题,也更易于维护。
聚合与继承的关系
合并聚合和继承功能后的account-parent
该POM的打包方式为pom,它包含了一个modules元素,表示用来聚合account-persist和account-email两个模块,它还包含了properties、dependencyManagement和pluginManagement元素供子模块继承。
相应地,account-email和account-persist的POM配置也要做微小的修改。本来account-parent和它们位于同级目录,因此需要使用值为../account-parent/pom.xml的relativePath元素。现在新的account-parent在上一层目录,这是Maven默认能识别的父模块位置,因此不再需要配置relativePath
反应堆
反应堆的构建顺序
几个模块的构建次序显然与它们在聚合模块中的声明顺序不一致,account-parent跑到了account-email前面,这是为什么呢?
使用Nexus创建私服
通过建立自己的私服,就可以降低中央仓库负荷、节省外网带宽、加速Maven构建、自己部署构件等,从而高效地使用Maven。
有三种专门的Maven仓库管理软件可以用来帮助大家建立私服:Apache基金会的Archiva、JFrog的Artifactory和Sonatype的Nexus。
使用Maven进行测试
配置插件跳过测试运行
配置插件跳过测试编译和运行
包含与排除测试用例
自动运行以Tests结尾的测试类
排除运行测试类
使用Hudson进行持续集成
持续集成的作用、过程和优势
一个典型的持续集成场景
是这样的:
整个持续集成的过程
一次完整的集成往往会包括以下6个步骤:
持续集成有着很多好处:
使用MAVEN构建WEB应用
本章内容
·Web项目的目录结构
·account-service
·account-web
·使用jetty-maven-plugin进行测试
·使用Cargo实现自动化部署
·小结
前面讨论的只有打包类型为JAR或者POM的Maven项目。但在现今的互联网时代,我们创建的大部分应用程序都是Web应用,**在Java的世界中,Web项目的标准打包方式是WAR。**因此本章介绍一个WAR模块——account-web,它也来自于本书的账户注册服务背景案例。在介绍该模块之前,本章还会先实现account-service。此外,还介绍如何借助jetty-maven-plugin来快速开发和测试Web模块,以及使用Cargo实现Web项目的自动化部署。
Web项目的目录结构
一个典型的WAR文件
会有如下目录结构:
显式指定Web项目的打包方式为war
Web项目
比较特殊的地方在于:它还有一个Web资源目录,其默认位置是src/main/webapp
/。
一个典型的Web项目
的Maven目录结构如下:
可以看到,img,css,js,html,jsp在web项目
里是在webapp目录下,而在war文件中是在根目录下
使用Cargo实现自动化部署
本节以Tomcat 为例,介绍如何自动化地将Web应用部署至本地或远程Web容器中。
部署至本地Web容器
使用standalone模式
部署应用至本地Web容器
现在,要让Cargo启动Tomcat并部署应用,只需要运行:
mvn cargo:start
- 1
地址为http:localhost:8081/account-web-1.0.0-SNAPSHOT/signup.jsp。
使用·existing模式·部署应用至本地Web容器
部署至远程Web容器
部署应用至远程Web容器
对于远程部署的方式来说,container元素的type子元素的值必须为remote。如果不显式指定,Cargo会使用默认值installed,并寻找对应的容器安装目录或者安装包,对于远程部署方式来说,安装目录或者安装包是不需要的。上述代码中configuration的type子元素值为runtime,表示既不使用独立的容器配置,也不使用本地现有的容器配置,而是依赖于一个已运行的容器。properties元素用来声明一些容器热部署相关的配置。例如,这里的Tomcat 6就需要提供用户名、密码以及管理地址。需要注意的是,这部分配置元素对于所有容器来说不是一致的,读者需要查阅对应的Cargo文档。
有了上述配置后,就可以让Cargo部署应用了。运行命令如下:
mvn cargo:redeploy
- 1
如果容器中已经部署了当前应用,Cargo会先将其卸载,然后再重新部署。
版本管理
Maven的版本号定义约定
1.3.4-beta-2
表示了该项目或产品的第一个重大版本的第三个次要版本的第四次增量版本的beta-2里程碑。
Maven的版本号定义约定是这样的:
<主版本>.<次版本>.<增量版本>-<里程碑版本>
一般来说,主版本和次版本都会声明,但增量版本和里程碑就不一定有。
里程碑的含义:可能有新的特性或功能,但表示不是非常稳定,还需要很多测试。
水岸齐天
Maven