Apache Maven的定义:Maven是一个项目管理工具,它包含了一个项目对象模型(Project Object Model,pom),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。

约定优于配置:系统、类库、框架应该假定合理的默认值,而非要求提供不必要的配置。

Maven是包含了一组关于软件项目和软件开发的语义规则的平台。这个基于每一个项目定义的模型实现了如下特征:

  依赖管理

    由于项目是根据一个包含组标识符,构件标识符和版本的唯一的坐标定义的。项目间可以使用这些坐标来声明依赖。

  远程仓库

    和项目依赖相关,使用定义在项目对象模型(POM)中的坐标来创建Maven构件的仓库

  全局性构建逻辑重用

    插件被编写成和项目模型对象一起工作,他们没有被设计成操作某一个已知位置的特定文件。一切都被抽象到模型中,插件配置和自定义行为都在模型中进行。

  工具可移植性/集成

    Maven标准化了POM信息。

  便于搜索和过滤构件

    像nexus这样的工具允许你使用存储在POM中给的信息对仓库中的内容进行索引和搜索

Maven安装目录

bin    ----包含了mvn运行的脚本。这些脚本用来配置Java命令,准备好classpath和相关的java系统属性,然后执行java命令。

boot    ----该目录只包含一个文件。以maven3.0为例,该文件为plexus-classworlds-2.2.3.jar。plexus-classworlds是一个类加载器框架。Maven使用该框架加载自己的类库

conf    ----包含settings.xml。

lib    ----包含了maven运行时需要的java类库。

LISENSE.txt    ----Maven使用的软件许可证

NOTICE.txt    ----Maven包含的第三方软件

README.txt    ----Maven的简单介绍

Apache Ant和 Apache Maven的区别

  Ant

    没有正式的约定。那你必须明确的告诉Ant去哪里找源码,输出放在哪里

    程序化,必须明确的告诉Ant做什么,什么时候做。

    没有声明周期。必须定义目标和目标之间的依赖,必须手工为每个目标附上一个任务序列

  Maven

    拥有约定

    声明式。只需创建一个pom.xml。Maven会帮助你处理其他的事情

    有一个生命周期。当你运行mvn install的时候被调用。

 

mvn archetype:create -DgroupId=com.xx.xx -DartifactId=test -DpackageName=com.xx.xx

archetype:create称为一个Maven目标。archetype被定义为一个原始的模型或类型,在他之后其他类似的东西与之匹配。

groupId,artifactId,packaging,version是Maven的坐标,它们唯一标识了一个项目。name和url是pom提供的描述性元素。他们给人提供了可阅读的名字,讲一个项目关联到项目web站点。dependencies元素定义了依赖。

一个Maven插件是一个单个或多个目标的集合。一个目标是一个明确的任务,他可以作为单独的目标运行,或者作为一个大的构建的一部分和其他目标一起运行。一个目标是maven中的一个工作单元。目标通过配置属性来进行配置,以用来定制行为。

目标定义了一些参数,这些参数可以定义一些明智的默认值。create目标的约定,是创建一个简单的项目,叫做Quickstart。create目标定义了一个配置属性archetypeArtifactId,它有一个默认值为maven-archetype-quickstart。Quickstart archetype生成了一个最小项目的驱壳,包括一个POM和一个类。

Jar插件包含了一组创建Jar文件的目标。

Compiler插件包含一组编译源代码和测试代码的目标。

Surefire插件包含一组运行单元测试和生成测试报告的目标。

通过保持Compiler插件和Maven核心分离,并且提供更新机制,用户很容易能使用编译器的最新版本。通过这种方式,Maven插件提供了通用构建逻辑的全局重用性。

生命周期是包含在一个项目构建中的一系列有序的阶段。Maven可以支持许多不同的生命周期,但是最常用的生命周期是默认的Maven生命周期,这个生命周期中一开始的一个阶段是验证项目的基本完整性,最后一个阶段是把一个项目发布成产品。生命周期单独的定义为验证、测试、发布。

基本生命周期:

phases

  process-resource -> compile -> process-classes -> process-test-resources -> test-compile -> test -> prepare-package -> package

goals  

  resources:resources -> compiler:compile -> resources:testResources -> compiler:testCompiler -> surefire:test -> jar:jar

Maven执行一个阶段的时候,他首先会有序的执行前面的所有阶段,到命令行指定的那个阶段为止。每个阶段对应了零个或多个目标。

