理解maven的核心概念

好久没进行java方面的开发了,最近又完成了一个java相关的任务,顺便重新体会了 maven 这一利器。

在使用过程中发现以前对maven的理解不够深入,借此机会重新梳理了一下maven的核心概念。相信理解了这些核心概念, 即使长时间不使用,以后再重新上手也会非常容易。

本文以类图的方式,介绍maven核心的12个概念以及相互之间的关系。

1 maven管理的目标:工程(Project)

 

maven是一个软件工程(Software Project)管理工具。 对于maven来说,一个软件工程的唯一标识是由开发者(groupId)、生成物(artifactId)、版本(version) 共同决定的。

每个工程都有一个打包类型,可以是jar, war, ear 或 pom。打包类型决定了工程最终产物的类型。 其中pom类型用于构件多模块工程。

工程之间有两种关系:依赖和聚合。

1.1 工程依赖关系

依赖关系的管理是maven最为人称道的地方。一个工程可以依赖多个其他工程, 通过工程的唯一标识(groupId+artifactId+version)可以明确指明依赖的库及版本,而且能够处理 依赖关系的传递。 maven可以指定依赖的作用范围(scope),包括以下几种:

 
scope 编译期 测试期 运行期 说明
*compile V V V 默认scope
test   V   只在测试期依赖,如junit包
provided V V   运行期由容器提供,如servlet-api包
runtime   V V 编译期间不需要直接引用
system V V   编译和测试时由本机环境提供

由于依赖关系的传递性可能会导致依赖的版本、scope等发生冲突,maven提供了仲裁机制,同时也 允许自己通过配置进行依赖管理。

1.2 工程聚合关系

前面提到pom类型用于于构件多模块工程,这体现了project之间的一种聚合关系: 将一系列小的模块聚合成整个产品。

通过聚合后的工程可以同时管理每个相关模块的构建、清理、文档等工作。 聚合关系通过在子工程中指定一个pom类型的project作为父project来定义。

2 maven的核心:生命周期和阶段

maven将工程(Project)的构建过程理解为不同的生命周期(LifeCycle)和阶段(Phase)。 在工程的构建过程中,存在着不同的生命周期,这些生命周期互相独立,之间也没有一定的顺序关系。 每个生命周期又划分为不同的阶段(Phase)。阶段之间有明确的顺序关系, 同一生命周期内的阶段必须按顺序依次执行。

maven内置了三个生命周期,并为每个生命周期内置了一些阶段。 下面列举出maven内置的生命周期及主要的阶段: 

  • default:构建(Build)
    1. validate:验证项目是否正确,所有必需的信息是否可用。
    2. compile:编译项目中的代码。
    3. test:用相关的单元测试框架测试编译后的代码,这些运行的测试并不会随项目打包和布署。
    4. package:将编译后的代码打包成相应的格式文件,如jar包。
    5. integration-test: 如果需要在一个综合环境中运行我们的测试,这个阶段将会运行和布署项目到该环境中。
    6. verify: 检查项目的包是否正确和符合要求。
    7. install:将包安装到本地maven仓库,可以让其他项目作为依赖使用该包。
    8. deploy:将包发布到远程的maven仓库,并提供给其他开发者使用。
  • clean:清理
    1. pre-clean 准备清理
    2. clean 执行清理工作
    3. post-clean 执行清理后的后续工作
  • site:生成项目文档和站点
    1. pre-site 准备生成
    2. site 生成项目站点和文档
    3. post-site 执行生成文档后的后续工作
    4. site-deploy 发布项目文档

更详细的phase说明参考: http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Lifecycle_Reference

3 功能实现:插件和Goal

Maven中定义的工程周期和阶段只是抽象的概念,不涉及具体的功能。 具体的功能由插件(Plugin)实现。一个插件可以实现多个目标(Goal)。

为了解耦插件的功能和工程阶段,实现高度的可配置性,maven规定插件只是实现目标的功能, 通过配置来决定在哪个阶段执行(Execution)哪些目标操作。 甚至可以把一个Goal绑定到多个Phase,以实现复用。

