Maven 核心原理

Posted 飞彻教育

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Maven 核心原理相关的知识,希望对你有一定的参考价值。

生命周期与插件

Maven 将所有项目的构建过程统一抽象成一套生命周期: 项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成 … 几乎所有项目的构建,都能映射到这一组生命周期上. 但生命周期是抽象的(Maven的生命周期本身是不做任何实际工作), 任务执行(如编译源代码)均交由插件完成. 其中每个构建步骤都可以绑定一个或多个插件的目标,而且Maven为大多数构建步骤都编写并绑定了默认插件.当用户有特殊需要的时候, 也可以配置插件定制构建行为, 甚至自己编写插件. 
Maven 核心原理

(一)maven的介绍与概述


1.什么是maven?

 

中文意思为“知识的积累”,是Apache基金会出产的一个进行项目构建的工具,其核心是pom.xml(pom=Project Object model 项目对象模型)

 

  定义了项目的基本信息,用于描述项目如何构建,声明项目依赖等。

 

  特点:

 

  在开发中,为了保证编译通过,我们会到处去寻找jar包,当编译通过了,运行的时候,却发现"ClassNotFoundException",我们想到的是,难道还差jar包?

 

  每个Java项目的目录结构都没有一个统一的标准,配置文件到处都是,单元测试代码到底应该放在那里也没有一个权威的规范。

 

  因此,我们就要用到Maven(使用Ant也可以,不过编写Ant的xml脚本比较麻烦)----一个项目管理工具。

 

  简而言之:

 

  1)统一开发规范和工具

  2)统一管理jar包

 

  怎样使用:

 

  1)Maven环境的配置(安装)

  2) 配置Eclipse的maven插件(高版本的eclipse是可以省略的)


(二)配置maven的环境


备注:要是配置Maven的环境,需要先安装jdk(版本最好是1.6+)并且要配置好jdk的环境变量

maven的环境配置(安装):

                          1)去官网下载maven的安装包:apache-maven-3.5.0-bin

                          2)解压apache-maven-3.5.0-bin.zip,并把解压后的文件夹下的apache-maven-3.5.0-bin文件夹移动到D:\tools下,如果没有tools这个文件夹的话,请自行创建。

 

                          3配置环境变量:

新建系统变量M2_HOME:

变量值: D:\tools\apache-maven-3.5.0-bin\apache-maven-3.5.0

编辑系统变量   Path         添加变量值: %M2_HOME%\bin;

 

Maven 核心原理

Maven 核心原理

                 

                               4)找出黑窗体:输入指令mvn -v若出现下图所示即为正确


Maven 核心原理


( 三)配置eclipse的maven插件和设置


1.详细见eclipse使用maven的插件这个文件夹

2.配置好的eclipse进行设置

                        2.1设置eclipse关联上maven

                                                Windows–>Prefrences–>Installations–>Add。installation name选maven的根目录,然后一直按确定就OK啦

 

                        2.2更改本地仓库

                             友情提示:当maven环境配置好之后就会在当前电脑的用户下产生一个名字为.m2的文件夹,但是作为开发者一般需要更改路径

                             

                              怎样更改:

                                        1)去到D:\tools\apache-maven-3.5.0-bin\apache-maven-3.5.0\conf将settings.xml复制一份到C:\Users\Jack\.m2

                                        2)更改stettings.xml中的内容:加入 <localRepository>D:\maven_new_localrepository</localRepository> 

                                        3)在D盘创建一个名字为maven_new_localrepository的文件夹

//-------------------------------------------

0.Maven仓库可简单分成两类: 本地仓库与远程仓库. 当Maven根据坐标寻找构件时, 它会首先检索本地仓库,

                           如果本地存在则直接使用, 否则去远程仓库下载.

1.Maven的仓库分为:

                  1.2远程仓库又可简单分成两类: 

                                              中央仓库:http://repo1.maven.org/maven2/

                                              私服:是一种特殊的远程仓库,其实就是自己搭建的一个“类中央仓库”。


(四)创建maven项目


1.创建一个maven项目:

                    new-->Mavne Project-->maven-archetype-quickstart(这样是普通的Java项目)-->


                               Group Id:意思为公司名或者组织名

                                          com.baidu.bj    org.apache.uk

                                          例子:pro.yf.bj

                                 

                               Artifact Id:项目的名字

                                           例子:Mavne_HelloWorld

                            

                               Version:版本号,SNAPSHOT意为快照,说明该项目还在开发中,是不稳定的版本

                        

                 友情提示:上面的这三个因素构成了一个项目的基本信息(坐标),这是很重要的

                               

                               Package:项目中源代码存放的包的路径


