Maven 核心原理
Posted 飞彻教育
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
4)找出黑窗体:输入指令mvn -v若出现下图所示即为正确
( 三)配置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 核心原理的主要内容,如果未能解决你的问题,请参考以下文章