Maven入门指南(一)
Maven介绍:
Maven是一个强大的Java项目构建工具。
什么是构建工具?
构建工具是将软件项目构建相关的过程自动化的工具。构建一个软件项目通常包含以下一个或多个过程:
- 生成源码(如果项目使用自动生成源码);
- 从源码生成项目文档;
- 编译源码;
- 将编译后的代码打包成JAR文件或者ZIP文件;
- 将打包好的代码安装到服务器、仓库或者其它的地方;
有些项目可能需要更多的过程才能完成构建,这些过程一般也可以整合到构建工具中,因此它们也可以实现自动化。
自动化构建过程的好处是将手动构建过程中犯错的风险降到最低。而且,自动构建工具通常要比手动执行同样的构建过程要快。
安装Maven
安装Maven,访问Maven下载页,然后按照安装指南的步骤即可。总结一下,你需要做:
1. 下载并解压Maven;
2. 将环境变量M2_HOME设置为解压后的目录;
3. 将M2环境变量设置为M2_HOME/bin(在Windows上是%M2_HOME%/bin,在Unix上是${M2_HOME}/bin);
4. 将M2添加到PATH环境变量中(Windows上是%M2%,Unix上是${M2});
5. 打开终端输入`mvn`(不带引号),然后回车;
输入‘mvn’命令后,终端上回显示错误信息。不要担心这个错误。因为你没有给Maven传入pom文件,因此出现该错误信息是意料之中的。显示Maven错误信息说明Maven已经安装好了。
注意:Maven运行需要Java环境,因此也需要安装Java,Java版本1.5及以上;
maven的JDK版本依赖
项目 |
要求 |
JDK |
Maven 3.3 要求 JDK 1.7 或以上 |
Maven概览-核心概念
Maven的中心思想是POM文件(项目对象模型)。POM文件是以XML文件的形式表述项目的资源,如源码、测试代码、依赖(用到的外部Jar包)等。POM文件应该位于项目的根目录下。
下图说明了Maven是如何使用POM文件的,以及POM文件的主要组成部分:
这些概念先简单地解释一下,更多的细节放在本教程的具体小节中。
POM文件
当你执行一条Maven命令的时候,你会传入一个pom文件。Maven会在该pom文件描述的资源上执行该命令。
构建生命周期、阶段和目标
Maven的构建过程被分解为构建生命周期、阶段和目标。一个构建周期由一系列的构建阶段组成,每一个构建阶段由一系列的目标组成。当你运行Maven的时候,你会传入一条命令。这条命令就是构建生命周期、阶段或目标的名字。如果执行一个生命周期,该生命周期内的所有构建阶段都会被执行。如果执行一个构建阶段,在预定义的构建阶段中,所有处于当前构建阶段之前的阶段也都会被执行。
依赖和仓库
Maven执行时,其中一个首要目标就是检查项目的依赖。依赖是你的项目用到的jar文件(java库)。如果在本地仓库中不存在该依赖,则Maven会从中央仓库或远程仓库下载并放到本地仓库。本地仓库只是你电脑硬盘上的一个目录。你可以根据需要制定本地仓库的位置。你也可以指定下载依赖的远程仓库的地址。这些将会在后续的小节中详细介绍。
插件
构建插件可以向构建阶段中增加额外的构建目标。如果Maven标准的构建阶段和目标无法满足项目构建的需求,你可以在POM文件里增加插件。Maven有一些标准的插件供选用,如果需要你可以自己实现插件。
配置文件
配置文件用于以不同的方式构建项目。比如,你可能需要在本地环境构建,用于开发和测试,你也可能需要构建后用于开发环境。这两个构建过程是不同的。在POM文件中增加不同的构建配置,可以启用不同的构建过程。当运行Maven时,可以指定要使用的配置。
Maven与Ant
Ant是Apache另一个流行的构建工具。如果你熟悉Ant,正在学习Maven,你将会注意到两者在方法上的区别。
Ant使用命令式的方式,即你需要在Ant构建文件里指定Ant应该执行的操作。你可以指定低级别的操作,如复制文件、编译代码等。你指定操作,还需要执行这些操作执行的顺序。Ant没有默认的目录结构。
Maven使用声明式的方式,即你需要在POM文件里指定做什么,而不是如何做。POM文件描述项目的资源-而不是如何构建。相比而言,Ant构建文件描述的是如何构建项目。在Maven里,如何构建是在“Maven 构建声明周期、阶段和目标”中预定义的。
Maven POM 文件
Maven的POM文件是一个xml文件,描述项目用到的资源,包括源代码目录、测试代码目录等的位置,以及项目依赖的外部jar包。
POM文件描述的是构建“什么”,而不是“如何”构建。如何构建是取决于Maven的构建阶段和目标。当然,如果需要,你也可以向Maven构建阶段中添加自定义的目标。
每一个项目都有一个POM文件。POM文件即pom.xml,应该放在项目的根目录下。一个项目如果分为多个子项目,一般来讲,父项目有一个POM文件,每一个子项目都有一个POM文件。在这种结构下,既可以一步构建整个项目,也可以各个子项目分开构建。
本文剩下的章节,主要介绍POM文件最重要的部分。POM文件的完整文档,参考[Maven POM Reference](http://maven.apache.org/pom.html)
如下为一个最小化的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”>
<modelVersion>4.0.0</modelVersion> <groupId>com.jenkov</groupId>
<artifactId>java-web-crawler</artifactId>
<version>1.0.0</version>
</project>
modelVersion*属性表示使用的POM模型的版本。选择和你正在使用的Maven版本一致的版本即可。版本4.0.0适用于Maven 2和3。
*groupId”属性是一个组织或者项目(比如开源项目)的唯一ID。大多数情况下,你会使用项目的java包的根名称作为group ID。例如,对于我自己的Java网络爬虫项目,我会使用com.jenkov作为group ID。如果这个项目是一个由很多独立的贡献者组成的开源项目,也许选择与项目相关的名称作为group ID,比选择与我的公司相关的名称名作为group ID要合理地多。因此,选择com.javawebcrawler作为group ID。
groupId不一定非要使用Java的包名,也不一定要使用.分隔符来分隔ID中的词。但是,如果你这么使用,项目将会位于Maven仓库的结构化目录中,该结构化目录与group ID匹配。每一个.是一个目录分隔符,每一个词都表示一个目录。group ID为com.jenkov的项目将位于目录MAVEN_REPO/com/jenkov中。目录路径中的MAVEN_REPO表示Maven仓库的路径。
*artifactId*属性包含你正在构建的项目的名称。以我的Java网络爬虫项目来说,artifact ID为java-web-crawler。artifact ID是Maven仓库中group ID目录下的子目录名。artifact ID也是构建完项目后生成的jar包的文件名的一部分。构建过程的输出,即构建结果,在Maven中成为构件(artifact)。通常它就是一个jar包、war包或者EAR包,蛋它也可以是别的。
*versionId包含项目的版本号。如果你的项目有不同的发行版,比如开源API,对构建过程版本化是很有用的。如果使用版本,项目的用户就可以查看项目的具体版本。版本号是artifact ID目录下的子目录名。版本号也用作构建结果名称的一部分。
上文中的groupId,artifactId和version属性,在项目构建后会生成一个jar文件,位于Maven仓库的如下路径中(目录和文件名):MAVEN_REPO/com/jenkov/java-web-crawler/1.0.0/java-web-crawler-1.0.0.jar
如果你的项目使用[Maven目录结构](http://tutorials.jenkov.com/maven/maven-tutorial.html#maven-directory-structure),而且项目没有外部依赖,上面的最简化POM文件就是你构建项目所需的所有配置了。
如果你的项目不遵从标准的目录结构,有外部依赖或者在构建过程中需要加入额外操作,你需要向POM文件中添加更多的配置。更多的配置查阅[Maven POM 参考]
通常,你可以向POM文件中增加各种配置,这些配置告诉Maven如何更好地构建你的项目。查阅Maven的POM参考,了解更多的配置。
父pom
所有的Maven pom文件都继承自一个父pom。如果没有指定父pom,则该pom文件继承自根pom。pom文件的继承关系如下图所示:
可以让一个pom文件显式地继承另一个pom文件。这样,可以通过修改公共父pom文件的设置来修改所有子pom文件的设置。在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”>
<modelVersion>4.0.0</modelVersion> <parent>
<groupId>org.codehaus.mojo</groupId>
<artifactId>my-parent</artifactId>
<version>2.0</version>
<relativePath>../my-parent</relativePath>
</parent> <artifactId>my-project</artifactId>
…
</project>
子pom文件的设置可以覆盖父pom文件的设置,只需要在子pom文件里指定新的设置即可。
关于pom文件继承更详细的内容可以参考Maven POM文档。
有效pom
考虑到pom文件的继承关系,当Maven执行的时候可能很难确定最终的pom文件的内容。总的pom文件(所有继承关系生效后)被称为有效pom(effective pom)。可以使用以下的命令让Maven打印出当前的有效pom:
mvn help:effective-pom
执行以上命令,Maven会将有效pom输出到命令行。
Maven配置文件
Maven有两个配置文件。配置文件里的设置,对所有的pom文件都是有效的。比如,你可以配置:
- 本地仓库的路径;
- 当前的编译配置选项
- 等等
配置文件名为settings.xml,两个配置文件分别为:
+ Maven安装目录中:$M2_HOME/conf/settings.xml
+ 用户主目录中:${user.home}/.m2/settings.xml
两个配置文件都是可选的。如果两个文件都存在,则用户目录下的配置会覆盖Maven安装目录中的配置。
关于Maven配置文件,参考[Maven配置文档](http://maven.apache.org/settings.html)
让Maven跑起来
当你安装好了Maven,并且在项目的根目录下创建了POM文件,可以在项目上运行Maven了。
运行Maven只需在命令行执行`mvn`命令即可。当执行`mvn`命令时,将构建周期、阶段或目标作为参数传进去,Maven就会执行它们。例如:
mvn install
该命令执行`install`阶段(是默认构建阶段的一部分),编译项目,将打包的JAR文件复制到本地的Maven仓库。事实上,该命令在执行install之前,会执行在构建周期序列中位于install之前的所有阶段。
你可以向mvn命令传入多个参数,执行多个构建周期或阶段,如:
mvn clean install
该命令首先执行clean构建周期,删除Maven输出目录中已编译的类文件,然后执行install构建阶段。
也可以执行一个Maven目标(构建阶段的一部分),将构建阶段与目标名以冒号(:)相连,作为参数一起传给Maven命令。例如:
mvn dependency:copy-dependencies
该命令执行`dependency`构建阶段中的`copy-dependencies`目标。
Maven入门指南(一)的更多相关文章
- Maven 入门指南
为什么要用 Maven? Maven 主要帮助用户完成以下 3 个方面的工作: 生命周期管理,便捷的构建过程: 依赖管理,方便引入所需依赖 Jar 包: 仓库管理,提供统一管理所有 Jar 包的工具: ...
- Maven入门指南
Maven入门指南 本指南旨在第一次为使用Maven的人员提供参考,但也打算作为一本包含公共用例的独立参考和解决方案的工具书.对于新用户,建议您按顺序浏览该材料.对于更熟悉Maven的用户,本指南致力 ...
- Maven入门指南:仓库
1 . 仓库简介 没有 Maven 时,项目用到的 .jar 文件通常需要拷贝到 /lib 目录,项目多了,拷贝的文件副本就多了,占用磁盘空间,且难于管理.Maven 使用一个称之为仓库的目录,根据构 ...
- Maven入门指南① :Maven 快速入门及简单使用
原文链接:http://www.cnblogs.com/luotaoyeah/archive/2014/06/02/3764533.html 开发环境 MyEclipse 2014 JDK 1.8 M ...
- Maven入门指南⑤:使用Nexus搭建Maven私服
1 . 私服简介 私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件.有了私服之后,当 Maven 需要下载构件时,直接请求私服,私服上存在则下载到本地仓库:否则,私服请求外部 ...
- Maven入门指南 :Maven 快速入门及简单使用
开发环境 MyEclipse 2014 JDK 1.8 Maven 3.2.1 1.什么是Maven? Maven是一个Java语言编写的开源项目管理工具,是Apache软件基金会的顶级项目.主要用于 ...
- Maven入门指南⑦:Maven的生命周期和插件
一个完整的项目构建过程通常包括清理.编译.测试.打包.集成测试.验证.部署等步骤,Maven从中抽取了一套完善的.易扩展的生命周期.Maven的生命周期是抽象的,其中的具体任务都交由插件来完成.Mav ...
- Maven入门指南④:仓库
1 . 仓库简介 没有 Maven 时,项目用到的 .jar 文件通常需要拷贝到 /lib 目录,项目多了,拷贝的文件副本就多了,占用磁盘空间,且难于管理.Maven 使用一个称之为仓库的目录,根据构 ...
- Maven入门指南⑥:将项目发布到私服
1 . 修改私服中仓库的部署策略 Release版本的项目应该发布到Releases仓库中,对应的,Snapshot版本应该发布到Snapshots仓库中.Maven根据pom.xml文件中版本号&l ...
- Maven入门指南③:坐标和依赖
1 . 坐标 maven 的所有构件均通过坐标进行组织和管理.maven 的坐标通过 5 个元素进行定义,其中 groupId.artifactId.version 是必须的,packaging 是可 ...
随机推荐
- 聊聊Python中的多进程和多线程
今天,想谈一下Python中的进程和线程. 最近在学习Django的时候,涉及到了多进程和多线程的知识点,所以想着一下把Python中的这块知识进行总结,所以系统地学习了一遍,将知识梳理如下. 1. ...
- ARDUINO PWM
转至:http://www.sl088.com/voyage/2012/10/11506.slboat#.E5.8F.91.E7.8E.B0 http://www.engblaze.com/micro ...
- R语言扩展包dplyr笔记
引言 2014年刚到, 就在 Feedly 订阅里看到 RStudio Blog 介绍 dplyr 包已发布 (Introducing dplyr), 此包将原本 plyr 包中的 ddply() 等 ...
- (转)学习linux的几本书
成为一名精通 Linux 程序设计的高级程序员一直是不少朋友孜孜以求的目标.根据中华英才网统计数据,北京地区 Linux 程序员月薪平均为 Windows 程序员的 1.8 倍.Java 程序员的 2 ...
- 初涉RxAndroid结合Glide实现多图片载入操作
转载请注明出处:王亟亟的大牛之路 本来周末就想发了然后各种拖拉就没有然后了,那么就今天早上写吧,废话不多開始正题 什么是RxJava或者RxAndroid我就不多废话了,理论知识一大堆人给我们做好了. ...
- 【Spark】RDD机制实现模型
RDD渊源 弹性分布式数据集(RDD).它是MapReduce模型一种简单的扩展和延伸.RDD为了实现迭代.交互性和流查询等功能,须要保证RDD具备在并行计算阶段之间能够高效地数据共享的功能特性.RD ...
- squid2.7安装与配置
CleverCode近期研究了一下squid的安装与配置. 如今总结一下.分享给大家. 1 简单介绍 代理server英文全称是Proxy Server,其功能就是代理网络用户去取得网络信息. Squ ...
- J2SE基础:8.系统经常使用类二
1:基础数据与封装类型之间的转型 A:基础数据类型--->封装类型(对象类型) Boolean boolean_1 = new Boolean(true); byte ---->Byte ...
- Android SwipeMenuListView
Android平台上的第三方开源项目SwipeMenuListView是一种能够在某一个view条目中响应用户左右側滑(从左向右,或从右向左滑动),滑出操作菜单的UI控件.类似这样的控件达到的U ...
- 关于write solid code中的memset
文中说明memset可以通过操作整形以加速程序执行速度,这一点值得肯定,问题在于unicore或arm中协处理器有地址访问对齐检查,如果我们如此操作,编译器最终使用str指令来完成,那么当地址未对齐时 ...