1. Maven简介
Apache Maven是一个软件项目管理和了解工具,它基于项目对象模型(POM)的概念,可以由一个核心信息块管理一个项目的构建、报告和文档。
Maven一词来源于依地语(犹太人用的国际语),含义是“知识的积蓄”。最早用于简化Jakarta Turbine项目的构建过程。这个项目包含了多个子项目,每个子项目都拥有自己独立的、存在明显差异的Ant构建文件,并且JAR文件都提交到了CVS上。项目人员想用一种标准的方法来构建这些项目,这种方法可以清晰地定义项目的构成,可以较容易地发布项目信息,还可以在多个项目之间共享JAR文件。于是一个可用于构建和管理任何Java项目的工具诞生了。
Maven的主要目标是让开发者在最短的时间内了解开发工作的完成状态。为了达到这个目标,Maven致力于以下几个方面:
1) 让构建过程变得简单
2) 提供一个统一的系统
3) 提供优质的项目信息
4) 提供最佳开发实践的指导
5) 允许透明迁移到新功能
2. 安装配置
可以访问http://maven.apache.org/download.cgi获取Maven的最新版本,软件包有tar.gz和zip两种格式,选择适合自己的软件包,并下载、解压到你的安装目录,如下图所示:
Maven的运行需要系统中预装JDK,因此请访问http://www.oracle.com/technetwork/java/javase/downloads/index.html下载、安装JDK并设置环境变量JAVA_HOME。需要注意的是,Maven对JDK的版本有一定要求,请仔细阅读Maven下载页的说明并安装符合需求的JDK版本。
添加MAVEN_HOME环境变量并指向Maven的安装目录,同时将安装目录下的bin目录添加到环境变量PATH。至此,Maven的安装工作基本完成。在命令行(或Linux终端)中输入"mvn -v",应该可以看到类似以下的信息:
3. 创建项目
在命令行(或Linux终端)中将当前目录切换至项目待创建的位置,而后使用如下命令来创建一个新的Maven项目:
mvn archetype:generate -DgroupId=cn.lazybug -DartifactId=lazybug -Dversion=1.0 -DarchetypeArtifactId=maven-archetype-quickstart
其中archetypeAritifactId表示从maven-archetype-quickstart模板创建Java项目,如果不指定,那么在创建过程中将会列出一个相当长的清单让你选择。groupId表示组织标识(如cn.lazybug),而artifactId表示项目标识(如lazybug),version则表示版本号。groupId、artifactId和version这三者组合成Maven项目的唯一标识。
在创建脚本执行完成后,应该可以看到类似以下的信息:
创建好的Maven项目(基于maven-archetype-quickstart模板)的文件结构如下图所示:
其中,Java源代码存放在src/main/java目录,测试代码存放在src/test/java目录。此外还有一个重要的文件pom.xml,它位于项目的根目录。pom.xml描述了项目的完整信息,包括项目的组成、依赖关系、构建细节等。比如上例中创建的项目POM信息如下,除了声明groupId、artifactId、packaging、version等信息外,还表明依赖了junit,版本号是3.8.1。
4. 项目输出
使用maven-archetype-quickstart模板创建的项目会自动建立一个App.java文件(还有对应的测试文件),代码的内容是输出"Hello World!"字符串。现在开始尝试构建项目,并打包成一个JAR文件。
在命令行(或Linux终端)中输入"mvn package"。当第一次运行时,需要从远程库中下载所需依赖并存放到本地库中,因此请确保网络连接畅通。打包完成后,将看到类似以下信息:
项目输出的文件位于target目录下。其中classes目录存放编译后的class文件,test-classes目录存放编译后的测试文件,而打包好的JAR文件位于target目录。如下图所示:
我们可以通过"java -jar target\lazybug-1.0.jar cn.lazybug.App"来验证生成的包,结果如下:
在执行"mvn package"时,会自动执行测试文件目录中的junit测试用例,可以使用"mvn package -DskipTests"或"mvn package -Dmaven.test.skip=true"来跳过测试用例步骤。"-DskipTests"与"-Dmaven.test.skip=true"的区别是,前者不执行测试,但仍然会编译测试文件,而后者即不执行,也不编译。
5. 生命周期
在了解生命周期之前,先了解一下Maven的插件。插件是一个或多个目标的集合,目标则是一个明确的任务。插件和目标通常以pluginId:goalId的形式表示,比如上例中的archetype:generate,archetype表示插件,generate表示目标,这个目标的任务是生成一个基于模板的工程。还有其他的例子比如Compiler插件中的compiler目标,它用来编译项目中的源文件,或者Surefire插件中的test目标,它用来执行单元测试。
Maven的生命周期由一系列的有序阶段组成,每个阶段又绑定了多个插件目标。Maven支持多种不同的生命周期,如果没有进行额外的配置,那么它会使用默认生命周期。比如上例中的"mvn package",它将执行默认生命周期中package阶段及之前所有阶段的插件目标:
顺序 | 阶段 | 插件目标 | 任务 |
1 | process-resources | maven-resources-plugin:resources | 复制文件到输出目录 |
2 | compile | maven-compile-plugin:compile | 编译代码 |
3 | process-test-resources | maven-resources-plugin:testRresources | 复制测试文件到输出目录 |
4 | test-compile | maven-compiler-plugin:testCompile | 编译测试代码 |
5 | test | maven-surefire-plugin:test | 执行单元测试 |
6 | package | maven-jar-plugin:jar | 创建JAR包 |
7 | install | maven-install-plugin:install | 将输出安装到本地库 |
8 | deploy | maven-deploy-plugin:deploy | 将输出布署到远程库 |
6. 依赖管理
在上例中,项目在POM中声明依赖了junit,第一次运行时Maven会查找远程库(默认是http://repo1.maven.org/maven2/)并自动下载所需的junit版本到本地库。本地库默认位于用户主目录的.m2目录,也可以通过安装目录下的conf/settings.xml文件来指定。
我们可以查看之前下载到本地库中的junit,它位于{用户目录}/.m2/repository/junit/junit/3.8.1,如下图所示:
可以看到目录中除了JAR文件外,还包括POM文件。如果POM中还声明了其他的依赖关系,那么Maven也会连同这些依赖一起下载。
本文出自 “青锋笔记” 博客,谢绝转载!