Maven的核心概念

Maven是什么?

 

首先,Maven是什么?

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

什么是约定优于配置?

       系统、类库、框架应该假定合理的默认值,而非要求提供不必要的配置。在Maven中,它提供一些默认的选项,比如: 

      源代码约定存放在   project path/src/main/java

      资源文件存放在      project path/src/main/resources

      测试代码存放在      project path/src/test

      生成项目JAR的类   project path/target/classes

      项目JAR文件         project path/target 

什么是Maven插件的全局重用性?

       Maven的核心其实不做什么实际的事情,除了解析一些XML文档,管理生命周期与插件之外,它什么也不懂。反倒是Maven的插件被委派成主要职责的执行者,它们可以影响Maven的生命周期,提供对目标的访问。

       Maven Surefire : 负责运行单元测试的插件,插件的发展往往有很好的向后兼容性,比如你可以用新版本的surefire插件来运行你的Junit3单元测试,结果也可以成功运行。 但是如果你想用surefire运行TestNG写的测试用例,你也可以运行,除了POM中一个插件的版本号,你不需要更改你项目的任何东西.

       这种机制不仅仅适用于Surefire插件,也适用于项目使用Compiler插件进行编译等等,Maven将一般的构建任务抽象成插件,同时这些插件得到了很好的维护以及全局共享,你不需要从头开始自定义你项目的构建系统,然后提供支持。可以有人来维护这些插件,可以从远程仓库下载,这些都是基于 Maven插件的全局重用性. 

如何理解,一个"项目"的概念模型?

       Maven维护一个项目的模型,你需要为项目描述其属性。 项目的许可证是什么? 谁开发这个项目?这个项目有依赖于其他项目吗? Maven不仅仅类似于make和Ant的工具的基础上的改进,它基于项目模型, 这个项目定义的模型实现了一下特征:

    1. 依赖管理
      项目是根据一个包含 组标识符,构建标识符和版本来定义,项目可以使用这些来声明依赖
    2. 远程仓库
      和项目依赖相关的,我们可以使用定义在项目对象模型(POM)中的坐标来创建Maven构件的仓库
    3. 全局性构建逻辑重用
      插件被编写成和项目对象模型一起工作,一切都被抽象到模型中,插件配置和自定义行为都在模型中进行
    4. 工具可移植性/集成
      Maven出现之前,每个IDE都有不同的方法来存储实际上是自定义项目对象模型的信息。Maven标准化了这种描述,每个IDE仍然可以继续维护它的自定义项目文件,但是这些文件可以很容易的由模型生成。
    5. 便于搜索和过滤构件
      像Nexus这样的工具,允许你使用存储在POM中的信息对仓库中的内容进行索引和搜索。

     一个简单的Maven示例:

      在任何地方编写一个POM.XML文件,比如 d:/mvn_test/pom.xml

      写下如下代码:

<project><modelVersion>4.0.0</modelVersion><groupId>org.sonatype.mavenbook</groupId><artifactId>my-project</artifactId><version>1.0</version></project>

 

      在命令行中定位到, d:/mvn_test下, 运行 mvn install

        maven则会根据项目对象模型文件生成一个项目,  会创建target目录, 目录中会生成一个jar包跟一个存放POM属性文件的目录.

Maven标准目录结构

 

目录描述
src/main/java源代码
src/main/resources资源文件
src/main/filters资源过滤文件
src/main/assemblyMaven套件描述
src/main/config配置文件
src/main/webappweb应用资源
src/test/java测试源代码
src/test/resources测试资源
src/test/filters测试资源过滤文件
src/site应用站点
LICENSE.txt项目授权文件
README.txtProject's readme

 

Maven的常用命令

     mvn 命令是使用率最多的,常与下列参数一起使用:

命令描述
mvn archetype:create创建Maven项目
mvn compile编译源代码
mvn test-compile编译测试源代码
mvn test运行应用程序中的单元测试
mvn site生成项目相关信息的网站
mvn clean清除项目目录中的生成结果
mvn package根据项目生成的jar
mvn install在本地Repository中安装jar
mvn eclipse:eclipse生成Eclipse项目文件

Maven 实战

       使用maven archetype插件来创建一个项目;

mvn archetype:create     -DgroupId=org.sonatype.mavenbook.ch03     -DartifactId=simple     -DpackageName=org.sonatype.mavenbook

archetype:create 称之为maven的目标(通过archetype快速创建一个项目), 类似于Ant的一个目标.

-DName=value 代表给指定参数传入相应的值.

archetype:create  插件的前缀是 archetype  ,目标为 create

其创建于artifactId匹配的目标--- simple ,此为项目的基础目录.

 

 

 

 

通过上面步骤创建了一个应用,下面需要构建与打包这个应用了

mvn install

则可以将产生的项目构建并打包,则会产生target目录,结构如下:



 

 

其会将应用打包,你可以运行target下的jar文件,

 

 



  

 

Maven核心概念

 

 上面,我们用了两种类型的命令来运行maven,

            第一条命令是一条单个的插件目标 archetype:create

            第二条命令是生命周期阶段-install

   为了运行单个maven插件目标 ,我们使用 mvn archetype:create这样的语言,这里archetype是一个插件标识而create是目标标识。 一个maven插件是一个单个或者多个目标的集合。

     Maven插件的例子有一些简单但核心的插件,像Jar插件,它包含了一组创建Jar文件的目标,compiler插件,它包含一组编译源代码和测试代码的目标 等等 


 

  

 

