Maven是Apache基金会提供的项目管理工具, 其采用项目对象模型(Project Object Model, POM)描述项目配置, 并使用生命周期模型管理构建过程中各种操作.

POM

maven使用pom.xml来管理项目, 该文件通常位于项目的根目录中:

<?xml version="1.0" encoding="UTF-8"?>
<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.example</groupId>
<artifactId>sample</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
</project>

pom.xml的根元素为<project>元素, project元素需要三个字段来唯一标识项目:

  • 工程组<groupId>, 开发者的唯一标识
  • 构件名<artifactId>, 项目名.
  • 版本号<version>

这三个字段对于任何pom.xml来说都是不可或缺的.

在maven中每个项目被称为一个构件(artifact), 三个字段用于唯一标识构件. maven中每个依赖项都是构件, 我们开发的项目也是构件, 便于被其它项目引用.

SuperPOM

可以通过配置<parent>元素来指定另一个POM作为SuperPOM, 当前POM会继承SuperPOM的配置, 当前POM中的元素会覆盖SuperPOM中的同名配置项:

<?xml version="1.0" encoding="UTF-8"?>
<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.example</groupId>
<artifactId>sample</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version> <parent>
<artifactId>sample-parent</artifactId>
<groupId>com.example</groupId>
<version>1.0</version>
</parent>
</project>

Module

Maven可以将项目分为多个模块(Module), 每个Module包含一个pom.xml文件独立的进行配置管理:

<?xml version="1.0" encoding="UTF-8"?>
<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.example</groupId>
<artifactId>sample-parent</artifactId>
<packaging>pom</packaging>
<version>1.0</version> <modules>
<module>service</module>
<module>sample</module>
<module>util</module>
</modules> </project>

注意父模块的打包方式只能是pom, 不能是jarwar.

Properties

pom.xml中可以定义<property>

<properties>
<java.version>1.8</java.version>
<junit.version>4.12</junit.version>
</properties>

使用propery避免硬编码:

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>

生命周期

maven使用生命周期的概念来管理构建中的各种操作. maven定义了三个周期(lifecycle), 每个周期分为若干阶段(phase):

  • clean生命周期: 构建前的清理工作

    • pre-clean阶段: 清理前要做的工作
    • clean阶段: 清理上一次构建生成的文件
    • post-clean阶段: 清理后要做的工作
  • build生命周期: 构建生命周期, 又称default生命周期
    • validate阶段: 检查配置是否正确
    • compile阶段: 编译工程源码, 此阶段前会进行代码生成, 拷贝资源等阶段(操作).
    • test-compile阶段: 编译测试源码
    • test阶段: 执行测试代码
    • package阶段: 将项目打包, 如jar, war等.
    • verify阶段: 检查发布包是否合格
    • install阶段: 将发布包安装到本地仓库中, 可以作为其它项目的依赖
    • deploy 阶段: 将包发布到远程仓库, 以共享给其它项目或工程
  • site生命周期: 生成报告, 部署站点
    • pre-site阶段
    • site阶段
    • post-site阶段
    • site-deploy阶段

常用的mvn clean命令将会执行clean生命周期的pre-clean和clean阶段, 而mvn package命令则执行build周期的validate到package阶段.

也就是说mvn <phase>命令会从相应生命周期的第一个阶段执行到指定指定的阶段.

每个阶段的具体操作由插件(plugin)来执行, 每个插件可以完成一个或多个目标(goal), 每个阶段可以依次绑定0个或若干个目标.

也就是说, maven通过目标(goal)将具体操作和抽象的阶段绑定. 如maven-compiler-plugin插件的两个目标:compiler:compilecompiler:test-compile分别与compiletest-compile阶段绑定.

依赖管理

依赖管理是maven的重要功能, 它通过仓库管理依赖的jar包. maven仓库有三种类型:

  • 本地仓库: 本地仓库是本地保存jar包的目录. 对于linux和os x系统, 本地仓库地址一般为~/.m2/repository
  • 远程仓库: 若本地仓库中没有包含某个依赖包, maven可以从远程仓库中下载依赖包到本地仓库.
  • 中央仓库: 中央仓库是maven社区维护的远程仓库, 保存了大量依赖包, 不需要配置即可访问.