maven内置了一些默认的插件,并根据不同的工程packing类型在各个phase中默认绑定了一些goal。 下表中列出default生命周期中各阶段默认绑定的goal,其中goal按照管理使用pluginname:goalname的方式标记:

 
Pahse Plugin:Goal
process-resources resources:resources
compile compiler:compile
process-test-resources resources:testResources
test-compile compiler:testCompile
test surefire:test
package ejb:ejb/ejb3:ejb3/jar:jar/par:par/rar:rar/war:war
install install:install
deploy deploy:deploy

最后需要说明的是,maven的插件是一种packaging类型为maven-plugin的project, 可以使用maven project的依赖,配置插件等等一切特性。

4 仓库(Repository)

仓库主要用于获取工程依赖的其他工程的生成物,也可用来部署(deploy)maven工程的生成物。 生成物包括各种打包的生成物以及pom文件。

如果有必要,一个工程可以部署到多个仓库。

仓库可以分为本地库(local)和远程库(remote)。本地库通常位于本机的~/.m2/repository文件夹, 远程库最常见的是maven中央库(),此外也会有一些私服库用于企业内部。

http://repository.jboss.com/maven2/

5 小结

本文梳理了maven的核心概念,整个maven核心概念的全貌如下:

 

 
概念 说明
LifeCycle 生命周期,maven内置default,sie,clean三个生命周期
Phase 阶段,每个生命周期有不同的阶段
Plugin 插件,实现实际的构建功能
Goal 一个插件可以实现多个goal,goal具备具体的功能
Execution 通过配置,决定在某个Phase执行哪些Goal
Project maven管理的目标:软件工程,小的工程可以聚合成大工程
PackageType 为了便于管理工程,按照构建目标区分成不同的工程类型,如jar,war,ear等
Dependency 依赖,project之间存在依赖关系
DependencyScope maven对依赖定义了不同的作用范围
Management 可以配置一个工程如何管理依赖关系
Repository 仓库,存放包,分为本地库和远程库
Build 构建的动作。使用maven管理工程,主要是指定将project构建到某个phase

Author: Holbrook Wong <holbrook@holbrook.imac>

Date: 2012-12-24 09:20:24 CST

HTML generated by org-mode 6.33x in emacs 23



——————————————————————————————————————————————————————————————————————

1,项目构建自动化。
我们会发现除了编写源代码,每天工作的相当一部分时间花在了编译,运行单元测试,生成文档,打包,部署等等繁琐且不起眼的工作上,这就是构建。我们往往觉察不到这部分时间的流逝,其实,只要稍微花点心思,这一系列的工作完全是可以自动化的。
2,管理包的依赖
在这个开源的年代里,几乎任何一个Java应用都会借用一大堆第三方的开源类库,这些类库都通过依赖的方式引入到项目中来。随着依赖的增多,版本不一致,版本冲突,依赖臃肿等等问题都会显露出来。手工解决这些问题是一件枯燥乏味,确有不得不面对的事情。Maven提供了一个优秀的解决方案,它通过一个坐标系统准确定位每一个构件(Artifact),也就是用,通过一组坐标,Maven能够找到任何一个Java类库如jar文件,Maven给这个类库世界引入经纬,带来的秩序,于是我们就能借助它帮助我们有序的管理依赖,轻松的解决那些繁杂的依赖问题。
Maven给全世界的Java开发者提供了一个免费的中央仓库,在这里,我们可以找到几乎任何的流行开源类库,通过一些Maven的衍生工具如Nexus,我们还能对其进行快速得搜索。只要定位了坐标,Maven还能够帮我们自动下载。不再需要一个个的点击开源项目首页,不再需要寻找下载链接,不再需要手工的去下载。
Maven的中央仓库确实不完美,你也许会发现某个jar包出现在两个不同的路径下,这不是Maven的错,这是开源项目本身改变自身的坐标。再者,如果没有中央仓库,你将不得不去开源项目首页寻找下载链接,这不是更费事么?要知道现在有很多的Maven仓库搜索服务。无法从中央仓库找到你需要的类库?由于许可证等因素,这是完全有可能的,这时你需要做的是建立一个组织内部的仓库服务器,你会发现这会给你带来许多意想不到的好处。

