简介
Apache Maven是一个软件项目管理和理解工具。基于项目对象模型(POM)的概念,Maven可以从中央信息管理项目的构建,报告和文档。官方网站
生命周期
在 Maven 中,有三套相互独立的生命周期,分别是 clean、default 和 site。每个生命周期都包括多个阶段,后一个阶段依赖前一个阶段,执行一个阶段会执行它之前的所有阶段。
- clean:清理项目
- default:构建项目
- site:建立项目站点
clean
更详细的可以参见官网对生命周期的描述。官网生命周期描述
| 阶段 | 描述 |
|---|---|
| pre-clean | 在实际项目清理之前执行所需的过程 |
| clean | 删除上一版本生成的所有文件 |
| post-clean | 执行完成项目清理所需的过程 |
default
| 阶段 | 描述 |
|---|---|
| validate | 验证项目正确无误,并提供所有必要的信息 |
| initialize | 初始化构建状态,例如设置属性或创建目录 |
| generate-sources | 生成任何要包含在编译中的源代码 |
| process-sources | 处理源代码,例如过滤任何值 |
| generate-resources | 生成资源以包含在包中 |
| process-resources | 将资源复制并处理到目标目录中,以备打包 |
| compile | 编译项目的源代码 |
| process-classes | 对编译后生成的文件进行后处理,例如对Java类进行字节码增强 |
| generate-test-sources | 生成任何测试源代码以包含在编译中 |
| process-test-sources | 处理测试源代码,例如过滤所有值 |
| generate-sources | 生成任何要包含在编译中的源代码 |
| generate-test-resources | 创建测试资源 |
| process-test-resources | 将资源复制并处理到测试目标目录中 |
| test-compile | 将测试源代码编译到测试目标目录中 |
| process-test-classes | 从测试编译中对生成的文件进行后处理,例如对Java类进行字节码增强。对于Maven 2.0.5及更高版本 |
| test | 使用合适的单元测试框架运行测试。这些测试不应要求打包或部署代码 |
| prepare-package | 在实际包装之前执行准备包装所需的任何操作。这通常会导致包装的未包装,已处理版本。(Maven 2.1及更高版本) |
| package | 获取编译后的代码,并将其打包为可分发格式,例如JAR |
| pre-integration-test | 在执行集成测试之前执行所需的操作。这可能涉及诸如设置所需环境的事情 |
| integration-test | 处理该程序包,并在必要时将其部署到可以运行集成测试的环境中 |
| post-integration-test | 在执行集成测试后执行所需的操作。这可能包括清理环境 |
| verify | 运行任何检查以确认包装有效并符合质量标准 |
| install | 将软件包安装到本地存储库中,以作为本地其他项目中的依赖项 |
| deploy | 在集成或发行环境中完成后,将最终程序包复制到远程存储库,以便与其他开发人员和项目共享 |
site
| 阶段 | 描述 |
|---|---|
| pre-site | 在实际项目站点生成之前执行所需的过程 |
| site | 生成项目的站点文档 |
| post-site | 执行完成站点生成并为站点部署做准备所需的过程 |
| site-deploy | 将生成的站点文档部署到指定的Web服务器 |
命令
更详细的请参考官方描述
| 命令 | 描述 |
|---|---|
| mvn clean | 清理临时文件(例如target) |
| mvn compile | 编译(例如src/main/java) |
| mvn test | 测试(例如src/test/java/下junit的测试用例) |
| mvn package | 打包(target目录生成jar或war等文件) |
| mvn install | 将打包的jar/war文件复制到你的本地仓库中,供其他模块使用 |
| mvn deploy | 将打包的文件发布到远程参考,提供其他人员进行下载依赖 |
| mvn site | 生成项目相关信息的网站 |
| mvn eclipse:eclipse | 将项目转化为Eclipse项目 |
| mvn dependency:tree | 打印出项目的整个依赖树 |
| mvn archetype:generate | 创建Maven的普通java项目 |
| mvn tomcat:run | 在tomcat容器中运行web应用 |
| mvn jetty:run | 调用 Jetty 插件的 Run 目标在 Jetty Servlet 容器中启动 web 应用 |
| mvn package -Dmaven.test.skip=true | 打包但是不测试 |
profile
配置动态打包
- 配置
<profiles>
<profile>
<!-- 开发环境 -->
<id>dev</id>
<properties>
<profiles.active>dev</profiles.active>
</properties>
<activation>
<!-- 默认激活 -->
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<!-- 测试环境 -->
<id>beta</id>
<properties>
<profiles.active>beta</profiles.active>
</properties>
</profile>
<profile>
<!-- 发布环境 -->
<id>prod</id>
<properties>
<profiles.active>release</profiles.active>
</properties>
</profile>
</profiles>
<resources>
<resource>
<directory>src/main/resources</directory>
<!--先全部排除-->
<excludes>
<exclude>application*.properties</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/resources</directory>
<!--打包相应的配置文件-->
<filtering>true</filtering>
<includes>
<include>application.properties</include>
<include>application-${profile.active}.properties</include>
</includes>
</resource>
</resources>
- 命令
mvn clean package -P<profile_name>
POM
| 标签 | 描述 |
|---|---|
| project | 所有Maven pom.xml文件中的顶级元素 |
| modelVersion | 对象模型的版本 |
| groupId | 项目的组织或组的唯一标识符(通常域名倒置) |
| artifactId | 项目名称 |
| packaging | 打包类型(例如JAR,WAR,EAR等) |
| version | 项目版本 |
| name | 指示用于项目的显示名称。这通常在Maven的生成文档中使用 |
| url | 指示可以在哪里找到项目的站点。这通常在Maven的生成文档中使用 |
| description | 项目的基本描述 |
| type | 项目类型 |
| scope | 参与到哪个阶段(例如test表示仅仅参与到测试) |
常见属性
scope属性
| 属性 | 描述 |
|---|---|
| compile | 默认配置,适用于所有阶段,会随着项目一起发布 |
| provided | 同compile,只是在打包阶段exclude |
| runtime | 同compile,不参与编译,运行时加载 |
| test | 只在测试时使用,用于编译和运行测试代码。不会随项目发布 |
| system | 配合systemPath,从本地系统获取jar |
- Optional & Exclusions
- Optional:Project-A -> Project-B -> Project-C, Project-C中使用true,可以传递到Project-B,无法传递到Project-A(需主动依赖)
- Exclusions:排除传递过来的依赖
版本号说明
- 语义化的版本控制
- 2.1.9.RELEASE
- 2 :主版本
- 1 :次版本(功能增删但保持兼容)
- 9 :增量版(bug修复)
- RELEASE :SNAPSHOT:开发版 -> M: 里程碑 -> RELEASE: 正式版
- 2.1.9.RELEASE
- Release Trains(Spring Cloud)
- Greenwich.SR1
- Greenwich: A->G,所以是第七代(伦敦地铁站名)
- SR1: Service Release 1 正式版的第一个bug修复版本
- Greenwich.SR1
最后
文章若有谬误之处,希望广大读者指正,互相交流,共同提高。