<project>下的<dependencies>子节点用于配置当前module依赖的构件(jar包):

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
</dependencies>

同样用<groupId>, <artifactId><version>来唯一指定依赖的构件.

DependencyManagement

在多模块(Module)项目中, 即使<property>也难以避免不同模块依赖同一构件不同版本的问题. 更优雅的解决方案是在SuperPOM中使用<dependencyManagement>.

<!-- super pom -->
<dependencyManagement>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
</dependencyManagement>

在当前pom中不需要指定依赖的版本:

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>

当前pom会从本文件开始逐层向上搜索DependencyManagement, 以确定依赖版本号.

依赖分析

通常maven中每个依赖项都是一个maven构件, 它们也会依赖其它的构件. 因此在pom.xml中定义的依赖关系会形成树状结构.

maven-dependency-plugin插件提供了一些便利的依赖分析与管理工具:

  • mvn dependency:tree: 以显示依赖的树状结构
  • mvn dependency:analyze: 分析声明的依赖是否被实际使用

exclude

不同的maven构件可能依赖同一个包的不同版本, 这种树状结构给依赖管理带来严峻挑战. <dependency>节点下的<exclude>元素用于排除依赖配置.

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

上述配置要求maven忽略SpringBoot默认的starter-tomcat换用starter-jetty, 在构建时将不会安装spring-boot-starter-tomcat而是在classpath中寻找合适的替代.

于是我们在自己的pom中定义了starter-jetty依赖, 在构建时将会搜索到starter-jetty作为starter-tomcat的替代.

构建管理

<project>节点下的<build>节点用于配置构建过程中各种参数:

<build>
<directory>target</directory>
<outputDirectory>target/classes</outputDirectory>
<testOutputDirectory>target/test-classes</testOutputDirectory>
<finalName>${project.artifactId}-${project.version}</finalName>
<sourceDirectory>src/main/java</sourceDirectory>
<testSourceDirectory>src/test/java</testSourceDirectory>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>src/test/resources</directory>
</testResource>
</testResources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
</plugins>
</build>

上述示例中配置了源码和资源目录的位置以及所需的插件. 和<dependency>一样, <plugin>也可以通过Management来管理:

<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>

profile

我们经常会遇到在调试和生产环境中使用不同配置的情况, maven的profile功能可以满足需求:

<project>
<profiles>
<profile>
<id>debug</id>
<properties>
<start-class>com.example.DebugMain</start-class>
<final-name>debug-sample</final-name>
</properties>
</profile> <profile>
<id>online</id>
<properties>
<start-class>com.example.AppMain</start-class>
<final-name>sample</final-name>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
</profiles>
</project>

只有被激活的profile中的配置才是有效的. activeByDefault可以设置profile是否默认激活, maven命令中的-P <profile>,<profile>选项可以设置在执行命令过程中激活的profile. 此外profile也可以根据环境决定是否激活.

