开场白
在现在的项目开发过程中,越来越重视项目的管理,而且主流的项目管理框架或者说是工具已经慢慢被Maven取代,在求职者面试过程中,项目开发过程中,Maven的使用已经成为主流,如何很快着手Maven的项目管理,已经成为包括我在内的很多程序员考虑的问题,在本系列博文中,我将以一个初识Maven的角度和大家共同学习Maven的项目构建工具的使用,在这个过程中,有可能有很多问题,也或许有很多我没有考虑到的地方,还请高手给予指正,当然,如果是新入手的学者,也可以在实验过程中给出想法和建议,在此感激不尽。下面进入Maven的学习之路。
什么是Maven?
Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。类似于大家熟知的Ant工具所起到的效果,当然他们之间存在很多异同点。
为什么要学Maven?
大家会发现,在平时项目中,我们每天有相当一部分时间花在了编译、运行单元测试、生成文档、打包和部署等烦琐且不起眼的工作上,如果你使用Ant,会发现很多东西都要程序员去定义,去编写build文件,然而有了Maven这个构建工具,能够帮我们自动化构建过程,从清理、编译、测试到生成报告,再到打包和部署。我们不需要也不应该一遍又一遍地输入命令,一次又一次地点击鼠标,或者小心翼翼的写着配置文件,我们要做的是使用Maven配置好项目,然后输入简单的命令(如mvn clean install),Maven会帮我们处理那些烦琐的任务。这一切都体现了一句经典“约定优于配置”,当然Maven不仅是构建工具,还是一个依赖管理工具和项目信息管理工具,况且Maven也是跨平台的。这些都会通过实例说明。
获取和安装
下载地址:http://maven.apache.org/download.cgi,进去之后,会发现有很多版本,我们将使用较新的版本apache-maven-3.1.1-bin.zip, (windows平台)如图1所示:
图1
如果想查看源码可以下载src版本,当然也可以选择其他操作系统,比如linux平台下的文件,本系列只介绍windows平台下,其他平台还请参照其他博文讲解。
找到下载后的文件,并将文件解压到一个自己定义的目录,如图2所示:
图2
此时发现有四个目录,下面讲解四个目录中文件的作用
bin目录:
该目录包含了mvn运行的脚本,这些脚本用来配置java命令,准备好classpath和相关的java系统属性,然后执行java命令
boot目录:
该目录只包含一个文件,该文件为plexus-classworlds-xxx.jar。plexus-classworlds是一个类加载器框架,相对于默认的java类加载器,它提供了更丰富的语法以方便配置,maven使用该框架加载自己的类库。
conf目录:
该目录包含了一个非常重要的文件settings.xml。直接修改该文件,就能在机器上全局地定制maven的行为。一般情况下,我们更偏向于复制该文件至~/.m2/目录下(~表示用户目录),然后修改该文件,在用户范围定制maven的行为。
lib目录:
该目录包含了所有maven运行时需要的java类库。
环境变量的配置
打开系统属性(桌面上右键单击“我的电脑”→“属性”),点击高级系统设置,再点击环境变量,在系统变量中新建一个变量,变量名为M2_HOME,变量值为Maven的安装目录E:\StudySoftware\javaEE\apache-maven-3.1.1(根据自己安装的情况)。点击确定,接着在系统变量中找到一个名为Path的变量,在变量值的末尾加上%M2_HOME%\bin;,注意多个值之间需要有分号隔开,然后点击确定。至此,环境变量设置完成,详细情况如图3所示:
图3
下面将查看配置是否正确,打开命令控制台,输入mvn -v如果发现图4所示的信息,配置就是成功的:
图4
至此,Maven的环境变量配置成功。
本地仓库
由于运行过mvn命令,那么会在用户目录下发现一个.m2文件,如图5所示:
图5
其中repository目录,这个目录是存放从网上下载下来的jar,而这些jar就是maven的好处之一,可以自动下载项目中用到的jar包,而这些jar包的存放位置就是一个仓库,存放在本地的就是本地仓库,而存放在网络上的就是maven的*仓库。
由于下载jar文件的增多,会给C盘造成负担,或者在重装系统后,c盘的东西将不复存在,因此可以把repository目录转移到其他盘中储存。
具体做法是:
1. 复制repository目录到其它盘符,本文中是在E:\Workspaces\Maven下
2. 复制刚刚解压好的Maven目录中,conf中的settings.xml文件到E:\Workspaces\Maven目录下,
3. 打开找到如下内容
<localRepository>....</localRepository>改成:
<localRepository>E:/Workspaces/Maven/repository</localRepository>
同样将conf下的settings.xml也改成如上配置,如图6所示:
图6
保存.完成.
这样就将本地仓库从C:\Users\Steven\.m2\repository移到了E:\Workspaces\Maven\repository中。
Maven小实例
本文在目录E:\Workspaces\STSWorkspace\Maven_01(可以随便找个目录)下,新建pom.xml文件,然后在其中加入如下配置:
<?xml version="1.0" encoding="UTF-8"?> <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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.steven.maven</groupId> <artifactId>maven_01</artifactId> <version>0.0.1-SNAPSHOT</version> </project>其中
groupId:
项目或者组织的唯一标志,并且配置时生成路径也是由此生成,如com.steven.maven生成的相对路径为:/com/steven/maven
artifactId:
项目的通用名称
version:
项目的版本
接下来在此文件夹中建立src文件夹,然后在src中建立main和test文件夹,然后在main中建立java文件夹,然后在java文件夹中建立com/steven/maven/HelloWorld.java文件,如图7所示:
图7
HelloWorld.java的内容如下:
package com.steven.maven; public class HelloWorld{ public void sayHello(){ System.out.println("Hello Maven!"); } }然后在命令控制台中执行mvn compile,如图8所示:
图8
会发现出现Downloading下载的提示,这是因为,Maven在执行命令的时候,要加载其他使用到的插件和其他jar包,称为依赖,这个时候就要从网络上进行下载,所以如何使用Maven,请保持网络是正常的,否则会出现问题。当编译完成的时候出现成功的提示信息,如图9所示:
图9
此时发现项目目录中多了一个target的目录,如图10所示:
图10
发现刚刚编译产生的class文件放在了target目录下,所以只要我们按照这个目录格式编写,maven工具就帮助我们执行出结果,然后放在相应的结构目录下。
下面我们将继续编写测试代码,在test目录下新建java文件夹,然后同样新建com/steven/maven/HelloWorldTest.java文件,其中HelloWorldTest文件的内容如下:
package com.steven.maven; import org.junit.*; public class HelloWorldTest{ @Test public void sayHelloTest(){ HelloWorld hw = new HelloWorld(); hw.sayHello(); } }
此时的目录结构如图11所示:
图11
然后控制台执行mvn test命令,但此时出现错误信息,如图12所示:
图12
这是因为测试过程中用到了junit的包,但没有找到,原来的解决办法是:
- 通过将junit的包加入到环境变量下即可解决
但maven的解决思路是
- 在pom.xml中加入<dependencies>节点,完成的配置文件如下所示:
<?xml version="1.0" encoding="UTF-8"?> <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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.steven.maven</groupId> <artifactId>maven_01</artifactId> <version>0.0.1-SNAPSHOT</version> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> </dependency> </dependencies> </project><dependencies>节点代表项目依赖的jar包,然后加入junit的jar包配置文件即可,此时再次执行mvn test,会发现如图13所示的结果:
图13
这时候maven从网络上下载4.10版本的junit jar包,最后的执行结果如图14所示:
图14
此时发现测试成功,正确执行Hello Maven!的结果。
此时再来看target中的文件会发现如图15所示的结果:
图15
如果此时执行mvn clean命令,如图16所示:
图16
会发现在下载相应插件的同时,执行了清除target目录的操作,然后再来看Maven_01目录中的文件,如图17所示:
图17
发现target目录已经不存在了,即被maven clean命令清空了。如果接着执行maven test,会发现target目录又出现了。
这个时候再来观察一下一开始配置的本地仓库中的文件,会发现图18的结果:
图18
我们发现,Maven在执行命令的过程中用到的jar都已经在本地仓库中储藏了,至此,Maven小实例结束。
总结
在本节中,通过Maven的介绍,下载,安装,配置,已经小实例的实现,估计大家也多多少少有些头绪了,通过实例,可以看出Maven可以作为项目的构建工具,而配置文件很好写,而且写的很少,用到的jar包,不需要手动去添加到环境变量中,只要通过配置,Maven就会通过网络寻找到并且下载到本地仓库中。
在本节中用到的Maven命令:
mvn compile编译java文件
mvn test执行junit操作
mvn clean清空target目录操作
在此恭祝大家学习愉快!