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站点。

Maven概述的更多相关文章

  1. Java入门到精通——工具篇之Maven概述

    为接手gxpt准备已经快一个月了从SSH2-->EJB-->环境搭建-->Maven的构建.下面就带领大家初始Maven 一.什么是Maven. Maven是一个垮平台的项目管理工具 ...

  2. Maven详解(一)------ Maven概述

    1.引言 你能搜到这个教程,说明你对 Maven 感兴趣,但是又不是太理解.那么接下来这个系列的教程将会详细讲解 Maven 的用法,相信你看完之后,一定能对 Maven 的理解更进一步! 2.常规项 ...

  3. Maven概述(一)

    Maven是什么? Apache Maven is a software project management and comprehension tool. Based on the concept ...

  4. Maven实战读书笔记(一):Maven概述

    1.1 Maven是什么,能做什么 Maven是一个跨平台的项目管理工具,主要服务于Java平台的项目构建.依赖管理和项目信息管理. Maven的用途之一是项目构建,能够自动化构建过程,从清理.编译. ...

  5. 【Java EE 学习 82 上】【MAVEN基本安装和使用方法】

    一.Maven概述 1.什么是Maven? Maven中文意思是"行家"."专家",它是一种跨平台的项目管理工具. 2.Maven有什么作用? Maven能够实 ...

  6. 使用maven来管理java项目

    初学maven,简单总结一下学习心得,若有不对的地方,欢迎各位大神给我指正~ 总结分为6个部分 maven概述 maven安装 maven项目结构和创建方法 maven配置文件settings.xml ...

  7. Maven Myeclipse 搭建项目

    一.maven概述 Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具! 简单说Maven 是一个项目管理和构建自动化工具 二.环境搭建 1. ...

  8. Maven(一)初识Maven

    前言 在这之前一直都有去看关于Maven的相关介绍,但是没有到真正要用的时候,自己总是以为懂了.其实真的感觉Maven并没有想象的那么简单! 那我们该怎么去学习maven呢?接下来我将从: 初步认识m ...

  9. maven基本基础知识及命令学习-1

    Maven概述:Maven是很有效的项目管理工具,maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目构建.报告和文档的软件项目管理工具.统一管理环境,架包等. 一 maven下载 ...

随机推荐

  1. cf 700 B Connecting Universities

    题意:现在给以一棵$n$个结点的树,并给你$2k$个结点,现在要求你把这些节点互相配对,使得互相配对的节点之间的距离(路径上经过边的数目)之和最大.数据范围$1 \leq n \leq 200000, ...

  2. 修改mysql表结构,添加一个主键索引自增字段,修改原来的主字段为普通字段

    原来有一个字段id,为自增,主键,索引.现在要新增一个字段s_id为自增,主键,索引.同时把原来的主字段改成普通字段,默认值为0. Alter table e_diamond_jhds change ...

  3. libevent源码分析:bufferevent

    struct bufferevent定义在文件bufferevent_struct.h中. /** Shared implementation of a bufferevent. This type ...

  4. selenium操作H5视频

    测试网址:http://www.w3school.com.cn/tiy/loadtext.asp?f=html5_video_simplepackage com.allin.pc;import jav ...

  5. javascript实现图片滚动

    闲来无事捣鼓了一个原来的js图片滚动 首先看看 静态页的结构: <body> <a href="javascript: le()">向左</a> ...

  6. ie6兼容之绝对定位元素内容为空时高度问题

    正常显示: ie6下显示: line6元素高度最小16px; 解决办法: 添加内容在空的div里,并且设置行高即可. 其中,非ie6浏览器不需要再空的div里加无谓的内容,再次需要用“条件注释”来解决 ...

  7. 01-C语言概述

    本文目录 一.C语言简史 二.C语言的特点 三.C语言能做什么? 四.C语言的版本问题 五.C语言语法预览 回到顶部 一.C语言简史 C语言于1972年发明,首次使用是用于重写UINX操作系统(UNI ...

  8. codeforces 446A DZY Loves Sequences

    vjudge 上题目链接:codeforces 446A 大意是说最多可以修改数列中的一个数,求最长严格递增的连续子序列长度. 其实就是个 dp 的思想,想好思路后交上去没想到一直 wa 在第二个测试 ...

  9. [分享] WIN7x64封装体积小于4G制作过程

    raymond 发表于 2015-11-1 18:27:17 https://www.itsk.com/thread-359041-1-1.html 前人栽树,后人乘凉!感谢各位大神的作品!我只是按部 ...

  10. j.一个NIO与SSLEngine结合的例子

    对于BIO通道的程序来讲,建立起SSLServerSocket之后,后续的工作就和普通的ServerSocket没有什么区别了,这是因为JDK中通过JSSE的API,封装了SSL通道的实现逻辑,否则, ...