1. 描述一个Maven插件
mvn help:describe -Dplugin=help
mvn help:describe -Dplugin=help -Dfull
mvn help:describe -Dplugin=compiler -Dmojo=compile -Dfull
2. 创建一个项目
mvn archetype:create -DgroupId=org.p2p.chord -DartifactId=simple -DpackageName=org.p2p.chord
mvn是Maven2的命令,archetype:create称为一个Maven目标(goal).一个archetype被定义为“一个原始的模型或者类型,在它之后其他类似的东西与之匹配一个原型(prototype).Maven有许多可用的archetype,从生成一个简单的Swing应用,到一个复杂的web应用。
3. 构建并打包应用
在包含pom.xml的目录下运行mvn install
4. 简单的项目对象模型
PoM描述了这个项目是什么类型的,这个项目的名称是什么,这个项目的构建有自定义么。定义多个依赖,自定义插件行为。groupId,artifactId,packaging,version是Mavende坐标(corrdinates),它们唯一标识了一个项目。name和url是pom提供的描述性元素,它们给人提供了可阅读的名字,将一个项目关联到项目web站点。最后depecdencies元素定义了一个单独的,测试范围(test-scoped)依赖,依赖于称为Junit的单元测试框架。
mvn help:effective-pom能查看有效的(effective)POM,或者说Maven真正运行根据的POM.
5. Maven插件和目标(plugins and Goals)
一个Maven插件是一个单个或者多个目标的集合.一个定制的插件可以用java编写,或者用一些其他语言如Ant,Groovy,beanshell和之前提到的Ruby.一个目标是一个明确的任务,它可以作为单独的目标运行,或者作为一个大的构建的一部分和其他目标一起运行。一个目标是Maven中的一个工作单元(unit of work)。目标通过配置属性进行配置,以用来定制行为。
Maven的核心对你的项目构建中特定的任务几乎毫无所知。就它本身来说,Maven不知道如何编译你的代码,它甚至不知道如何制作一个JAR文件,它把所有这些任务代理给了Maven插件,像Compiler插件和Jar插件,它们在需要的时候被下载下来并且定时的从Maven中央库更新。当你下载Maven的时候,你得到的是一个包含了基本躯壳的Maven核心,它知道如何解析命令行,管理classpath,解析POM文件,在需要的时候下载Maven插件。通过保持Compiler插件和Maven核心分离,并且提供更新机制,用户很容易能使用编译器最新的版本。通过这种方式,Maven插件提供了通用构建逻辑的全局重用性,有不会在构建周期中定义编译任务,有使用了所有Maven用户共享的Compiler插件。如果有个对Compiler插件的改进,每个使用Maven的项目可以立刻从这种变化中得到好处。(并且,如果你不喜欢这个compiler插件,你可以用你的实现来覆盖它)。
6. Maven生命周期(Lifecycle)
Maven生命周期阶段,一个阶段是在被Maven称为”构建生命周期”中的一个步骤。生命周期是包含在一个项目构建中的一系列有序的阶段。Maven可以支持许多不同的生命周期,但是最常用的生命周期是默认的Maven生命周期,这个生命周期中一开始的一个阶段是验证项目的基本完整性,最后的一个阶段是把一个项目发布成产品。
一个生命周期是一些阶段的序列,插件目标可以附着在生命周期阶段上。随着Maven沿着生命周期的阶段移动,它会附着在特定阶段上的目标。每个阶段可能绑定了零个或者多个目标。
7. Maven仓库(Repositories)
Maven仓库的标准是按照下面的目录格式来存储构件,相对于仓库的根目录:
/<groupId>/<artifactId>/<version>/<artifactId>-<version>.<packaging>。例如坐标为org.apache.commons:commons-email:1.1的构建能在目录/org/apache/commons/commons-eamil/1.1下找到文件名为commons-email-1.1.jar。
8. Maven依赖管理(Dependency Management)
在Maven中一个依赖不仅仅是一个JAR,它是一个POM文件,这个POM可能也什么了对其他构件的依赖。这些依赖的依赖叫做传递性依赖,Maven仓库不仅仅存储二进制文件,也存储了这些构件的元数据(metadata),才使传递性依赖成为可能。Maven同时也提供了一种机制,能让你排除一些你不想要的传递性依赖。Maven也提供了不同的依赖范围(dependency scope)。当一个依赖的范围是test的时候,说明它在compiler插件运行compile目标的时候是不可用的。它只有在运行compiler:testCompiler和sureire:test目标的时候才会被加入到classpath中。
//todo provided范围的使用
9. 站点生成和报告(site Generation and Reporting)
Maven的重要特征是,它能生成文档和报告。
mvn site site生命周期阶段,它不像默认生命周期那样,管理代码生成,操作资源,编译、打包等等。site生命周期只关心处理在src/site目录下的site内容,还有生成报告。在这个命令运行过之后,你将会在target/site目录下看到一个项目的web站点。载入target/site/index.htm你会看到项目站点的基本外貌。
-D<name>=<value>这种格式不是Maven定义的,它其实是Java用来设置系统属性的方式,可以通过java -help查看java的解释。Maven的bin目录下的脚步仅仅是把属性传入java而已。