———————————————————————————————————————————————————————————————————————

maven有什么【maven的核心概念】
项目对象模型(Project Object Model),
坐标(Coordinates),
项目生命周期(ProjectLifecycle),
插件(plugin)和目标(goal),
依赖管理系统(Dependency Management System),
仓库管理(Repositories)。





### Maven 核心概念模型理解 Maven 是一个强大的项目管理工具,主要用于 Java 项目的构建、依赖管理和项目信息管理。其核心概念模型主要围绕 **POM(Project Object Model,项目对象模型)** 展开,通过一系列相互关联的组件,实现了对项目的高效管理。 #### 1. **POM(项目对象模型)** POM 是 Maven核心概念,是一个以 `pom.xml` 文件形式存在的 XML 文档,位于项目的根目录中。它定义了项目的元数据、依赖关系、插件配置以及构建生命周期等信息。通过 POM,Maven 能够理解项目的结构并执行相应的构建操作。POM 不仅包含项目的基本信息,如项目名称、版本、开发者等,还包含了构建过程中所需的插件和目标 [^3]。 例如,一个简单的 `pom.xml` 文件结构如下: ```xml <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.nie</groupId> <artifactId>spring</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <name>spring</name> </project> ``` 该文件定义了项目的基本信息,如 `groupId`、`artifactId` 和 `version`,这些信息构成了项目的 **Maven 坐标**,用于唯一标识一个项目 [^2]。 #### 2. **依赖管理** Maven 的依赖管理功能允许开发者通过声明的方式管理项目所需的外部库(如 JAR 文件)。开发者只需在 `pom.xml` 文件中声明依赖项,Maven 会自动下载并管理这些依赖的版本,避免了手动管理依赖时可能出现的版本冲突问题 [^5]。 #### 3. **构建生命周期与插件** Maven 定义了一套清晰的构建生命周期,包括 `clean`、`compile`、`test`、`package`、`install` 和 `deploy` 等阶段。每个阶段都可以绑定特定的插件,用于执行相应的任务。例如,`compile` 阶段用于编译源代码,`test` 阶段用于运行单元测试,`package` 阶段用于生成可部署的包(如 JAR、WAR 文件) [^4]。 开发者可以通过简单的命令(如 `mvn clean install`)来触发整个构建流程,Maven 会自动执行所有相关的步骤,无需手动干预 [^1]。 #### 4. **项目继承与聚合** Maven 支持项目继承和聚合功能,允许开发者创建一个父项目,并在子项目中继承父项目的配置。这种机制可以减少重复配置,提高项目的可维护性。此外,聚合功能允许将多个项目组合成一个整体,便于统一管理和构建 [^3]。 #### 5. **标准化项目结构** Maven 提供了一套标准化的项目结构,确保所有 Maven 项目都遵循相同的目录布局。这种统一的结构使得开发者可以更容易地理解和维护项目,同时也简化了团队协作 [^5]。 #### 6. **仓库管理** Maven 使用本地仓库和远程仓库来存储和管理依赖项。本地仓库通常位于开发者的本地机器上,而远程仓库则可以是公司内部的私有仓库或公共仓库(如 Maven Central)。Maven 会自动从远程仓库下载所需的依赖项,并将其缓存到本地仓库中,以便后续使用 [^4]。 ### 总结 Maven核心概念模型围绕 POM 展开,通过依赖管理、构建生命周期、插件系统、项目继承与聚合等功能,提供了一种标准化、自动化的项目管理方式。这些核心概念相互关联,共同构成了 Maven 强大的项目管理能力,帮助开发者提高开发效率和项目质量 [^1]。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值