官网:https://maven.apache.org/index.html
POM 参考文档: https://maven.apache.org/pom.html
Settings 参考文档: https://maven.apache.org/settings.html
一、简介
Maven 是一个用于构建/管理任何基于Java项目的工具,其本身也是基于Java的 因此需要Java环境。其最初是为了简化 Jakarta Turbine 项目的构建而生。
其主要处理以下关心的领域:
- 使构建过程更简单:使用 Maven 并不能消除对底层机制的了解需要,但仍能使开发者规避很多细节。
- 提供统一的构建系统:Maven 使用 POM(project object model,项目对象模型)和插件集构建项目。一旦你熟悉一个 Maven 项目,则会知道所有 Maven 项目的构建。
-
提供高质量的项目信息:Maven 提供了有用的项目信息,一部分来自 POM,一部分生成自源码。(注:这部分不会太常用到,属于 reporting 模块,即通过调用 "mvn site",运行一个 Server,在网页上展示项目相关信息报告,如图所示。详情可参考: Apache Maven Site Plugin, Configuring Reports)
-
提供最佳的项目开发指导:Maven 意在收集当前最佳实践开发原则,并使其变得更简单以指导项目方向。
例如:- 目前单元测试这一最佳实践作为了指导,单元测试的规范、执行、报告在 Maven 中作为了通常构建声明周期的一部分。
- Maven 还协助项目工作流(workflow),例如发布(release)和问题管理(issue management)。
-
Maven 在项目目录结构的布局上也给出了一些指导建议,一旦你熟悉了这布局,可以很容易游览其他Maven项目。
Maven 在项目布局上较为坚持,虽然 Maven 设计为了灵活适应不同项目的需要,但它不可能在不影响目标的情况下满足每一种不寻常结构的项目。因此若不能被重新组织,可能不得不放弃一些特性或Maven使用。
二、安装
-
系统要求:
- Maven 3.3+ 需要 JDK1.7
- JAVA_HOME 环境变量确保指向了JDK目录
-
下载/安装:
2.1 Maven 官方提供现成 binary 分发: https://maven.apache.org/download.cgi
2.2 解压后将 bin 目录添加进 PATH 即可
三、简单使用
-
利用原型(Archetype)生成简易项目结构:
1.1 在 PowerShell中执行:mvn archetype:generate "-DgroupId=com.mycompany.app" "-DartifactId=my-app" "-DarchetypeArtifactId=maven-archetype-quickstart" "-DarchetypeVersion=1.4" "-DinteractiveMode=false"
1.2 修改"pom.xml"添加以下内容,声明 Java源码版本信息<properties> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> </properties>
-
进入目录,并打包成 jar
cd maven-sample mvn package //mvn会自动下载打包所需组件
-
执行测试
java -cp .\target\maven-sample-1.0-SNAPSHOT.jar top.simpleito.demo.App
四、主要模块/知识
1. 标准目录布局(Standard Directory Layout)
https://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html
注:
- 标准目录布局同时也是用 Maven 构建的默认值,比如哪里是java源码,测试目录在哪,输出目录是什么等等。
- 以下有些描述暂时觉得模糊也没关系,一些部分并不常见 笔者也没用过,像 it / filters / site / assembly等,临时有大致概念即可。
- 从官方示例看,java 源码包结构只要求和 groupId 相同即可,而不要求加一层 artifectId 的父包。但实际项目各种都有
maven-project
├───pom.xml 项目描述文件,定义在生命周期中所需的依赖和所需模块等等
├───README.txt 项目说明
├───NOTICE.txt 项目中使用第三方库的资料
├───LICENSE.txt 许可文件
└───src 包含构建项目所需所有资料,site等等
├───main 最重要的目录,所有工件(artifect)都应出现在这里
│ ├───java 工件Java源码
│ ├───resources 配置及资源等文件
│ ├───filters 包含在构建阶段将值注入到resources目录下配置属性的文件
│ └───webapp 对于web应用,包含诸如JS/CSS/HTML等资源文件
├───test 所有测试代码及资源
│ ├───java
│ ├───resources
│ └───filters
├───it 通常是用于 Maven Failsafe Plugin 的集成测试
├───site 使用 Maven Site Plugin(https://maven.apache.org/plugins/maven-site-plugin/index.html) 创建的site文档
└───assembly 二进制打包装配配置,一般也不常用适用 Apache Maven Assembly Plugin
└───target 用于容纳 build 的所有输出
2. POM(Project Object Model,项目对象模型)
https://maven.apache.org/guides/introduction/introduction-to-the-pom.html
POM 是 Maven 中的基本工作单元,它是一个 XML 文件,包含了"项目有关信息"和"配置Maven构建项目的细节"。
当执行一个任务时,Maven 会在当前目录寻找 POM 文件,从而读取所需的配置信息。
POM 中可以指定许多信息,包括:
- 依赖(dependencies)、插件(plugins) 或 可被执行的目标(goal)、构建配置(profiles)等。
- 以及关于项目的本身的信息,如 版本(version)、说明(description)、开发人员(developers)等
需注意的是:POM 中的<groupid>:<artifactId>:<version>
构成了该工件的完全限定名
关于 POM、Super POM、最小POM等更多信息参考:Maven POM 详解
3. Settings(Maven本身设置)
https://maven.apache.org/settings.html
settings.xml 包含对 Maven 自身的配置,不应绑定到任何特定项目分发给用户。主要包含:本地储存库,代理,身份验证信息等等。
该配置文件可能存在两个位置:
- 全局的设置:${maven.home}/conf/settings.xml
- 用户级设置:${user.home}/.m2/settings.xml 【默认情况下可能不存在,可copy全局过来修改】
若都存在,则内容将被合并作用。优先级:用户级 > 全局
配置详情参考:Maven Settings
4.Build Lifecycle(构建生命周期)
https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
Maven 基于生命周期的概念,意味着构建(build)和分发(distributing)特定工件的过程得以清晰定义,意味着只需学习一小组命令,即可构建任何 Maven 项目。
有三种内置构建生命周期(build lifecycle):默认(default)、清理(clean)、site
需注意:
- 构建生命周期由构建阶段(build phases)组成,每个阶段都是生命周期中的一个步骤(stage),
- Maven 命令格式:mvn [options] [<goal(s)>] [<phase(s)>],可按需执行某个 phase
- build phase 将按顺序执行,例如若执行 mvn install,将会执行在此之前的所有 phase
-
build phase 又是由声明插件所引入的插件目标(plugin goals)组成的。
一个 plugin goal 代表一个特定的任务(比phase更精细),它可能被绑定到零个或多各 build phase,不绑定的 plugin goal 可在 build lifecycle 之外直接自行执行
以 default 声明周期为例,主要包含以下 phase:完整的请参考 Lifecycle Reference
- validate:验证项目是否正确,所有必要信息是否提供
- compile:编译项目源码
- test:使用合适的单元测试框架测试编译后的源码。这些测试代码不要求被打包或部署
- package:将编译后的代码打包为分发格式,例如 JAR
- verify:运行继承测试的所有检查,以确保符合标准
- install:将 package 安装到 Locale Repository(本地仓储),用作其他项目依赖
- deploy:将最终 package 复制到 Remote Repository(远程仓储)
附/参考:
- 常见问题/需求QA: https://maven.apache.org/guides/getting-started/index.html#sections
- Maven 官方入门指南: https://maven.apache.org/guides/getting-started/maven-in-five-minutes.html
- Baeldung 关于 Standard Directory Layout 介绍文章(Maven官方介绍不好看): https://www.baeldung.com/maven-directory-structure
关于Archetype更多可参考文档,但不太常用: https://maven.apache.org/archetype/maven-archetype-plugin/index.html