登录后台

页面导航

本文编写于 2314 天前,最后修改于 1236 天前,其中某些信息可能已经过时。

Maven 介绍

Apache Maven是一个软件项目管理和综合工具。基于项目对象模型(POM)的概念,Maven可以从一个中心资料片管理项目构建,报告和文件。

Maven是一个采用纯Java编写的开源项目管理工具。Maven采用了一种被称之为project object model (POM)概念来管理项目,所有的项目配置信息都被定义在一个叫做POM.xml的文件中,通过该文件,Maven可以管理项目的整个声明周期,包括编 译,构建,测试,发布,报告等等。

Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具。由于 Maven 的缺省构建规则有较高的可重用性,所以常常用两三行 Maven 构建脚本就可以构建简单的项目。由于 Maven 的面向项目的方法,许多 Apache Jakarta 项目发文时使用 Maven,而且公司项目采用 Maven 的比例在持续增长。

Maven 和 Ant 的不同

MavenAnt
标准构建文件project.xmlmaven.xmlbuild.xml
特性处理顺序${maven.home}/bin/driver.properties ${project.home}/project.properties ${project.home}/project.properties ${project.home}/project.properties ${project.home}/project.properties ${project.home}/build.properties ${user.home}/build.properties 通过 -D 命令行选项定义的系统特性 最后一个定义起决定作用。通过 -D 命令行选项定义的系统特性 由 任务装入的特性 第一个定义最先被处理。
构建规则构建规则更为动态(类似于编程语言);它们是基于 Jelly 的可执行 XML。构建规则或多或少是静态的,除非使用<script>任务。
扩展语言插件是用 Jelly(XML)编写的。插件是用 Java 语言编写的。
构建规则可扩展性通过定义 <preGoal> 和 <postGoal> 使构建 goal 可扩展。构建规则不易扩展;可通过使用 <script> 任务模拟 <preGoal> 和 <postGoal> 所起的作用。

Maven 的常用命令

  • mvn -version 查看 Maven版本
  • mvn archetype:generate 创建Maven项目
  • mvn compile 编译源代码
  • mvn deploy 发布项目
  • mvn test-compile 编译测试源代码
  • mvn test 运行应用程序中的单元测试
  • mvn site 生成项目相关信息的网站
  • mvn clean 清除项目目录中的生成结果
  • mvn package 根据项目生成的jar
  • mvn install 在本地Repository中安装jar
  • mvn eclipse:eclipse 生成eclipse项目文件
  • mvnjetty:run 启动jetty服务
  • mvntomcat:run 启动tomcat服务
  • mvn clean package -Dmaven.test.skip=true: 清除以前的包后重新打包,跳过测试类

Maven 的下载安装

下载地址

官网下载地址:http://maven.apache.org/release-notes-all.html

准备工作

Apache Maven 是使用纯 Java 开发的,因此需要提前安装好 Java 运行环境并设置好环境变量 JAVA_HOME

解压安装及设置

将下载好的 Maven 文件,解压到任意目录。

添加环境变量

  • Windows
    打开计算机属性 > 系统属性 > 高级 > 环境变量
    在系统变量中新建 M2_HOME 变量,值为解压的Maven目录
    修改系统变量 path,添加 %M2_HOME%\bin
  • Linux
    修改 /etc/profile 文件,在尾部添加以下内容:

    MAVEN_HOME=/usr/local/maven # Maven 解压路径
    export MAVEN_HOME
    export PATH=${PATH}:${MAVEN_HOME}/bin

    使用 source 命令更新环境变量

    source /etc/profile

使用 mvn -version 命令来验证是否安装成功

Maven 的基本配置

修改 Maven 本地库目录

默认位置

  • Windows:~/.m2
  • Linux:C:\Documents and Settings{用户名}.m2

修改配置文件 setting.xml,该文件默认在maven解压路径下的 conf 文件夹下,找到<localRepository>标签,取消其注释,修改本地库目录。

<localRepository>/usr/local/maven-repository</localRepository>

修改中央仓库地址

修改配置文件 setting.xml,找到<mirror>标签,取消其注释,修改中央仓库地址。

<mirror>
    <id>nexus-aliyun</id>
    <mirrorOf>*</mirrorOf>
    <name>Nexus aliyun</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

启用代理访问

修改配置文件 setting.xml,找到<proxy>标签,取消其注释,修改代理访问参数,启动代理访问。

<proxy>
    <id>optional</id>
    <active>true</active>
    <protocol>http</protocol>
    <username>proxyuser</</username>
    <password>proxypass</password>
    <host>proxy.host.net</host>
    <port>80</port>
    <nonProxyHosts>local.net|some.host.com</nonProxyHosts>
</proxy>

Maven 的基本目录

Maven 的基本目录如下:

src
|----main
|----|----java
|----|----|----package
|----test
|----|----java
|----|----|----package
|----resources

Maven 创建目录的方式

  1. 手动创建上述目录结构
  2. archetype:generate 按照提示进行输入创建
  3. archetype:generate -DgroupId=${groupId} -DartifactId=${artifactId} -Dversion={version} -Dpackage={Dpackage}

    • DgroupId:组织名,一般是公司域名的反写
    • DartifactId:一般为 项目名-模块名
    • Dversion:版本名
    • Dpackage:项目的包名

