Apache Maven,是一个软件(特别是 Java 软件)项目管理及自动构建工具,由 Apache 软件基金会所提供。基于项目对象模型(POM)概念,Maven 利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。曾是 Jakarta 项目的子项目,现为独立 Apache 项目。
现在有很多 Apache 项目都已经开始采用 Maven 进行管理。
本篇文章简单介绍了 Maven 的相关知识,以及在 Linux 下的安装与使用方法。如果需要进一步了解 Maven,请移步 Maven 官网。http://maven.apache.org
安装 Maven
Maven 的下载地址:http://maven.apache.org/download.cgi
这里以最新的
3.2.3 版本为例进行安装,在这之前需要确保机器上已经安装了 JDK。
首先下载 Maven 并解压,并移动到 usr/local 目录下
$ wget http://mirror.bit.edu.cn/apache/maven/maven-3/3.2.3/binaries/apache-maven-3.2.3-bin.tar.gz
$ tar vxf apache-maven-3.2.3-bin.tar.gz
$ mv apache-maven-3.2.3 /usr/local/maven3
修改环境变量,在 /etc/profile 中添加以下几行
MAVEN_HOME=/usr/local/maven3
export MAVEN_HOME
export PATH=${PATH}:${MAVEN_HOME}/bin
记得执行 source /etc/profile
使环境变量生效。
最后运行 mvn -v
验证 maven 是否安装成功,如果安装成功会打印如下内容
Apache Maven 3.2.3 (33f8c3e1027c3ddde99d3cdebad2656a31e8fdf4; 2014-08-12T04:58:10+08:00)
Maven home: /usr/local/maven3
Java version: 1.7.0_65, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-7-openjdk-amd64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.13.0-35-generic", arch: "amd64", family: "unix"
使用 Maven 创建项目
无论是学习语言还是框架,先来一个 Hello World 基本上已经是套路了,我们也通过构建一个 Hello World 项目来了解如何使用 Maven。
首先通过 maven 创建
helloworld 项目:
$ mvn archetype:create -DgroupId=helloworld -DartifactId=helloworld
生成的项目目录如下,其中 src/main/java 是源码目录,src/test/java 是测试文件目录。
一共只有三个文件,打开这三个文件,可以看到 App.java 中已经写好了一个
Hello World 程序,而 AppTest 中是 Junit 单元测试的代码,至于 pom.xml,则给出了项目的一些基本信息以及依赖关系。
helloworld/
├── pom.xml
└── src
├── main
│ └── java
│ └── helloworld
│ └── App.java
└── test
└── java
└── helloworld
└── AppTest.java
这里主要看一下 pom.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>helloworld</groupId>
<artifactId>helloworld</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>helloworld</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
在 pom.xml 文件中,首先描述了项目的定义,groupId:artifactId:packaging:version 这个四元组能够唯一标记一个项目。我们不仅可以用这个四元组来标记我们的项目,也可以用来标记其它的项目,比如用来描述项目依赖关系。perperties 中定义了项目的属性,也可以在这里定义变量并在其它的地方引用。至于最后的 dependencies,则是描述了项目的依赖关系,Maven 会根据依赖关系自动下载相应的文件并在编译时使用。
在大型项目开发中,往往会将其分成若干个子项目,每个子项目都有着自己的的 pom.xml,它们与父 pom.xml 之间相当于继承的关系。
可以说,pom.xml 文件的配置是整个 Maven 的核心重点,也是学习 Maven 过程中需要详细了解的内容。这里只给出了最简单的配置样例,详细了解可以查看官方文档。
接下来编译并运行 Helloworld 项目。
如果是第一次编译的话,需要联网,因为 Maven 会自动下载依赖包。
$ mvn package
下载的依赖包会保存在~/.m2/repository 文件夹中,打开这个文件夹,我们会发现里面的包正是按前面所说的四元组目录结构进行存储的。Maven 在依赖一个 jar
包时会先去本地库查找,如果没找到就会从网上下载。当然,并不是所有的包都能从网上下载到,比如我们自己开发的 jar
包,这时,我们就可以用 mvn install
命令将一个项目安装到本地仓库。
打包成功后我们会发现项目中多了一个 target 文件夹,目录结构如下
target/
├── classes
│ └── helloworld
│ └── App.class
├── helloworld-1.0-SNAPSHOT.jar
├── maven-archiver
│ └── pom.properties
├── maven-status
│ └── maven-compiler-plugin
│ ├── compile
│ │ └── default-compile
│ │ ├── createdFiles.lst
│ │ └── inputFiles.lst
│ └── testCompile
│ └── default-testCompile
│ ├── createdFiles.lst
│ └── inputFiles.lst
├── surefire-reports
│ ├── helloworld.AppTest.txt
│ └── TEST-helloworld.AppTest.xml
└── test-classes
└── helloworld
└── AppTest.class
可以看到,在 package 过程中,maven 完成了编译、测试代码,生成测试报告,生成 jar 包等一系列工作。
最后,我们也可以手动运行 jar 包查看结果。
$ java -cp target/helloworld-1.0-SNAPSHOT.jar helloworld.App
Hello World!
Maven 常用命令
Maven 的命令非常多,学习命令首先要了解 Maven 的生命周期。
Maven 首先会验证并处理引用资源,之后进行项目编译,如果没有声明跳过测试,也会编译测试代码并进行测试、以成测试报告。最后,Maven 会将编译好的内容进行打包,用于发布。
Maven 命令与 Maven 的生命周期有着对应的关系,一个命令也经常会包含多个生命周期,比如 mvn package
会完成以上所有步骤。
这里列举几个常用的命令
mvn compile 编译项目
mvn test 编译运行单元测试
mvn package 打包(jar or war)
mvn install 将项目安装到本地仓库
mvn clean 清空项目
mvn eclipse:eclipse 生成eclipse工程
吐槽
在用 Maven 编译一些 Apache 项目的时候,实在是想吐槽 GFW!!如果不翻墙经常是编译到一半就有个文件 Download 不下来了。。
有一本书推荐《Maven 权威指南》