Maven
Apache Maven是一款软件工程管理和整合工具。基于工程对象模型(POM)的概念,通过一个中央信息管理模块,Maven能够管理项目的构建、报告和文档。
概述
Maven是一个项目管理和整合工具。Maven为开发者提供了一套完整的构建生命周期框架。开发团队几乎不用花多少时间就能自动完成工程的基础构建配置,因为Maven使用了一个标准的目录结构和一个默认的构建生命周期。
在有多个开发团队环境的情况下,Maven能够在很短的时间内使得每项工作都按照标准进行。因为大部分的工程配置操作都非常简单并且可以复用,在创建报告、检查、构建和测试自动配置时,Maven可以让开发者的工作变得更简单。
Maven可以帮助开发者完成以下工作:
- 构建
- 文档生成
- 报告
- 依赖
- SCMs
- 发布
- 分发
- 邮件列表
总体来说,Maven简化了工程的构建过程,并对其标准化。它无缝衔接了编译、发布、文档生成、团队合作和其他任务。Maven提高了重用性,负责了大部分构建相关的任务。
maven目录结构
src
-main
-java
-package
-test
-java
-package
resources
maven常用命令
mvn -v 查看maven版本
mvn compile 编译
mvn test 测试
mvn package 打包
mvn clean 清除target
mvn install 安装jar包到本地仓库中
一个完整的项目构建过程包括:
清理、编译、测试、打包、集成测试、验证、部署
maven生命周期
clean(pre-clean、clean、post-clean)
default(compile、test、package、install)
site:生成项目站点(pre-site、site、post-site、site-deploy)
使用mvn archetype:generate 这个插件可以帮助自动生成目录结构
Maven配置
略略略
POM
POM(Preject Object Model)代表工程对象模型。它是Maven工作的基本组建,是一个xml文件。被放在工程根目录下,文件名为pom.xml
POM包含了关于工程的各种配置细节的信息,Maven使用这些信息构建工程。
POM也包含了目标和插件。当执行一个任务或目标时,Maven会找到当前目录下的POM,从其中读取所需要的配置信息,然后执行目标。能够在POM中设置的配置如下:
- project dependencies
- plugins
- goals
- build profiles
- project version
- developers
- mailing list
在创建POM之前,我们首先确定工程组(groupId),及其名称(artifactId)和版本,在仓库中这些属性是工程的唯一标识。
<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.companyname.project-group</groupId>
<artifactId>project</artifactId>
<version>1.0</version>
</project>
需要说明的是每个工程应该只有一个POM文件。
- 所有的POM文件需要project元素和三个必须的字段:groupid, artifactId, version
- 在仓库中的工程标识为groupId:artifacctId:version
- POM.xml的根元素是project,它有三个主要的子节点:
节点 | 描述 |
---|---|
groupId | 工程组的标识。它在一个组织或者项目中通常是唯一的。 |
artifactId | 工程的标识。通常是工程的名称。(项目名+模块名) |
version | 版本号,第一个0表示大版本号,第二个0表示分支版本号,第三个0表示小版本号,snapshot快照,alpha内部测试,beta公测,Release稳定,GA正式发布 |
packaging | 打包方式,默认是jar,也可以是war、zip |
构建生命周期
此部分内容参考自maven声明周期详解
Maven强大的一个重要原因是它有一个十分完善的声明周期模型(lifecycle)。这个声明周期可以从两方面理解:
- 第一,运行maven的每个步骤都由它来定义,这种预设的默认行为使得我们使用maven变得简单,相比而言,ant的每个步骤都要你手工定义。
- 第二,这个模型是一种标准,在不同的项目中,使用maven的接口是一样的,这样就不用去仔细理解每个项目的构建了。
maven有三套相互独立的声明周期。分别为:
- clean lifecycle:在构建之前进行一些清理工作。
- default lifecycle:构建的核心部分,编译,测试,打包,部署等待。
- site lifecycle:生成项目报告,站点,发布站点。
每一套声明周期都由一系列的阶段(phase)组成。在一个生命周期中运行某个阶段的时候,它之前的所有阶段都会被运行。
clean生命周期的三个阶段:
- pre-clean:执行一些需要在clean之前完成的工作
- clean:移除所有上一次构建生成的文件
- post-clean:执行一些需要在clean之后立刻完成的工作
site声明周期的各个阶段:
- pre-site:执行一些需要在生成站点文档之前完成的工作。
- site:生成项目的站点文档
- post-site:执行一些需要在生成站点文档之后完成的工作,并未部署做准备
- site-deploy:将生成的站点文档部署到特定的服务器上
default生命周期:
- validate
- generate-sources
- process-sources
- generate-resources
- process-resources
- compile
- process-classes
- generate-test-sources
- process-test-sources
- generate-test-resources
- process-test-resources 复制并处理资源文件至目标测试目录
- test-compile 编译测试源代码
- process-test-classes
- test 使用合适的单元测试框架运行测试,这些测试不会被打包或部署
- prepare-package
- package 接受编译好的代码,打包成可发布的格式,如jar,war。
- pre-integration-test
- integration-test
- post-integration-test
- verify
- install 将包安装至本地仓库,以让其他项目依赖
- deploy 将最终的包复制到远程仓库,以让其他开发人员参与项目共享
构建生命周期是一组阶段的序列,每个阶段定义了目标被执行的顺序。这里的阶段是生命周期的一部分。
一个典型的Maven构建生命周期是由以下几个阶段的序列组成:
阶段 | 处理 | 描述 |
---|---|---|
prepare-resources | 资源拷贝 | 本阶段可以自定义需要拷贝的资源 |
compile | 编译 | 本阶段完成源代码编译 |
package | 打包 | 本阶段根据pom.xml中描述的打包配置创建jar/war包 |
install | 安装 | 本阶段在本地/远程仓库中安装工程包 |
构建配置文件
Profile在pom.xml中使用activeProfiles/profiles元素制定,并且可以用多种方式出发。Profile在构建时修改POM,并且为变量设置不同的目标环境。
Profile主要有三种类型:
类型 | 在哪里定义 |
---|---|
Per Project | 定义在工程POM文件pom.xml中 |
Per User | 定义在Maven设置xml文件中(%USER_HOME%/.m2/setting.xml) |
Global | 定义在Maven全局配置xml文件中(%M2_HOME%/conf/settings.xml) |
仓库
在Maven中,仓库有三种类型:
- 本地(local): Marven本地仓库保存工程所有依赖(library,plugin等)。当你运行一次Maven构建,Maven会自动下载所有依赖的jar文件到本地仓库中。
- 中央(central): 中央仓库有Maven社区提供的仓库,其中包含大量的常用的库。
- 远程(remote):如果Maven在中央仓库中欧找不到依赖的库文件,它会停止构建过程并输出错误信息到控制台。为了避免这种情况,Maven提供了远程仓库的概念,它是开发人员自己定制的仓库。包括了所需要的代码库或者其他工程中用到的jar文件。
Maven依赖搜索顺序:
当我们执行Maven构建命令时,Maven开始按照以下顺序查找依赖的库:
1. 在本地仓库中搜索
2. 在中央仓库中搜索
3. 如果远程仓库没有设置,Maven将停止并抛出错误
4. 在一个或多个远程仓库中搜索依赖的文件
依赖范围
compile、provided、runtime、test、system、import
使用maven在eclipse中创建java web项目
新建maven项目
选择next,也可以通过自定义进行创建
选择quickstart的archetype进行创建(网上很多都是选择webapp)
输入groupid和artifactid等信息
5.使用quickstart创建完成后的目录结构
选择项目的properties—>project facets—>convert to faceted form
勾选Dynamic web module,并在further configuration available中进行配置
将content directory中的内容改为src/main/webapp,并勾选自动生成web.xml。可能第一次会报错,第二次重试一次就可以了。
修改完成后的目录结构如图所示
添加resources目录结构
右键项目的properties,选择deployment assembly,点击add