maven
Posted 南北12345678
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了maven相关的知识,希望对你有一定的参考价值。
https://blog.csdn.net/foreseeu/article/details/50551158
https://www.cnblogs.com/holbrook/archive/2012/12/24/2830519.html
首先,maven是一个项目管理和综合工具,它能提供给开发人员一个完成的生命周期框架。它使用标准的目录结构和默认构建生命周期。
目录结构:
maven提供给了我们一个标准的目录结构如下
这种目录结构能让我们很方便的在对应的位置找到对应的文件。而且秩序将文件防盗对应的位置,maven就可以帮助我们做完其它的事情。
pom简介:
pom.xml放在项目的根目录下,它描述了项目的基本信息,组织信息,依赖关系等等。
简单介绍几个基本内容
如图,其中groupID,artifactID,version合起来就是这个项目的坐标,它是唯一的。
依赖:
如上图所示,该项目可以有许多依赖项目,这些依赖项目可以是自己的项目,也可以使别人开发的项目,这里依赖了servlet的api作为例子。
多项目,继承:
父节点
属性:
上图配置了一个spring.version和一个jdk.version,这样的好处是当多处需要使用这些属性的时候,可以用${property}来直接引用,而不需要重复添加这个属性(个人理解类似于全局变量)
pom继承:当子项目很多时,很容易出现一些问题,比如依赖版本不一致等等,这个时候可以使用pom中的继承,与面向对象中的继承类似,它可以从父pom中继承后重写或者进行新的增加,可继承项有:
坐标属性,依赖配置,插件配置,一般性信息(如开发者信息)等等。
对于pom而言,maven中几乎所有的项目的pom都是从super pom继承而来,super pom定义了一组默认设置:
默认的文件位置,默认的插件配置,默认的中央仓库配置等等。
pom多模块构建:如图
即使用继承又使用组合。
仓库:
仓库是用于存储maven所有项目共享的一个构件空间。
分类:本地仓库,远程仓库。
本地用作缓存。
远程仓库有很多种,比如中央仓库和一些其它的公共仓库,私服等。当本地仓库没有找到所配置的依赖时,maven会查找远程仓库并将其下载到本地仓库。
构建生命周期简介:
maven有三套独立的生命周期。
clean有以下三个阶段组成:
pre-clean:预处理
clean:移除上一次构建的文件
post-clean:执行一些clean之后的工作
defeat默认的生命周期有23个阶段:(简介几个常用的)
validate:验证项目是否正确,必要信息是否缺少
process-resources:将一些必要的资源文件复制,为以后打包做准备
compile:编译
test:对代码进行单元测试
package:打包
install:将项目安装到本地仓库
deploy(默认生命周期的最后一个阶段):将我们的包上传到远程仓库
site有以下4个阶段:主要用于生成一些文档等等
pre-site
site
post-site
site-deploy
maven是一个插件式的架构,它由一个很小的引擎加上一大堆插件构成的,所有的插件也是maven构件的一部分,也是由maven仓库管理的
--------------------- 本文来自 foreseeu 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/foreseeu/article/details/50551158?utm_source=copy
由浅入深,主要介绍maven的用途、核心概念(Pom、Repositories、Artifact、Build Lifecycle、Goal)、用法(Archetype意义及创建各种项目)、maven常用参数和命令以及简单故障排除、maven扩展(eclipse、cobertura、findbugs、插件开发)、maven配置。
较长,可根据个人需要有选择性的查看,比如先看用法再回过头来看核心概念
1、maven的用途
maven是一个项目构建和管理的工具,提供了帮助管理 构建、文档、报告、依赖、scms、发布、分发的方法。可以方便的编译代码、进行依赖管理、管理二进制库等等。
maven的好处在于可以将项目过程规范化、自动化、高效化以及强大的可扩展性
利用maven自身及其插件还可以获得代码检查报告、单元测试覆盖率、实现持续集成等等。
2、maven的核心概念介绍
2.1 Pom
pom是指project object Model。pom是一个xml,在maven2里为pom.xml。是maven工作的基础,在执行task或者goal时,maven会去项目根目录下读取pom.xml获得需要的配置信息
pom文件中包含了项目的信息和maven build项目所需的配置信息,通常有项目信息(如版本、成员)、项目的依赖、插件和goal、build选项等等
pom是可以继承的,通常对于一个大型的项目或是多个module的情况,子模块的pom需要指定父模块的pom
pom文件中节点含义如下:
1
2
3
4
5
6
7
8
9
10
11
12
|
project pom文件的顶级元素
modelVersion 所使用的object model版本,为了确保稳定的使用,这个元素是强制性的。除非maven开发者升级模板,否则不需要修改
groupId 是项目创建团体或组织的唯一标志符,通常是域名倒写,如groupId org.apache.maven.plugins就是为所有maven插件预留的
artifactId 是项目artifact唯一的基地址名
packaging artifact打包的方式,如jar、war、ear等等。默认为jar。这个不仅表示项目最终产生何种后缀的文件,也表示build过程使用什么样的lifecycle。
version artifact的版本,通常能看见为类似0.0.1-SNAPSHOT,其中SNAPSHOT表示项目开发中,为开发版本
name 表示项目的展现名,在maven生成的文档中使用
url表示项目的地址,在maven生成的文档中使用
description 表示项目的描述,在maven生成的文档中使用
dependencies 表示依赖,在子节点dependencies中添加具体依赖的groupId artifactId和version
build 表示build配置
parent 表示父pom
|
其中groupId:artifactId:version唯一确定了一个artifact
2.2 Artifact
这个有点不好解释,大致说就是一个项目将要产生的文件,可以是jar文件,源文件,二进制文件,war文件,甚至是pom文件。每个artifact都由groupId:artifactId:version组成的标识符唯一识别。需要被使用(依赖)的artifact都要放在仓库(见Repository)中
2.3 Repositories
Repositories是用来存储Artifact的。如果说我们的项目产生的Artifact是一个个小工具,那么Repositories就是一个仓库,里面有我们自己创建的工具,也可以储存别人造的工具,我们在项目中需要使用某种工具时,在pom中声明dependency,编译代码时就会根据dependency去下载工具(Artifact),供自己使用。
对于自己的项目完成后可以通过mvn install命令将项目放到仓库(Repositories)中
仓库分为本地仓库和远程仓库,远程仓库是指远程服务器上用于存储Artifact的仓库,本地仓库是指本机存储Artifact的仓库,对于windows机器本地仓库地址为系统用户的.m2/repository下面。
对于需要的依赖,在pom中添加dependency即可,可以在maven的仓库中搜索:http://mvnrepository.com/
2.4 Build Lifecycle
是指一个项目build的过程。maven的Build Lifecycle分为三种,分别为default(处理项目的部署)、clean(处理项目的清理)、site(处理项目的文档生成)。他们都包含不同的lifecycle。
Build Lifecycle是由phases构成的,下面重点介绍default Build Lifecycle几个重要的phase
1
2
3
4
5
6
7
8
|
validate 验证项目是否正确以及必须的信息是否可用
compile 编译源代码
test 测试编译后的代码,即执行单元测试代码
package 打包编译后的代码,在target目录下生成package文件
integration-test 处理package以便需要时可以部署到集成测试环境
verify 检验package是否有效并且达到质量标准
install 安装package到本地仓库,方便本地其它项目使用
deploy 部署,拷贝最终的package到远程仓库和替他开发这或项目共享,在集成或发布环境完成
|
以上的phase是有序的(注意实际两个相邻phase之间还有其他phase被省略,完整phase见lifecycle),下面一个phase的执行必须在上一个phase完成后
若直接以某一个phase为goal,将先执行完它之前的phase,如mvn install
将会先validate、compile、test、package、integration-test、verify最后再执行install phase
2.5 Goal
goal代表一个特定任务
1
|
A goal represents a specific task (finer than a build phase) which contributes to the building and managing of a project.
|
如
mvn package表示打包的任务,通过上面的介绍我们知道,这个任务的执行会先执行package phase之前的phase
mvn deploy表示部署的任务
mven clean install则表示先执行clean的phase(包含其他子phase),再执行install的phase。
3、maven用法
主要讲下Archetype以及几种常用项目的创建
maven创建项目是根据Archetype(原型)创建的。下面先介绍下Archetype
3.1 Archetype
原型对于项目的作用就相当于模具对于工具的作用,我们想做一个锤子,将铁水倒入模具成型后,稍加修改就可以了。
类似我们可以根据项目类型的需要使用不同的Archetype创建项目。通过Archetype我们可以快速标准的创建项目。利用Archetype创建完项目后都有标准的文件夹目录结构
既然Archetype相当于模具,那么当然可以自己再造模具了啊,创建Archetype
下面介绍利用maven自带的集中Archetype创建项目。创建项目的goal为mvn archetype:generate,并且指定archetypeArtifactId,其中archetypeArtifactId见maven自带的archetypeArtifactId
3.2 quick start工程
创建一个简单的quick start项目,指定 -DarchetypeArtifactId为maven-archetype-quickstart,如下命令
Xml代码 收藏代码
mvn archetype:generate -DgroupId=com.trinea.maven.test -DartifactId=maven-quickstart -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
其中DgroupId指定groupId,DartifactId指定artifactId,DarchetypeArtifactId指定ArchetypeId,
DinteractiveMode表示是否使用交互模式,交互模式会让用户填写版本信息之类的,非交互模式采用默认值
这样我们便建好了一个简单的maven项目,目录结构如下:
现在我们可以利用2.4的build Lifecycle进行一些操作,先命令行到工程根目录下
编译 mvn compile
打包 mvn package,此时target目录下会出现maven-quickstart-1.0-SNAPSHOT.jar文件,即为打包后文件
打包并安装到本地仓库mvn install,此时本机仓库会新增maven-quickstart-1.0-SNAPSHOT.jar文件。
3.3 web工程
创建一个简单的web项目,只需要修 -DarchetypeArtifactId为maven-archetype-webapp即可,如下命令
1
|
mvn archetype:generate -DgroupId=com.trinea.maven.web.test -DartifactId=maven-web -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
|
其他:
src\\main\\resources文件夹是用来存放资源文件的,maven工程默认没有resources文件夹,如果我们需要用到类似log4j.properties这样的配置文件,就需要在src\\main文件夹下新建resources文件夹,并将log4j.properties放入其中。
test需要用到资源文件,类似放到src\\test下
对于apache的log4j没有log4j.properties文件或是目录错误,会报如下异常
1
2
|
log4j:WARN No appenders could be found for logger (org.apache.commons.httpclient.HttpClient).
log4j:WARN Please initialize the log4j system properly.
|
4、maven常用参数和命令
主要介绍maven常用参数和命令以及简单故障排除
4.1 mvn常用参数
mvn -e 显示详细错误
mvn -U 强制更新snapshot类型的插件或依赖库(否则maven一天只会更新一次snapshot依赖)
mvn -o 运行offline模式,不联网更新依赖
mvn -N仅在当前项目模块执行命令,关闭reactor
mvn -pl module_name在指定模块上执行命令
mvn -ff 在递归执行命令过程中,一旦发生错误就直接退出
mvn -Dxxx=yyy指定java全局属性
mvn -Pxxx引用profile xxx
4.2 首先是2.4 Build Lifecycle中介绍的命令
mvn test-compile 编译测试代码
mvn test 运行程序中的单元测试
mvn compile 编译项目
mvn package 打包,此时target目录下会出现maven-quickstart-1.0-SNAPSHOT.jar文件,即为打包后文件
mvn install 打包并安装到本地仓库,此时本机仓库会新增maven-quickstart-1.0-SNAPSHOT.jar文件。
每个phase都可以作为goal,也可以联合,如之前介绍的mvn clean install
4.3 maven 日用三板斧
mvn archetype:generate 创建maven项目
mvn package 打包,上面已经介绍过了
mvn package -Prelease打包,并生成部署用的包,比如deploy/*.tgz
mvn install 打包并安装到本地库
mvn eclipse:eclipse 生成eclipse项目文件
mvn eclipse:clean 清除eclipse项目文件
mvn site 生成项目相关信息的网站
4.4 maven插件常用参数
mvn -Dwtpversion=2.0 指定maven版本
mvn -Dmaven.test.skip=true 如果命令包含了test phase,则忽略单元测试
mvn -DuserProp=filePath 指定用户自定义配置文件位置
mvn -DdownloadSources=true -Declipse.addVersionToProjectName=true eclipse:eclipse 生成eclipse项目文件,尝试从仓库下载源代码,并且生成的项目包含模块版本(注意如果使用公用POM,上述的开关缺省已打开)
4.5 maven简单故障排除
mvn -Dsurefire.useFile=false如果执行单元测试出错,用该命令可以在console输出失败的单元测试及相关信息
set MAVEN_OPTS=-Xmx512m -XX:MaxPermSize=256m 调大jvm内存和持久代,maven/jvm out of memory error
mvn -X maven log level设定为debug在运行
mvndebug 运行jpda允许remote debug
mvn –help 这个就不说了。。
5、maven扩展
maven常用插件配置和使用
6、maven配置
为了修改maven创建项目默认以来的jdk版本,看了下maven配置
maven2.0默认使用jdk1.5导致反省、@override 等annotation不可用。可用两种方法修改jdk版本
第一种:修改项目的pom.xml,影响单个项目,治标不治本
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
|
pom中增加build配置,指定java版本为1.6
第二种:修改maven配置,影响maven建立的所有项目
到maven安装目录的conf文件夹下,修改settings.xml文件,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<profiles>
<profile>
<id>jdk-1.6</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.6</jdk>
</activation>
<properties>
<maven.compiler.source>1.6</maven.compiler.source>
<maven.compiler.target>1.6</maven.compiler.target>
<maven.compiler.compilerVersion>1.6</maven.compiler.compilerVersion>
</properties>
</profile>
</profiles>
|
这样便能对所有默认的maven项目指定jdk为1.6
到此为止,休息会儿
本文以类图的方式,介绍maven核心的12个概念以及相互之间的关系。
Table of Contents
1 maven管理的目标:工程(Project)
maven是一个软件工程(Software Project)管理工具。 对于maven来说,一个软件工程的唯一标识是由开发者(groupId)、生成物(artifactId)、版本(version) 共同决定的。
每个工程都有一个打包类型,可以是jar, war, ear 或 pom。打包类型决定了工程最终产物的类型。 其中pom类型用于构件多模块工程。
工程之间有两种关系:依赖和聚合。
1.1 工程依赖关系
依赖关系的管理是maven最为人称道的地方。一个工程可以依赖多个其他工程, 通过工程的唯一标识(groupId+artifactId+version)可以明确指明依赖的库及版本,而且能够处理 依赖关系的传递。 maven可以指定依赖的作用范围(scope),包括以下几种:
scope | 编译期 | 测试期 | 运行期 | 说明 |
---|---|---|---|---|
*compile | V | V | V | 默认scope |
test | V | 只在测试期依赖,如junit包 | ||
provided | V | V | 运行期由容器提供,如servlet-api包 | |
runtime | V | V | 编译期间不需要直接引用 | |
system | V | V | 编译和测试时由本机环境提供 |
由于依赖关系的传递性可能会导致依赖的版本、scope等发生冲突,maven提供了仲裁机制,同时也 允许自己通过配置进行依赖管理。
1.2 工程聚合关系
前面提到pom类型用于于构件多模块工程,这体现了project之间的一种聚合关系: 将一系列小的模块聚合成整个产品。
通过聚合后的工程可以同时管理每个相关模块的构建、清理、文档等工作。 聚合关系通过在子工程中指定一个pom类型的project作为父project来定义。
2 maven的核心:生命周期和阶段
maven将工程(Project)的构建过程理解为不同的生命周期(LifeCycle)和阶段(Phase)。 在工程的构建过程中,存在着不同的生命周期,这些生命周期互相独立,之间也没有一定的顺序关系。 每个生命周期又划分为不同的阶段(Phase)。阶段之间有明确的顺序关系, 同一生命周期内的阶段必须按顺序依次执行。
maven内置了三个生命周期,并为每个生命周期内置了一些阶段。 下面列举出maven内置的生命周期及主要的阶段:
- default:构建(Build)
- validate:验证项目是否正确,所有必需的信息是否可用。
- compile:编译项目中的代码。
- test:用相关的单元测试框架测试编译后的代码,这些运行的测试并不会随项目打包和布署。
- package:将编译后的代码打包成相应的格式文件,如jar包。
- integration-test: 如果需要在一个综合环境中运行我们的测试,这个阶段将会运行和布署项目到该环境中。
- verify: 检查项目的包是否正确和符合要求。
- install:将包安装到本地maven仓库,可以让其他项目作为依赖使用该包。
- deploy:将包发布到远程的maven仓库,并提供给其他开发者使用。
- clean:清理
- pre-clean 准备清理
- clean 执行清理工作
- post-clean 执行清理后的后续工作
- site:生成项目文档和站点
- pre-site 准备生成
- site 生成项目站点和文档
- post-site 执行生成文档后的后续工作
- site-deploy 发布项目文档
更详细的phase说明参考: http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Lifecycle_Reference
3 功能实现:插件和Goal
Maven中定义的工程周期和阶段只是抽象的概念,不涉及具体的功能。 具体的功能由插件(Plugin)实现。一个插件可以实现多个目标(Goal)。
为了解耦插件的功能和工程阶段,实现高度的可配置性,maven规定插件只是实现目标的功能, 通过配置来决定在哪个阶段执行(Execution)哪些目标操作。 甚至可以把一个Goal绑定到多个Phase,以实现复用。
maven内置了一些默认的插件,并根据不同的工程packing类型在各个phase中默认绑定了一些goal。 下表中列出default生命周期中各阶段默认绑定的goal,其中goal按照管理使用pluginname:goalname的方式标记:
Pahse | Plugin:Goal |
---|---|
process-resources | resources:resources |
compile | compiler:compile |
process-test-resources | resources:testResources |
test-compile | compiler:testCompile |
test | surefire:test |
package | ejb:ejb/ejb3:ejb3/jar:jar/par:par/rar:rar/war:war |
install | install:install |
deploy | deploy:deploy |
最后需要说明的是,maven的插件是一种packaging类型为maven-plugin的project, 可以使用maven project的依赖,配置插件等等一切特性。
4 仓库(Repository)
仓库主要用于获取工程依赖的其他工程的生成物,也可用来部署(deploy)maven工程的生成物。 生成物包括各种打包的生成物以及pom文件。
如果有必要,一个工程可以部署到多个仓库。
仓库可以分为本地库(local)和远程库(remote)。本地库通常位于本机的~/.m2/repository文件夹, 远程库最常见的是maven中央库(),此外也会有一些私服库用于企业内部。
5 小结
本文梳理了maven的核心概念,整个maven核心概念的全貌如下:
概念 | 说明 |
---|---|
LifeCycle | 生命周期,maven内置default,sie,clean三个生命周期 |
Phase | 阶段,每个生命周期有不同的阶段 |
Plugin | 插件,实现实际的构建功能 |
Goal | 一个插件可以实现多个goal,goal具备具体的功能 |
Execution | 通过配置,决定在某个Phase执行哪些Goal |
Project | maven管理的目标:软件工程,小的工程可以聚合成大工程 |
PackageType | 为了便于管理工程,按照构建目标区分成不同的工程类型,如jar,war,ear等 |
Dependency | 依赖,project之间存在依赖关系 |
DependencyScope | maven对依赖定义了不同的作用范围 |
Management | 可以配置一个工程如何管理依赖关系 |
Repository | 仓库,存放包,分为本地库和远程库 |
Build | 构建的动作。使用maven管理工程,主要是指定将project构建到某个phase |
Date: 2012-12-24 09:20:24 CST
HTML generated by org-mode 6.33x in emacs 23
以上是关于maven的主要内容,如果未能解决你的问题,请参考以下文章