2.pom.xml的讲解

   2.1   什么是pom:

                  pom作为项目对象模型。通过xml表示maven项目,使用pom.xml来实现。主要描述了项目:包括配

                          置文件;开发者需要遵循的规则,缺陷管理系统,组织和licenses,项目的url,项目的依赖性,

                          以及其他所有的项目相关因素  

                          简而言之:就是项目的配置清单

                          

  2.2 基本样子/内容:

               

    <dependencies> 

     <parent>

     <dependencyManagement>

     <modules>

     <properties>

    <build>

    <plugin>

    <pluginManagement>

               

   2.3基本节点的含义:

groupId:项目或者组织的唯一标志,并且配置时生成路径也是由此生成,如org.myproject.mojo生成的相对路径为:/org/myproject/mojo


artifactId:项目的通用名称


version:项目的版本


packaging:打包机制,如pom,jar(默认的),maven-plugin,ejb,war,ear,rar,par

    

                name:项目的名称

                

                url:项目开发团队的网址,无关紧要,可以省略

            

                description:项目描述

                

   2.4dependcy

                dependencies:该元素描述了项目中用到的所有的依赖,且这些依赖组成了项目构建过程中的一个一个的环节,且他们会自动的从项目定义的仓库中下载

               

                 dependcy里面的属性值得意思:

type:默认为jar类型,常用的类型有:jar,ejb-client,test-jar...,可设置plugins中的extensions值为true后在增加 新的类型,

scope:是用来指定当前包的依赖范围,maven的依赖范围常有以下四种值:

                                              compile(编译范围)

                                              provided(已提供范围)

                                              runtime(运行时范围)

                                              test(测试范围)

                                              system(系统范围)

optional:设置指依赖是否可选,默认为false,即子项目默认都继承,为true,则子项目必需显示的引入,与dependencyManagement里定义的依赖类似 。

exclusions:如果X需要A,A包含B依赖,那么X可以声明不要B依赖,只要在exclusions中声明exclusion.

exclusion:是将B从依赖树中删除,如上配置,alibaba.apollo.webx不想使用com.alibaba.external  ,但是alibaba.apollo.webx是集成了com.alibaba.external,r所以就需要排除掉.

                                    version;版本号

                                    systempath:当scope的值为system时,提供相应的路径

                                   

         简而言之:                          

                 内部包含若干<dependency>

           {    groupId, artifactId,version 三个基本属性

                type :默认jar类型

                scope: 当前包依赖类型

                optional: false时, 继承这个项目所有的子项目。 true时, 该项目的子项目需要显式引入

                exclusion :排除某项 }

 

 友情提示:这种依赖关系到底该怎么写,建议方案一:去百度自己搜索然后复制粘贴;或者方案二:其他想要依赖的包,对应的dependency,可以在这个网站找: 

                                                                                                http://mvnrepository.com/

  

   2.5dependencyManagement:

              通常在最顶层父pom中,让所有在子项目中引用一个依赖而不用显式地列出版本号。


   2.6modules:

             将项目分块,达到高内聚,低耦合的目的

             

   2.7properties:声明一些常量。如:

       <file.encoding>UTF-8<file.encoding>    <spring.version>3.2.3.RELEASE</spring.version>

              引用时 :  ${file.encoding}                 ${spring.version}       

             也可以通过project.xx引用项目的定义的属性,例如: ${project.groupId} 引用当前pom定义的groupId        


   2.8build:构建项目需要的信息

      defaultGoal  默认目标

      directory   制定buildtarget目标下的目录

      

   2.9plugin:声明项目中所使用的插件   

   

   2.10pluginManagement: 作用类似于dependencyManagement, 定义子项目中的插件。 这样在子项目中使用插件时,可以不用指定其版本,由父项目统一进行管理。

  

   2.11parent:父项目的坐标。如果项目中没有规定某个元素的值,那么父项目中的对应值即为项目的默认值。 坐标包括group ID,artifact ID和 version。

   

   备注:如果希望拓展的更加全面请看pom.xml详解这个文件夹


  3.maven的仓库:Maven仓库可简单分成两类: 本地仓库与远程仓库. 当Maven根据坐标寻找构件时, 它会首先检索本地仓库,


  如果本地存在则直接使用, 否则去远程仓库下载.

                                  

3.1.Maven的仓库分为:



怎样更改本地仓库:

                       1)去到D:\tools\apache-maven-3.5.0-bin\apache-maven-3.5.0\conf将settings.xml复制一份到C:\Users\Jack\.m2

                                       2)更改stettings.xml中的内容:加入 <localRepository>D:\maven_new_localrepository</localRepository> 

                                       3)在D盘创建一个名字为maven_new_localrepository的文件夹


  友情提示:当maven环境配置好之后就会在当前电脑的用户下产生一个名字为.m2的文件夹,但是作为开发者一般需要更改路径。


  1.2远程仓库又可简单分成两类:


  1.2.1中央仓库:http://repo1.maven.org/maven2/


  1.2.2 私服:是一种特殊的远程仓库,其实就是自己搭建的一个“类中央仓库”,但是公司必须要有服务器

                                                                  

