maven权威指南札记(二)

maven权威指南笔记(二)
第三章 一个maven的简单项目
$mvn archetype:create -DgroupId=org.sonatype.mavenbook\ch03 -DartifactId=simple -DpackageName=org.sonatype.mavenbook
mvn 是Maven2的命令。archetype:create称为一个Maven目标 (goal)。像-Dname=value这样的对是将会被传到目标中的参数,它们使用-D属性这样的形式1,类似于你通过命令行向Java虚拟机传递系统属性。archetype:create这个目标的目的通过archetype快速创建一个项目。在这里,一个archetype被定义为“一个原始的模型或者类型,在它之后其它类似的东西与之匹配;一个原型(prototype)”。archetype是一个插件标识而create是目标标识。Maven有许多可用的archetype,从生成一个简单的Swing应用,到一个复杂的Web应用。本章我们用最基本的archetype来创建一个入门项目的骨架。这个插件的前缀是“archetype”,目标为”create”。一个Maven插件是一个单个或者多个目标的集合。Maven插件的例子有一些简单但核心的插件,像Jar插件,它包含了一组创建JAR文件的目标,Compiler插件,它包含了一组编译源代码和测试代码的目标,或者Surefire插件,它包含一组运行单元测试和生成测试报告的目标。在包含pom.xml的目录下运行mvn install可以构建打包当期的应用为jar文件。一个目标是一个明确的任务,它可以作为单独的目标运行,或者作为一个大的构建的一部分和其它目标一起运行。一个目标是Maven中的一个“工作单元(unit of work)”
当Maven运行的时候它向项目对象模型(POM)查看关于这个项目的信息。POM回答类似这样的问题:这个项目是什么类型的?这个项目的名称是什么?这个项目的构建有自定义么?这里是一个由Maven Archetype插件的create目标创建的默认的pom.xml文件。
Pom.xml文件中的标签:
最开始的几个元素
——groupId,artifactId, packaging, version——是Maven的坐标(coordinates),
它们唯一标识了一个项目。name和url是POM提供的描述性元素,它们给人提供了可阅
读的名字,将一个项目关联到了项目web站点。最后,dependencies元素定义了一个
单独的,测试范围(test-scoped)依赖,依赖于称为JUnit的单元测试框架。
当Maven运行的时候,它是根据项目的pom.xml里设置的组合来运行的,一个最上级的
POM定义了Maven的安装目录,在这个目录中全局的默认值被定义了,(可能)还有一些
用户定义的设置。
Maven生命周期 (Lifecycle)
生命周期是包含在一个项目构建中的一系列有序的阶段,maven可以支持许多不同的生命周期,一般一个生命周期开始的第一个阶段是验证项目的基本完整性,最后一个阶段是把一个项目发布成产品。
一个生命周期是一些阶段的序列,Maven执行一个阶段的时候,它首先会有序的执行前面的所有阶段,到命令行指定的那个阶段为止。每个阶段对应了零个或者多个目标。
当Maven经过以package为结尾的默认生命周期的时候,下面
的目标按顺序被执行:
resources:resources
Resources插件的resources目标绑定到了resources 阶段。这个目标复制src/
main/resources下的所有资源和其它任何配置的资源目录,到输出目录。
compiler:compile
Compiler插件的compile目标绑定到了compile 阶段。这个目标编译src/main/
java下的所有源代码和其他任何配置的资源目录,到输出目录。
resources:testResources
Resources插件的testResources目标绑定到了test-resources 阶段。这个目标复
制src/test/resources下的所有资源和其它任何的配置的测试资源目录,到测试
输出目录。
compiler:testCompile
Compiler插件的testCompile目标绑定到了test-compile 阶段。这个目标编
译src/test/java下的测试用例和其它任何的配置的测试资源目录,到测试输出
目录。
surefire:test
Surefire插件的test目标绑定到了test 阶段。这个目标运行所有的测试并且创
建那些捕捉详细测试结果的输出文件。默认情况下,如果有测试失败,这个目标
会终止。
jar:jar
Jar插件的jar目标绑定到了package 阶段。这个目标把输出目录打包成JAR文
件。
当Maven运行一个目标的时候,每个目标都会访问定义在项目POM里的信息。当jar:jar目标需要创建一个JAR文件的时候,它通过观察POM来找出这个Jar文件的名字。当compiler:compile任务编译Java源代码为字节码的时候,它通过观察POM来看是否有编译目标的参数。目标在POM的上下文中运行。目标是我们希望针对项目运行的动作,而项目是通过POM定义的。POM为项目命名,提供了项目的一组唯一标识符(坐标),并且通过依赖 (dependencies) ,父 (parents) 和先决条件(prerequisite) 来定义和其它项目的关系。POM也可以自定义插件行为,提供项目相关的社区和开发人员的信息。
Maven坐标
一个项目由:groupId:artifactId:packaging:version唯一确定,groupId(团体表示的约定是以创建这个项目的组织名称的逆向域名开头),artifictId在groupId下得表示一个单独项目的唯一标识符。Packaging项目的类型默认为jar,类型为war的项目产生一个web应用。Maven仓库(公共的,私有地和本地的)是通过这些标识符来组织的。当一个项目本安装到本地仓库,它立刻能被任何其他的项目使用。只需在其他项目中使用maven的唯一坐标来加入对这个特定构建的依赖。
在maven中构件和插件是在他们被需要的时候从远程仓库取来的。