Maven快速指南的更多相关文章

  1. [译] MongoDB Java异步驱动快速指南

    导读 mongodb-java-driver是mongodb的Java驱动项目. 本文是对MongoDB-java-driver官方文档 MongoDB Async Driver Quick Tour ...

  2. 【SFA官方翻译】使用 Kubernetes、Spring Boot 2.0 和 Docker 的微服务快速指南

    [SFA官方翻译]使用 Kubernetes.Spring Boot 2.0 和 Docker 的微服务快速指南 原创: Darren Luo SpringForAll社区 今天 原文链接:https ...

  3. Maven入门指南

    Maven入门指南 本指南旨在第一次为使用Maven的人员提供参考,但也打算作为一本包含公共用例的独立参考和解决方案的工具书.对于新用户,建议您按顺序浏览该材料.对于更熟悉Maven的用户,本指南致力 ...

  4. maven权威指南学习笔记(五)—— POM

    1. 简介 Archetype插件通过 pom.xml 文件创建了一个项目.这就是项目对象模型 (POM),一个项目的声明性描述. 当Maven运行一个目标的时候,每个目标都会访问定 义在项目POM里 ...

  5. maven权威指南学习笔记(一)——简介

    maven是什么?有什么用? Maven是一个项目管理工具,它包含了     一个项目对象模型 (Project Object Model),     一组标准集合,     一个项目生命周期(Pro ...

  6. 转:C++ Boost/tr1 Regex(正则表达式)快速指南

    C++ Boost/tr1 Regex(正则表达式)快速指南 正则表达式自Boost 1.18推出,目前已经成为C++11(tr1)的标准部分. 本文以Boost 1.39正则表达式为基础,应该广泛适 ...

  7. (译)快速指南:用UIViewPropertyAnimator做动画

    翻译自:QUICK GUIDE: ANIMATIONS WITH UIVIEWPROPERTYANIMATOR 译者:Haley_Wong iOS 10 带来了一大票有意思的新特性,像 UIViewP ...

  8. (4)Maven快速入门_4在Spring+SpringMVC+MyBatis+Oracle+Maven框架整合运行在Tomcat8中

    利用Maven 创建Spring+SpringMVC+MyBatis+Oracle 项目 分了三个项目  Dao   (jar)   Service (jar)   Controller (web) ...

  9. (1)Maven快速入门_1maven安装

    Maven 快速入门 1.1 Maven官网下载     windows 系统 下载 下图红色框选处. 下载到本地解压, 创建一个本地maven仓库的目录 maven_lib 配置Maven的环境变量 ...

随机推荐

  1. 微信小程序之页面跳转路径问题

    错误如下: 业务需求:在movie页面点击进入detail页面. 在遍历跳转路径的时候,写绝对路径了 只需改一下就好了 教程参考地址:http://blog.csdn.net/reylen/artic ...

  2. window下eclipse4.5+hadoop2.6.1开发环境配置

    1.准备: eclipse4.5,hadoop2.6.1,hadoop-eclipse-plugin-2.6.0.jar. 2.eclipse配置 eclipse->windows->Pr ...

  3. Description has only two Sentences(欧拉定理 +快速幂+分解质因数)

    Description has only two Sentences Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 ...

  4. 最最简单的CentOs6在线源搭建

    非常实用的在线源搭建,只要4步骤 1.点击进入http://mirrors.aliyun.com/repo/epel-6.repo ,这是阿里云的源 2.复制所有的代码  ctrl+a,ctrl+c ...

  5. Mysql修改已有数据的字符集

    Mysql修改已有数据的字符集 问题 在生产环境中跑了很久,发现MysqlClient连接的字符集是默认的latin1,我们一直以为都是utf8,造成这样的误解,是因为在内网环境中,我们是源码编译的M ...

  6. Pandas常用函数入门

    一.Pandas Python Data Analysis Library或Pandas是基于NumPy的一种工具,该工具是为了解决数据分析任务而创建的.Pandas纳入了大量库和一些标准的数据模型, ...

  7. 基于webpack搭建的vue+element-ui框架

    花了1天多的时间, 终于把这个框架搭建起来了. 好了, 不多说了, 直接进入主题了.前提是安装了nodejs,至于怎么安装, 网上都有教程. 这里就不多说了, 这边使用的IDE是idea.1.在E:/ ...

  8. KVM管理平台openebula安装

    1.1opennebula控制台的安装 (如果要添加映像需要给200G以上给/var/lib/one,本文是共享/var/lib/one实现监控,用映像出创建虚拟机原理是从opennebula控制平台 ...

  9. 微信公众号jssdk自定义分享,二次分享自定义失败解决技巧

    百度上自定义微信分享标题以及描述的解决方法有很多,基本上都能实现一次分享:流程基本上是这样的 1.首先引入微信jssdk =><script src="http://res.wx ...

  10. 检测应用的内存泄漏情况(shell)

    写代码--调试--修BUG 改来改去可能还存在一些没发现的问题,在工程量大的时候更容易出现,例如内存泄漏这样的问题,严重影响着系统性能. 网上有些检测C程序是否存在内存泄漏的工具还不错的,例如valg ...