Apache Maven,是一个软件(特别是Java软件)项目管理及自动构建工具,由Apache软件基金会所提供。基于项目对象模型(缩写:POM)概念,Maven能管理一个项目的构建、报告和文档等步骤。
特点
- 项目设置遵循统一的规则
- 依赖管理,实现自动更新,解决了传统项目依赖管理方式下手动查找更新依赖资源的弊端。
- 并行构建,编译速度较快
- 可以与Git等源码系统集成,实现发布管理
- 向后兼容
- 可扩展性好,可以使用插件丰富功能
功能
- 构建
- 文档生成
- 报告
- 依赖管理
- SCMs
- 发布
- 分发
- 邮件列表
项目目录结构约定
目录 | 用途 |
---|---|
${basedir} | 存放pom.xml和所有的子目录 |
${basedir}/src/main/java | 项目的java源代码 |
${basedir}/src/main/resources | 项目的资源,比如说property文件,springmvc.xml |
${basedir}/src/test/java | 项目的测试类,比如说Junit代码 |
${basedir}/src/test/resources | 测试用用的资源 |
${basedir}/src/main/webapp/WEB-INF | web应用文件目录,web项目的信息,比如存放web.xml、本地图片、jsp视图页面 |
${basedir}/target | 打包输出目录 |
${basedir}/target/classes | 编译输出目录 |
${basedir}/target/test-classes | 测试编译输出目录 |
Test.java | Maven只会自动运行符合该命名规则的测试类 |
~/.m2/repository | Maven默认的本地仓库目录位置 |
POM
pom是工程对象模型,包含了工程级的各种配置的信息。采用xml文件格式存储。放置于工程的根目录下,文件命名为pom.xml。每个工程都有且仅有一个pom文件。
配置内容
一个pom文件中,可以包含如下配置内容:
- project dependencies
- plugins
- goals
- build profiles
- project version
- developers
- mailing list
唯一标识
pom文件已project节点作为根节点,节点中拥有如下三个必不可少的子节点,用于唯一标识一个项目:
- groupId:项目组织的ID;
- artifactId:项目名称;
- version:项目版本号,用于区分不同的项目版本。
生命周期
maven中有三种标准的生命周期:clean、build(default)、site。
clean
clean 生命周期由以下三个阶段组成:
- pre-clean
- clean
- post-clean
clean生命周期负责完成项目的编译、构建结果。
default(build)
default是maven的主要生命周期,用于完成项目的构建。由23个阶段组成:
- validate 验证项目是否正确,并且所有必要的信息可用于完成构建过程
- initialize 建立初始化状态,例如设置属性
- generate-sources 产生任何的源代码包含在编译阶段
- process-sources 处理源代码,例如,过滤器值
- generate-resources 包含在包中产生的资源
- process-resources 复制和处理资源到目标目录,准备打包阶段
- compile 编译该项目的源代码
- process-classes 从编译生成的文件提交处理,例如:Java类的字节码增强/优化
- generate-test-sources 生成任何测试的源代码包含在编译阶段
- process-test-sources 处理测试源代码,例如,过滤器任何值
- test-compile 编译测试源代码到测试目标目录
- process-test-classes 处理测试代码文件编译生成的文件
- test 运行测试使用合适的单元测试框架(JUnit)
- prepare-package 执行必要的任何操作的实际打包之前准备一个包
- package 提取编译后的代码,并在其分发格式打包,如JAR,WAR或EAR文件
- pre-integration-test 完成执行集成测试之前所需操作。例如,设置所需的环境
- integration-test 处理并在必要时部署软件包到集成测试可以运行的环境
- pre-integration-test 完成集成测试已全部执行后所需操作。例如,清理环境
- verify 运行任何检查,验证包是有效的,符合质量审核规定
- install 将包安装到本地存储库,它可以用作当地其他项目的依赖
- deploy 复制最终的包到远程仓库与其他开发者和项目共享
注意:如果如果采用命令调用阶段,只有到达并包含某个阶段,某个阶段才会执行,否则不执行。
site
site生命周期通常用于创建新的文档,创建报告,部署网站等。包含四个阶段:
- pre-site
- site
- post-site
- site-deploy
maven仓库
三种Maven仓库
- local 本地库 :存储于计算机本地的一个目录,默认情况下创建在 %USER_HOME% 目录,可以通过修改maven的settings.xml文件中的localRepository属性来修改本地库的位置。maven构建项目时,会自动将项目依赖的资源(jar包等)下载到该目录中,便于在离线状态下使用。
- central 中央库 :由Maven社区提供的资源库。它包含了大量的常用程序库。不需要自行配置该仓库,需要在线使用。
- remote 远程库:自定义库包含所需的库文件或其他项目 jar 文件。用于开发者对于项目的一些私有依赖资源的补充。
依赖搜索序列
当我们执行 Maven 构建命令,Maven 依赖库按以下顺序进行搜索:
- 搜索依赖本地资源库,如果没有找到,跳到第2步,否则,如果找到那么会做进一步处理。
- 搜索依赖中央存储库,如果没有找到,则从远程资源库/存储库中,然后移动到步骤4,否则如果找到,那么它下载到本地存储库中,以备将来参考使用。
- 如果没有提到远程仓库,Maven 则会停止处理并抛出错误(找不到依赖库)。
- 远程仓库或储存库中的搜索依赖,如果找到它会下载到本地资源库以供将来参考使用,否则 Maven 停止处理并抛出错误(找不到依赖库)。
常用命令
-
mvn archetype:generate -DgroupId=<包名/项目组名称> -DartifactId=<项目名称> -DarchetypeArtifactId=<模板名>
:创建项目; -
mvn eclipse:eclipse
:将普通mvn项目转换为eclipse支持的项目; -
mvn clean
:清理项目缓存的输出; -
mvn compile
:编译项目; -
mvn package
:打包; -
mvn build
:构建项目; -
mvn test
:运行单元测试; -
mvn install
:构建并部署到本地资源库;