另外,一个目标是一个明确的任务,它可以作为独立的目标运行,或者作为一个大的构建的一部分和其他目标一起运行。

       一个目标是Maven中的一个"工作单元." 比如: Compiler插件中的compile目标,它用来编译项目中所有源文件.  目标也可以定义一些参数,参数可以定义一些明智的默认值。 可以使用-DName=value方式传入.

        事实上,Maven的核心对你项目构建中特定的任务毫无所知。 它将所有任务代理给Maven插件来做,比如Compiler插件和Jar插件,它们在需要的时候被下载下来并且定时从Maven中央仓库更新。

        当你下载Maven的时候,你得到的仅仅是一个包含了基本功能的Maven,它知道如何解析命令行,管理classpath,解析POM文件,在需要的时候下载Maven插件等等。  通过保持Compiler插件与Maven核心分离,并且提供有效的更新机制,我们很容易使用编译器的最新版本。

 

 

Maven生命周期

 

      生命周期是包含在一个项目构建中的一些列有序的阶段。Maven可以支持许多不同的生命周期,但是最常用的生命周期是默认的Maven生命周期,其第一阶段是验证项目的基本完整性,最后一个阶段是把一个项目发布成产品。

         默认的Maven生命周期 




  

 

 

 其中,插件目标可以附着在生命周期阶段上。 随着Maven沿着生命周期的阶段移动,它会执行附着在特定阶段上的目标。

         Maven执行一个阶段的时候,它首先会有序的执行前面的所有阶段,到命令行指定的那个阶段为止。

Maven坐标

        Archetype插件通过名字为pom.xml的文件创建了一个项目。这就是项目对象模型(POM),一个项目的声明描述。当Maven运行一个目标的时候,每个目标都会访问定义在项目POM里的信息。 比如; 当jar:jar目标需要创建一个JAR文件的时候,他通过观察POM来找出这个Jar文件的名字。

       POM为项目命名,提供了项目的一组唯一标识符(坐标),并且通过依赖(dependencies),父(parents)和先决条件 (prerequisite)来定义和其他项目的关系。POM也可以定义插件的行为,为提供项目相关的社区和开发人员的信息.

      一般来说,POM中的groupId,artifactId,version和packaging构造成项目的坐标,一个Maven坐标是一个地址,当一个项目通过依赖,插件或者父项目引用和另外一个项目关联的时候,Maven通过坐标来精确定位一个项目。

 

 

 

 

Maven坐标通过使用冒号作为分隔符来写:  groupId:artifactId:packaging:version

 


 

 

 

Maven仓库

      Maven中,构建和插件是在它们被需要的时候从远程仓库取出来的,初始的Maven下载包的大小很小,大概1.8M, 主要是初始的Maven不包括很多插件。 它只包含了几近赤裸的最少值,而在需要的时候再去仓库取。

      Maven从远程仓库下载构件和插件到你本机上,存储在你的本地Maven仓库里。一旦Maven已经下载过一个构件,它将永远不需要再下载一次,因为Maven会首先查找本地的仓库,然后才是其他地方。

      Maven仓库既是一个从远程仓库下载的构件的缓存,也允许你的项目相互依赖。

Maven依赖管理

     我们可以在POM中定义项目的依赖,一个复杂的项目将会包含很多依赖,也有可能包含依赖于其他构建的依赖。这是Maven最强大的特征之一,它支持了传递性依赖。  比如说,你的项目依赖一个库,而这个库又依赖于5个或者10个其他的库(比如Spring),那么你不必找出所有这些依赖,然后写入POM,你只需要加上你直接依赖的那些库,Maven会隐式的把这些库间依赖的库也加入到你的项目中,Maven也会处理这些依赖中的冲突,同时能让你自定义默认的行为,或者排除一些特定的传递性依赖。

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

Maven站点生成和报告

       Maven另外一个重要特征是,它能生成文档和报告。 运行mvn site命令即可。

       这个命令会运行site生命周期阶段。 它不像默认生命周期那样,管理代码生成,操作资源,编译,打包等。 site生命周期只关心处理在src/site目录下的site内容,还有生成报告。

       它会产生target/site目录,里面存放着一个web站点,它包含项目的一些报告。 

Maven使用Demo:

    利用m2eclipse插件来创建demo:

使用m2eclipse创建web项目:  

 

 

 



  

 

 



 

  

 

这里m2eclipse会帮你做好一切准备工作,包括
创建相应的目录 、生成一个Servlet 、 在pom中加入项目默认依赖、添加jetty 插件.

 

 

 项目创建好之后,有一个默认的servlet来测试项目是否生成成功。 

 

 

 命令行进入到项目根路径: 运行命令 mvn jetty:run 

 

 

 

 

在m2eclipse创建web项目时,Jetty插件默认被安装,你可以查看pom.xml中的信息,则可以看到如下代码:

 



  

 

 

 

若命令行信息无误,则可以在浏览器中测试项目是否成功.默认的Servlet中,只打印出一句代码: 

 

 



  

 

 


 

 

 

 

测试成功的效果则如下: 

 

 



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值