本文是一篇写给新手的Maven教程,注重实战,有清晰的指导步骤和说明。文章可能很枯燥、很干,但是绝对具有实际意义。我本身不喜欢在文章中添加一些娱乐的风格(如搞笑的段子、图片),因为这对于学习这门技术来说几乎没有任何帮助,还占用阅读时间。
我只想把这门技术的逻辑理清楚,并表达出来:技术主要是解决了哪些问题?有哪些组成的要点?基本的数据结构是什么?底层的原理是什么?由底层的数据结构和原理决定的性质是什么?怎么实际应用?
在我整个Maven系列文章中,读者也许会得到如下逻辑:
- Maven主要解决的问题是:一体化管理Java项目中的依赖,自动测试打包部署
- 技术组成要点:Maven环境配置、开发的目录结构、生命周期、pom.xml
- 底层的原理:未深入了解,等待以后深入学习
- 特性:pom.xml是Maven的核心
- 应用:在Eclipse和IDEA中实践
本文主要内容:
- Maven做了什么
- 搭建Maven开发环境
- 工程目录、生命周期
什么是Maven
- 是 Apache 软件基金会组织维护的一款自动化构建工具,专注服务于 Java 平台的项目构建和依赖管理 。
- Maven 这个单词的本意是:专家,内行。读音是[‘meɪv(ə)n]或[‘mevn]。
- 构建工具的发展:Make→Ant→Maven→Gradle
传统项目开发的问题
- 一个工程很大的话,就不适合继续使用package来划分模块。最好是把这个工程拆分为多个模块,利于分工协作。借助于Maven就可以将一个项目拆分成多个工程。
- 项目中需要的Jar包必须手动“复制”、”粘贴” 到WEB-INF/lib 项目下。带来的问题:同样的jar包文件重复出现在不同的项目工程中,一方面浪费存储空间,另外也让工程比较臃肿。借助Maven,可以将jar包仅保存在“仓库”中,有需要使用的工程“引用”这个文件,并不需要重复复制。
- 需要管理Jar的版本。例如,你需要的是mysql.5.1.5.jar,给一个mysql.4.0.jar根本没法用。
- 管理Jar文件之间的依赖。项目中要使用a.jar,但是a.jar包又需要使用b.jar里面的类。必须首先获取到b.jar才可以,然后才能使用a.jar的这类问题。
Maven做了什么
- Maven可以管理jar文件
- 自动下载jar和他的文档,源代码
- 管理jar直接的依赖, a.jar需要b.jar , Maven会自动下载b.jar
- 管理你需要的jar版本
- 帮你编译程序,把java编译为class
- 帮你测试你的代码是否正确。
- 帮你打包文件,形成jar文件,或者war文件
- 帮你部署项目
Maven项目构建
构建是面向过程的,就是一些步骤,完成项目代码的编译,测试,运行,打包,部署等。
Maven支持的构建包括有:
- 清理:把之前项目编译的东西删除掉,我新的编译代码做准备。
- 编译:把程序源代码编译为执行代码,即由.java文件编译为.class文件。这个编译时批量的,Maven可以同时把成千上百的文件编译为class。另外和javac是不一样,因为javac一次编译一个文件。
- 测试:Maven可以执行测试程序代码,验证你的功能是否正确。批量的,Maven同时执行多个测试代码,同时测试很多功能。
- 报告:生成测试结果的文件,测试通过没有。
- 打包:把项目中所有的class文件、配置文件等所有资源放到一个压缩文件中。这个压缩文件就是项目的结果文件, 通常java程序,压缩文件是jar扩展名的。对于web应用,压缩文件扩展名是.war。
- 安装:把生成的文件jar、war安装到本机仓库。
- 部署:把程序安装好可以执行。
理解Maven的工作方式
让我们看一个案例研究,以了解它是如何工作的。假设你想使用 Log4j 作为项目的日志。这里你要做什么?
在传统方式:
- 访问http://logging.apache.org/log4j/
- 下载 Log4 j的 jar 库
- 复制 jar 到项目类路径
- 手动将其包含到项目的依赖
- 所有的管理需要一切由自己做
- 如果有 Log4j 版本升级,则需要重复上述步骤一次。
在Maven的方式:
1、你需要知道 log4j 的 Maven 坐标,例如:
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
2、它会自动下载 log4j 的1.2.14版本库。如果“version”标签被忽略,当有新的版本时它会自动升级为最新。
3、在pom.xml文件中声明 Maven 的坐标。
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
</dependency>
</dependencies>
4、当 Maven 编译或构建,log4j 的 jar 会自动下载,并把它放到 Maven 本地存储库,所有由 Maven 管理。
步骤原理:
当建立一个Maven的项目,pom.xml文件将被解析,如果看到 log4j 的 Maven 坐标,然后 Maven 按此顺序搜索log4j 库:
- 在 Maven 的本地仓库搜索 log4j
- 在 Maven 中央存储库搜索 log4j
- 在 Maven 远程仓库搜索 log4j(如果在 pom.xml 中定义)
搭建Maven环境
下载
从Apache Maven官网上直接下载:http://Maven.apache.org/download.cg。
直接解压到一个没有中文、没有空格的文件夹里,解压后的目录如下:
解压完毕后,就直接可以使用了。这个文件夹的位置就相当于Maven的安装位置。(注意:所有的Apache开源组织开发的软件都是绿色的!)
目录解析:
- bin:放置可执行文件的工具(mvn.cmd)
- config:配置文件的存放位置(settings.xml)
- lib:由于Maven是使用Java开发的,所以需要一些辅助的Jar包
配置环境变量
Maven版本配置要求:
- Maven 3.0/3.1 需要 JDK 1.5 或以上
- Maven 3.2 要求 JDK 1.6 或以上版本
- Maven 3.3.9这个版本所需的JDK版本必须要1.7以上
配置Maven_Home:
将Maven_Home添加到Path中:
注意格式:%Maven_Home%\bin
验证成功否:mvn -v
配置本地仓库
其中,settings.xml是Maven软件的核心文件,用于配置仓库的类型:
配置本地仓库的路径:
配置localRepository的功能:
- 这样一来,以后需要的类,都会先去这里寻找。自动下载的类,也会存储到这里。
- 如果不配置localRepository标签,则Maven会把数据自动下载到“C:\users\用户名\.m2\repository”中
Maven仓库
- 本地仓库:就是你的个人计算机上的文件夹,存放各种jar
- 远程仓库:在互联网上的仓库
- 中央仓库:最权威的,所有的开发人员都共享使用的一个集中的仓库(https://repo.Maven.apache.org :中央仓库的地址)
- 中央仓库的镜像:就是中央仓库的备份,在各大洲,重要的城市都有镜像。
- 私服,在公司内部,在局域网中使用的,不是对外使用的。
注意,程序员不能直接选择仓库,这是Maven自动管理的,使用顺序是:本地仓库 --> 私服 --> 中央仓库、镜像仓库
Maven原理
Maven工程约定的目录结构
项目名(例如HelloMaven):
- src
- main:放置主程序Java代码和配置文件
- java:包和Java源代码文件
- resources:配置文件
- test:放置测试程序Java代码和配置文件(如果没有测试可以没有这个目录)
- java:测试用的包和Java源文件
- resources:测试用的配置文件
- main:放置主程序Java代码和配置文件
- target:结果目录,保存编译后的.class文件
- pom.xml
Maven生命周期
什么是Maven的生命中周期:
- 就是Maven构建项目的过程,清理,编译,测试,报告,打包,安装,部署
- Maven的命令:Maven独立使用,通过命令,完成Maven的生命周期的执行。
- Maven的插件:Maven命令执行时,真正完成功能的是插件,插件就是一些jar文件, 一些类。
使用Junit:它的主要功能是测试类中每一个方法(方法都是独立测试的)
- 在pom.xml加入单元测试依赖
- 在Maven项目中的src/test/java目录下,创建测试程序。测试类的名称是:Test + 你要测试的类名。测试的方法名称是:Test + 方法名称(要求是public、返回值为void)
主要命令:
- mvn clean:清理。会删除原来编译和测试的目录,即target目录,但仓库里的包不会删除。
- mvn compile:编译主程序。只会编译main/java目录下的文件,编译后的文件存放于当前目录下新建的target目录。同时把class拷贝到 target/classes目录下面,把main/resources目录下的所有文件 都拷贝到target/classes目录下
- mvn test-compile:编译测试程序。只会编译test/java目录下的文件,编译结果会存储于当前目录下生成一个target
- mvn test:执行测试。会生成一个目录surefire-reports,保存测试结果
- mvn package:打包主程序。会编译、编译测试、测试、并且按照pom.xml配置把主程序打包生成jar包或者war包,存放于target目录。注意,只会把src/main下的文件打入包。
- mvn install:安装主程序。会把本工程打包,并且按照本工程的坐标保存到本地仓库中。
- mvn deploy:部署主程序(会把本工程打包,按照本工程的坐标保存到本地库中,并且还会保存到私服仓库中。还会自动把项目部署到web容器中)。
- 注意:执行以上命令必须在命令行进入pom.xml所在目录!