当Maven经过以package为结尾的默认生命周期的时候,下面的目标按顺序被执行

  resources:resources

    Resources插件的resources目标绑定到了resources阶段。这个目标复制src/main/resources下的所有资源和其他任何配置的资源目录,到输出目录。

  compiler:compile

    Compiler插件的compile目标绑定到了compile阶段。这个目标编译src/main/java下的所有源代码和其他任何配置的资源目录,到输出目录。

  resources:testResources

    Resources插件的testResource目标绑定到了test-resources阶段。这个目标复制src/test/resources下的所有资源和其他任何的配置的测试资源目录,到测试输出目录。

  compiler:testCompile

    Compiler插件的testCompile目标绑定到了test-compile阶段。这个目标编译src/test/java下的测试用例和其他任何的配置的测试资源目录,到测试输出目录。

  compiler:testCompile

    Compiler插件testCompile目标绑定到了test-compile阶段。这个目标编译src/test/java下的测试用例和其他任何的配置测试资源目录,到测试输出目录。

  surefire:test

    Surefire插件的test目标绑定到了test阶段。这个目标运行所有的测试并且创建那些捕获详细测试结果的输出文件。默认情况下,如果测试有失败,这个目标会终止。

  jar:jar

    Jar插件的jar目标绑定到了package阶段。这个目标把输出目录打包成JAR文件。

Archetype插件通过名字为pom.xml文件创建了一个项目。这就是项目对象模型,一个项目的声明式描述。当Maven运行一个目标的时候,每个目标都会访问定义在项目POM里的信息。当jar:jar目标需要创建一个JAR文件的时候,他通过观察POM来找出这个JAR文件的名字。当compiler:compile任务编译Java源代码为字节码的时候,他通过观察POM来看是否有编译目标的参数。目标在POM的上下文中运行。目标是我们希望针对项目运行的动作,而项目是通过POM定义的。POM为项目命名,提供了项目的一组唯一标识符,并且通过依赖(dependencies),父(parents)和先决条件(prerequisite)来定义和其他项目的关系。POM也可以自定义插件的行为,提供项目相关的社区和开发人员的信息。

Maven坐标定义了一组标识,他们可以用来唯一标识一个项目、一个依赖或者Maven POM里的一个插件。groupId,articfactedId,version和packaging这些组合的标识符拼成了一个项目的坐标。一个Maven坐标是一个地址,即空间中的某个点:从一般到特殊。当一个项目通过依赖,插件或府项目引用和另外一个项目关联的时候,Maven通过坐标来精确定位一个项目

  groupId:团体标识的约定是以创建这个项目组织名称的逆向域名开头

  artifactId:在groupId下表示一个单独项目的唯一标识符

  version:一个项目的特定版本。发布的项目有一个固定的版本标识来指向该项目的某一个特定的版本。而正在开发中的项目可以用一个特殊的标识:SNAPSHOT。

  packaging:项目的类型,默认是jar,描述了项目打包后的输出。

Repository

在Maven中,构件和插件是在他们被需要的时候从远程的仓库取来的。Maven自带了一个用来下载Maven核心插件和依赖的远程仓库地址(http://repol.maven.org/maven2)。

Maven仓库是通过结构来定义的,一个Maven仓库是项目构件的一个集合,这些构件存储在一个目录结构下面,他们的格式能很容易被Maven所理解。Maven仓库的标准是按照下面的目录格式来存储构件的,相对于仓库的根目录:

  /groupId/artifactId/version/artifactId-version.packaging

Maven从远程仓库下载构件和插件到你本机上,存储在你的本地Maven仓库里,一旦Maven已经从远程仓库下载了一个构件,他将不需要再被下载。Maven会现在本地仓库查找插件。

  

Dependencies

一个复杂的项目将会包含很多依赖,也有可能包含依赖于其它构件的依赖。Maven支持了传递性依赖。Maven会隐式的把这些库间接依赖的库也加入到你的项目中。Maven也会处理这些依赖中的冲突,同时能让你自定义默认行为,或排除一些特定的传递性依赖。

在Maven中一个依赖不仅仅是一个JAR。他是一个POM文件,这个POM可能也声明了对其他构件的依赖,这些依赖的依赖叫做传递性依赖,Maven仓库不仅仅存贮二进制文件,也存储了这些构件的元数据,才使传递性依赖成为了可能。

Maven提供了不同的依赖范围(dependency scope)。当为项目创建一个Jar文件的时候,他的依赖不会被捆绑在生成的构件中,他们只是用来编译。当用Maven来创建War或Ear,可以使用provided范围,它排除WAR文件中特定的依赖。provided范围告诉Maven一个依赖在编译的时候需要,但是他不应该被捆绑在构建的输出中。

Site Generation and Reporting

Maven可以生成文档和报告。

mvn site只关心处理在src/site目录下的site内容,还有生成报告。他会在target/site目录下看到一个项目web站点。