Maven 生命周期

一个完整的项目构建过程包括:清理编译测试打包集成测试验证部署

Maven强大的一个重要的原因是它有一个十分完善的生命周期模型(lifecycle),这个生命周期可以从两方面来理解,第一,顾名思义,运行Maven的每个步骤都由它来定义的,这种预定义的默认行为使得我们使用Maven变得简单,相比而言,Ant的每个步骤都要你手工去定义。第二,这个模型是一种标准,在不同的项目中,使用Maven的接口是一样的,这样就不用去仔细理解每个项目的构建了,一般情况下,mvn clean install 这样的命令是通用的。

Maven有三个相互独立的生命周期

  • Clean Lifecycle:在进行真正的构建之前进行一些清理工作;

    • pre-clean:执行清理前的工作
    • clean:清理上一次构建生成的所有文件
    • post-clean:执行清理后的文件
  • Default Lifecycle:构建的核心部分,编译,测试,打包,部署等等,包含:compile test package install 等命令;
  • Site Lifecycle:生成项目报告,站点,发布站点;

    • pre-site:在生成项目站点前要完成的工作
    • site: 生成项目的站点文档
    • post-site:在生成项目站点后要完成的工作
    • site-deploy:发布生成的站点文档到服务器上

运行任何一个阶段的时候,在它前面的所有阶段都会被运行,例如运行 mvn install 的时候,代码会被编译,测试,打包。

pom.xml

POM代表项目对象模型。它是 Maven 中工作的基本单位,这是一个 XML 文件。它始终保存在该项目基本目录中的 pom.xml 文件。

POM 包含的项目是使用 Maven 来构建的,它用来包含各种配置信息。

POM 也包含了目标和插件。在执行任务或目标时,Maven 会使用当前目录中的 POM。它读取POM得到所需要的配置信息,然后执行目标。

<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">
   <!-- -->
   <!-- 指定当前pom的版本 -->
   <modelVersion>4.0.0</modelVersion>
   <!-- 域名反写 + 项目名 -->
   <groupId>com.yeskery.sprout</groupId>
   <!-- 项目名 + 模块名 -->
   <artifactId>sprout-core</artifactId>
   <!-- 版本名 -->
   <version>0.0.1-SNAPSHOT</version>
   <!-- 打包方式 默认为jar 其它值 war zip pom -->
   <packing>jar</packing>
   <!-- 项目描述名称 -->
   <name></name>
   <!-- 项目地址 -->
   <url></url>
   <!-- 项目描述 -->
   <description></description>
   <!-- 项目开发人员-->
   <developers></developers>
   <!-- 许可证 -->
   <licenses></licenses>
   <!-- 组织 -->
   <organization></organization>
   <!-- 子模块继承父模块 -->
   <parent></parent>
   <!-- 配置常量 -->
   <properties></properties>
   <!-- 依赖列表 -->
   <dependcies>
      <!-- 设置依赖是否可选 -->
      <option></option>
      <!-- 排除依赖传递列表 -->
      <exclusions></exclusions>
      <!-- 依赖 -->
      <dependency></dependency>
   </dependcies>
   <!-- 依赖的管理 -->
   <dependciesManagement></dependciesManagement>
   <!-- 构建 -->
   <build>
      <!-- 插件列表 -->
      <plugins></plugins>
   </build>
   <!-- 聚合多个模块 -->
   <modules></modules>
<project>

依赖的 <scope> 设置

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <scope>test</scope>
</dependency>

Maven 有三种范围的classpath

  1. 编译
  2. 测试
  3. 运行

通过 <scope> 的值,可以确定该依赖在什么阶段进行导入到classpath中。

<scope> 的值有以下几种:

  1. compile默认的范围,在编译测试运行范围下都有效;
  2. provided:在编译测试范围有效;
  3. runtime:在测试运行范围有效;
  4. test:只在测试范围有效;
  5. system:与本机系统相关联,可移植性差;
  6. import:导入的范围,只使用在<dependciesManagement>中,表示从其它pom中导入 dependcy 配置。

依赖冲突

在依赖设置中,经常会出先依赖冲突,尤其在通用工具类、日志类依赖中出现。

在Maven中,处理冲突有两个原则:

  1. 短路径优先原则

    A > B > C-1.0.jar
    A > C-1.1.jar

    在上述情况中,最终生效的依赖是C-1.1.jar

  2. 先声明优先原则

    A > B > C-1.0.jar
    A > B > C-1.1.jar

    在上述情况中,最终生效的依赖是C-1.0.jar

Maven 在 IDE 中的使用

Eclipse

在新版本的 Eclipse 中,已经内置了 Maven ,不需要额外的下载。

IntelliJ IDEA

在 IDEA 中,已经内置了 Maven ,不需要额外的下载。

部分内容参考以下文章:

  1. https://baike.baidu.com/item/Maven/6094909
  2. http://juvenshun.iteye.com/blog/213959
  3. http://www.yiibai.com/maven/