第1章 Maven简介

maven是一种优秀强大的构建工具,帮助我们自动化构建过程,从清理、编译、测试、生产报告、打包再到部署。maven主要服务于java平台的项目构建、依赖管理等。

maven通过坐标体系唯一的定位到一个构件(artifact)。

maven为全世界的java开发者提供了一个免费的中央仓库;它的衍生工具(如nexus),可以帮助我们进行快速的搜索。

和Make一样,Ant也都是过程式的,开发者显式地指定每一个目标,以及完成该目标所需要执行的任务。针对每一个项目,开发者都需要重新编写这一过程,这里其实隐含着很大的重复。Maven是声明式的,项目构建过程和过程各个阶段所需的工作都由插件实现,并且大部分插件都是现成的,开发者只需要声明项目的基本元素,Maven就执行内置的、完整的构建过程。这在很大程度上消除了重复。

maven对于项目目录结构、测试用例命名方式等内容都有既定的规则,只要遵循了这些成熟的规则,用户再项目间切换的时候就免去了额外的学习成本,可以说是“约定优于配置”(Convention Over Configuration)。

 

第3章 Maven使用入门

就像Make的Makefile、Ant的build.xml,Maven项目的核心是pom.xml。

"mvn clean compile":clean告诉maven清理输出目录target/;compile告诉maven编译项目主代码(maven约定是在src/main/java下)。执行过程中,maven首先执行clean:clean任务,删除target/目录。默认情况下,maven构建的所有输出都在target/目录中;接着执行resources:resources任务,获取项目配置资源(maven约定是在src/main/resources下);最后执行compiler:compile任务,将项目驻代码编译至target/classes目录下。

上面提到的clean:clean、resources:resources和compiler:compile对应了一些Maven插件及插件目标,比如clean:clean是clean插件的clean目标,compiler:compile是compiler插件的compile目标。

"mvn clean test":maven实际执行的可不止这两个任务,还有clean:clean、resources:resources、compiler:compile、resources:testResources以及compiler:testCompile。在Maven执行测试(test)之前,它会先自动执行项目主资源处理、主代码编译、测试资源处理、测试代码编译等工作,这是Maven生命周期的一个特性。

"mvn clean package":maven会在打包之前执行编译、测试等操作,然后会调用jar插件的jar目标将项目主代码打包成一个jar或war等。打包成功后,就可以复制这个jar文件到其他项目的classpath中使用,但是如何才能让其他的maven项目直接引用这个jar呢?就用到了下面的命令:

"mvn clean install":实际是在打包之后,再执行安装任务install:install。从输出结果可以看到该任务将项目输出的jar安装到本地maven库。

 

在项目的根目录中放置pom.xml,在src/main/java目录中放置项目的主代码,在src/test/java中放置项目的测试代码。之所以一步一步地展示这些步骤,是为了能让可能是Maven初学者的你得到最实际的感受。我们称这些基本的目录结构和pom.xml文件内容称为项目的骨架,当第一次创建项目骨架的时候,你还会饶有兴趣地去体会这些默认约定背后的思想,第二次,第三次,你也许还会满意自己的熟练程度,但第四、第五次做同样的事情,你可能就会恼火了。

每次都要自己创建pom文件和约定的文件夹,你就觉得繁琐的,所以就有archetype这个插件,它的generate命令,就可以帮助我们选择已经定义好的项目骨架,帮助我们搭建出项目的基本结构。

默认情况下,maven假设主代码位于src/main/java目录;项目资源位于src/main/resources;对应的,默认的测试代码目录是src/test/java;

groupid、artifactid、version是任何一个maven项目最基本的坐标。

maven中央仓库 http://repo1.maven.org/maven2/

POM 文件中还有一个值为 test 的元素 scope,scope 为依赖范围,若依赖范围为 test 则表示该依赖只对测试有效,换句话说,测试代码中的 import JUnit 代码是没有问题的, 但是如果我们在主代码中用 import JUnit 代码,就会造成编译错误。如果不声明依赖范 围,那么默认值就是 compile,表示该依赖对主代码和测试代码都有效。