Maven
Apache Maven是一个软件项目管理的综合工具。基于项目对象模型(POM)的概念,提供了帮助管理构建、文档、报告、依赖、发布等方法,Maven简化和标准化项目建设过程。处理编译,分配,文档,团队协作和其他任务的无缝连接。 Maven增加可重用性并负责建立相关的任务。
maven的好处在于可以将项目过程规范化、自动化、高效化以及强大的可扩展性,利用maven自身及其插件还可以获得代码检查报告、单元测试覆盖率、实现持续集成等等。
Maven的基本原理很简单,采用远程仓库和本地仓库以及一个核心的配置文件pom.xml,pom.xml中定义的jar文件从远程仓库下载到本地仓库,各个项目使用同一个本地仓库的jar,同一个版本的jar只需下载一次,而且避免每个应用都去拷贝jar。同时它采用了现在流行的插件体系架构,所以maven的核心非常的小,只有几兆大小的文件,在执行maven任务时,才会自动下载需要的插件。
具体的概念模型如下图:

Maven官方把maven定义为一个项目管理工具,下面我们来看看maven给我们的项目管理做了哪些工作?
项目标准化:
Maven项目具有统一的项目结构,这个项目结构是参考业界的最佳实践而成,为后面使用统一的maven命令打下了基础,如测试mvn test、打包mvn package等,无需写一行脚本,就可以方便的实现众多功能。
文档和报告:
使用mvn site可以快速生成项目站点,apache很多开源项目站点都采用maven生成,会出现built by maven字样的图标。
类库管理:
类库管理是maven一个比较核心的功能,我们就需要将项目所依赖的类库加入到pom.xml中,那么maven会自动将依赖的类库下载到本地,并且下载的类库如果还依赖其他的类库,它也会自动下载过来,这样我们就不需要一个一个类库去下载了。
发布管理:
使用maven可以方便的进行项目发表管理。在项目开发到一定阶段,可以使用mvn package打包,它会自动先运行mvn test,跑所有的Test Case,只有全部通过才能正确打包。生成的war包(如果项目的packaging为war)在target目录下。这个 war包与使用ant脚本生成一样,但无需一行脚本,这也是maven对比ant的优势之一。使用mvn install将编译和打包好的文件发布到本地仓库中。使用mvn deploy在整合或者发布环境下执行,将最终版本的包拷贝到远程的repository。
(二)Maven的安装与环境配置
想要安装 Apache Maven在Windows 系统上, 需要下载 Maven 的 zip 文件,并将其解压到你想安装的目录,并配置 Windows
环境变量。
所需工具 :
1.JDK
2.Maven
3.Windows 7
注
Maven 3.2 要求 JDK 1.6 或以上版本, 而 Maven 3.0/3.1 需要 JDK 1.5 或以上。
1.JDK 和 JAVA_HOME
确保已安装JDK,并 将“JAVA_HOME” 变量已加入到 Windows 环境变量中。

我们可以打开Windows的命令行,运行如下的命令来检查Java的安装:

上述命令首先检查环境变量JAVA_HOME是否指向了正确的JDK目录,然后运行了java命令,如果无法执行命令,
或者无法找到JAVA_HOME环境变量,就需要检查Java是否安装了,或者环境变量是否设置正确。
2.下载Apache Maven
下载地址:http://maven.apache.org/download.html,打开后找到下载链接,如图:

小Alan是老以前下载的3.2.2的版本,用着也没什么问题,所以也懒得下载最新的版本,这里大家可以下载最新的版本下来用。
当然,如果你对Maven的源代码感兴趣并想自己构建Maven,也可以下载apache-maven-3.3.9-src.zip。
将下载的安装包解压到特定的目录下,假设你解压缩到文件夹 – D:\apache-maven-3.2.2,如图:

3.添加 M2_HOME 和 MAVEN_HOME
打开系统属性面板(右击“计算机”>"属性"),单击高级系统设置,再单击环境变量,在系统变量中新建一个变量,变量名为M2_HOME,变量值为Maven的安装目录,如图:

M2_HOME 或 MAVEN_HOME
Maven 说只是添加 M2_HOME , 但一些项目仍引用 Maven 的文件夹 MAVEN_HOME, 因此,为了安全也把它添加进去。
小Alan使用的是M2_HOME。
4.添加到环境变量 - PATH
编辑 PATH 变量,添加 Maven bin 文件夹到 PATH 的最后,如: %M2_HOME%\bin, 这样就可以在命令中的任何目录下运行
Maven 命令了。

5.验证
在命令行中输入:echo %M2_HOME%以及mvn –version或-v,出现下面这个界面,说明我们的maven已经安装成功。

第一条命令echo %M2_HOME%用来检查M2_HOME是否指向了正确的Maven安装目录,mvn -v用来检查Windows
是否能够找到正确的mvn执行脚本。
6.升级
在Windows上更新Maven非常简单,只需要下载新的文件解压至本地目录,然后更新M2_HOME环境变量指向的目录即可,
降级也是同理,不做过多介绍。
(三)Maven仓库介绍与本地仓库配置
1.Maven本地仓库/远程仓库的基本介绍
示意图:

本地仓库是指存在于我们本机的仓库,在我们加入依赖时候,首先会跑到我们的本地仓库去找,如果找不到则会跑到远程仓库中去找。对于依赖的包大家可以从这个地址进行搜索:http://mvnrepository.com/。
远程仓库是指其他服务器上的仓库,包括全球中央仓库,公司内部的私服,又或者其他公司提供的公共库。后面会专门聊聊私服,公共库的话只是一个地址,大家会引用就行了。
Maven的本地仓库是用来存储所有项目的依赖关系(插件jar和其他文件,这些文件被Maven下载)到本地文件夹。很简单,当你建立一个Maven项目,所有相关文件将被存储在你的Maven本地仓库。
默认情况下,Maven的本地仓库默认为系统用户的 .m2 目录文件夹,如图:

2.更新Maven的本地仓库地址
默认的本地仓库地址在c盘下面,如果开发的项目比较大,可能会占用过多的c盘空间,而且c盘会随着系统的损坏可能有格式化的风险。通常情况下,可改变默认的 .m2 目录下的默认本地存储库文件夹到其他盘并取一个有意义的名称,如:maven_repository。
我们来看一个文件,文件放在maven的安装目录下面的conf子目录下面,大家打开这个文件夹可以看到有个叫settings.xml的文件夹,这个里面包含仓库地址、镜像、插件、代理等配置,也是maven中一个核心配置文件,在后面我们会经常跟她打交道。下面我来看看这个文件以及如何配置本地仓库。

打开这个文件,我们会看到Default: ~/.m2/repository这样一句话,这话就告诉我们maven的默认仓库位置,我们修改setting中的仓库目录位置<localRepository>D:\maven_repository</localRepository>,如果不能自动创建文件夹的话请记得在相应的目录下面创建本地仓库文件夹。
如图:

为了保持核心的配置文件不变,我们可以将settings.xml文件拷贝到.m2目录下面。以后只要对这个文件做修改就可以了,maven会优先读取.m2下面的配置文件。(可选)
也可直接指向的maven安装目录的conf子目录下面的setting.xml.
(四)新建Maven项目
我们以简单的helloworld来作为入门的实例,有些人说掌握了helloworld你就掌握了这门技术的一半了,对于maven来说,你掌握helloworld,你可能还稀里糊涂的。
1.从maven模板创建一个项目
在命令提示符(Windows)中,浏览到要创建 Java 项目的文件夹。键入以下命令:

project-packaging:项目包名
project-name:项目名称
这告诉 Maven 来从 maven-archetype-quickstart 模板创建 Java 项目。如果忽视 archetypeArtifactId 选项,一个巨大的 Maven 模板列表将列出。
例如,这里的工作目录是E:\workspace_maven,执行命令过程时间可能比较久,看个人的网络状况。

在上述情况下,一个新的Java项目命名 “HelloWorld”, 而整个项目的目录结构会自动创建。
注意
有少数人说 mvn archetype:generate 命令未能生成项目结构。 如果您有任何类似的问题,不用担心,只需跳过此步骤,手动创建文件夹。
2.Maven项目目录布局
src/main/java:用来存放源代码
src/main/resources:用来存放源代码的资源文件
src/test/java:用来存放单元测试代码
src/test/resources:用来存放测试代码的资源文件
3.在Eclipse IDE中使用我们的项目
为了使它成为一个 Eclipse 项目,进入到 “HelloWorld” 项目目录,键入以下命令:

执行以上命令后,它自动下载更新相关资源和配置信息(需要等待一段时间),并产生 Eclipse IDE所要求的所有项目文件。要导入项目到Eclipse IDE中,
选择 “File -> Import… -> General->Existing Projects into Workspace”,将“HelloWord项目导入到Eclipse中”。
项目导入到 Eclipse IDE中,如图:

4.更新POM文件(注意:前面部分与后面部分是隔了一段时间写的,所处的电脑不一样,所以工作空间不同,这个大家知道一下就好了)
默认的 pom.xml 太简单了,很多时候,你需要添加编译器插件来告诉 Maven 使用哪个 JDK 版本来编译项目,我们用4.11版本的junit,并用插件指明使用哪个JDK版本。

5.运行maven项目
现在,我们将使用Maven这个项目,并输出编译成一个 “jar” 的文件。pom.xml 文件中包元素packaging定义应该输出什么包。如图:

回到我们的项目目录,输入命令: mvn package

它编译,运行单元测试并打包项目成一个 jar 文件,并把它放在 project/target 文件夹。

最终项目的目录结构, 如下图 :

最后,我们来运行一下这个jar文件,看看运行结果:

打印输出:“HelloWorld”。
(五)Maven目录结构及常用命令说明
前面提到的部分知识有涉及到Maven目录结构与Maven常用的一些命令,在这里专门给大家做个简单的介绍。
1.Maven目录结构说明
Maven总体目录结构如下图:

bin目录:该目录包含了mvn运行的脚本,这些脚本用来配置java命令,准备好classpath和相关的Java系统属性,然后执行Java命令。
boot目录:该目录只包含一个文件,以maven3.2.2为例,该文件为plexus-classworlds-2.5.1.jar。plexus-classworlds是一个类加载器框架,相对于默认的java类加载器,它提供了更丰富的语法以方便配置,Maven使用该框架加载自己的类库。更多关于classworlds的信息请参考http://classworlds.codehaus.org/。对于一般的Maven用户来说,不必关心该文件。
conf目录:该目录包含了一个非常重要的文件settings.xml,Maven的核心配置文件。
lib目录:该目录包含了所有Maven运行时需要的Java类库,Maven本身是分模块开发的,因此用户能看到诸如mavn-core-3.2.2.jar、maven-model-3.2.2.jar之类的文件,此外这里还包含一些Maven用到的第三方依赖如commons-cli-1.2.jar、commons-lang-2.6.jar等等。
2.Maven常用命令说明
mvn clean:表示运行清理操作(会默认把target文件夹中的数据清理)。
mvn clean compile:表示先运行清理之后运行编译,会将代码编译到target文件夹中。
mvn clean test:运行清理和测试。
mvn clean package:运行清理和打包。
mvn clean install:运行清理和安装,会将打好的包安装到本地仓库中,以便其他的项目可以调用。
mvn clean deploy:运行清理和发布(发布到私服上面)。
上面的命令大部分都是连写的,大家也可以拆分分别执行,这是活的,看个人喜好以及使用需求,Eclipse Run as对maven项目会提供常用的命令。
3.特别说明
自从Maven3出来之后,后续的Eclipse IDE中往往都集成了Maven项目管理工具,所以这里不会特定给大家去说怎么在Eclipse中安装Maven插件,在后续的介绍中可能会提到部分如何在Eclipse中配置我们自己的Maven,这都是比较简单的内容,大家完全可以自己摸索。
祝大家都能够掌握这个好用的项目管理工具,如果喜欢关注技术的朋友还可以了解了解其他类似于这方面的技术以及框架,给大家举个简单的例子:Gradle。至于Maven之前的Make、Ant傻傻啥的,我觉得是没必要再去学习了,也基本不会用到,现实一点,吃饭的东西最要紧。
(六)Maven之pom.xml文件简单说明
通过前面几部分知识,我们对maven已经有了初步的印象,就像Make的Makefile、Ant的build.xml一样,Maven项目的核心是pom.xml。POM(Project Object Model,项目对象模型)定义了项目的基本信息,用于描述项目如何构建,声明依赖,等等。我们来看看maven中pom.xml文件主要标签的意思及其用法,来看一下pom.xml文件的结构:
1 <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">
2 <modelVersion>4.0.0</modelVersion>
3
4 <groupId>com.uidp</groupId>
5 <artifactId>UidpParent</artifactId>
6 <version>0.0.1-SNAPSHOT</version>
7 <packaging>pom</packaging>
8
9 <!--当前项目的全称(名称)-->
10 <name>UidpParent</name>
11 <!--当前项目的主页的URL-->
12 <url>http://maven.apache.org</url>
13
14 <!--配置常用属性或定义一系列版本号-->
15 <properties>
16 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
17
18 <repository-url>http://192.168.0.70:8081/content/groups/public/</repository-url>
19
20 <maven-compiler-plugin.version>3.1</maven-compiler-plugin.version>
21 <maven-war-plugin.version>2.4</maven-war-plugin.version>
22 <maven-javadoc-plugin.version>2.9.1</maven-javadoc-plugin.version>
23 <maven-release-plugin.version>2.4.1</maven-release-plugin.version>
24 <maven-deploy-plugin.version>2.7</maven-deploy-plugin.version>
25
26
27
28 <junit.version>4.11</junit.version>
29 <oracle.version>10.2.0.4</oracle.version>
30 <springframework.version>3.2.8.RELEASE</springframework.version>
31 <mybatis.version>3.2.2</mybatis.version>
32 <mybatis-spring.version>1.2.0</mybatis-spring.version>
33 <mysql-driver.version>5.1.25</mysql-driver.version>
34 <aspectjweaver.version>1.7.3</aspectjweaver.version>
35
36 <commons-dbcp.version>1.4</commons-dbcp.version>
37 <commons-pool.version>1.5.5</commons-pool.version>
38 <commons-fileupload.version>1.2.2</commons-fileupload.version>
39
40 <log4j.version>1.2.17</log4j.version>
41 <slf4j-api.version>1.7.5</slf4j-api.version>
42 <slf4j-log4j12.version>1.7.5</slf4j-log4j12.version>
43
44 <freemarker.version>2.3.19</freemarker.version>
45
46 <jackson-core.version>2.5.0</jackson-core.version