4.Maven的生命周期和插件

  4.1maven有三套相互独立的生命周期

  4.1.1 Clean :在进行真正的构建之前进行一些清理工作。 简称 “清理”,且包含三个phase(阶段)。

  1)pre-clean:执行清理前需要完成的工作

2)clean:清理上一次构建生成的文件

3)post-clean:执行清理后需要完成的工作

                                        

  4.1.2Default :定义了真正构建时所需要执行的所有步骤:,编译,测试,打包,部署等等。

 简称"构建项目",且包含以下几个重要的阶段 

1)validate:验证工程是否正确,所有需要的资源是否可用。

2)compile:编译项目的源代码。  

3)test:使用合适的单元测试框架来测试已编译的源代码。这些测试不需要已打包和布署。

4)Package:把已编译的代码打包成可发布的格式,比如jar。

5)integration-test:如有需要,将包处理和发布到一个能够进行集成测试的环境。

6)verify:运行所有检查,验证包是否有效且达到质量标准。

7)install:把包安装到maven本地仓库,可以被其他工程作为依赖来使用。

8)Deploy:在集成或者发布环境下执行,将最终版本的包拷贝到远程的repository,使得其他的开发者或者工程可以共享

  在面向对象中, 可以通过类继承实现复用. 在Maven中同样也可以创建POM的父子结构, 通过在父POM中声明一些配置供子POM继承来实现复用与消除重复。

1)pre-site:生成项目站点之前需要完成的工作

2)site:生成项目站点文档

3)post-site:生成项目站点之后需要完成的工作

4)site-deploy:将项目站点发布到服务器


  导读:为了能让用户几乎不用任何配置就能使用Maven构建项目, Maven 默认为一些核心的生命周期绑定了插件目标,

  当用户通过命令调用生命周期阶段时, 对应的插件目标就会执行相应的逻辑.

                                                      

                                                     例如:                                                

clean maven-clean-plugin:clean

test maven-surefire-plugin:test 执行测试用例

site maven-site-plugin:site


                                             最关注的:这些只要求学员了解知道就行了

                 

5.Maven的聚合特性:(aggregation)能够使项目的多个模块聚合在一起构建


        导读:随着项目越来越复杂(需要解决的问题越来越多、功能越来越重), 我们更倾向于将一个项目划分几个模块并行开发,

                      如: 将feedcenter-push项目划分为client、core和web三个模块, 而我们又想一次构建所有模块, 而不是针对各模

                      块分别执行$ mvn命令. 于是就有了Maven的模块聚合 -> 将feedcenter-push作为聚合模块将其他模块聚集到一起构建:

                                        友情提示:聚合模块的POM仅仅是帮助聚合其他模块构建的工具, 本身并无实质内容:

<project xmlns="http://maven.apache.org/POM/4.0.0"

        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0

        http://maven.apache.org/xsd/maven-

6.maven的继承:


  在面向对象中, 可以通过类继承实现复用. 在Maven中同样也可以创建POM的父子结构, 通过在父POM中声明一些配置供子POM继承来实现复用与消除重复。


        优点: 当依赖、插件的版本、配置等信息在父POM中声明之后, 子模块在使用时就无须声明这些信息, 也就不会出现多个子模块使用的依赖版本不一致的情况,也就降低了依赖冲突的几率. 

                          

           友情提示:另外如果子模块不显式声明依赖与插件的使用, 即使已经在父POM的dependencyManagement、pluginManagement中配置了, 也不会产生实际的效果.     

          

 总结:推荐: 模块继承与模块聚合同时进行,这意味着, 你可以为你的所有模块指定一个父工程, 同时父工程中可以指定其余的Maven模块作为它的聚合模块

 

特别注意:聚合与集成搭配使用时需要遵循以下三条规则:

在所有子POM中指定它们的父POM;

将父POM的packaging值设为pom;

在父POM中指定子模块/子POM的目录.


看完本文有收获?请转发分享给更多人

关注「飞彻教育」,提高编程技能

程序猿的那些事


分享程序员相关技术干货 资讯 高薪职位 免费教程

Maven 核心原理

以上是关于Maven 核心原理的主要内容,如果未能解决你的问题,请参考以下文章

Maven01_快速搭建使用(不涉及内部原理)

Maven详解------ 创建Web工程以及插件原理

Spring Security基本原理

SpringBoot学习笔记—— 自动装配原理

约定的目录结构说明

boot自动配置的原理