maven简介

Posted 小明TI

tags:

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

一、maven简介
1.什么是maven?
2.什么是构建?
3.ant,maven的比较
4.maven软件安装目录结构
5.maven项目的目录结构
6.maven的特点
7.插件介绍
8.名词解释
8.1 Pom
8.2 Artifact
8.3 Repositories
9. mvn常用参数
10.与前端项目管理工具的简单比较
二、maven基本原理
1.maven生命周期
2.pom文件的简单介绍
2.1scope 范围介绍
三、maven常用命令
1. 创建Maven的普通java项目
2. 创建Maven的Web项目
3. 编译源代码
4. 编译测试代码
5. 运行测试
6. 产生site
7. 打包
8. 在本地Repository中安装jar
9. 清除产生的项目
10. 生成eclipse项目
11. 生成idea项目
12. 组合使用goal命令,如只打包不测试
14. 只打jar包
15. 只测试而不编译,也不测试编译
四、常见问题修复方法
1.mvn -e
2.mvn -X
3.mvn dependency:list
4.dependency:analyze
5.mvn help:effective-pom
五、参考资料
一、maven简介
1.什么是maven?
作为Apache组织中的一个颇为成功的开源项目,Maven主要服务于基于Java平台的项目构建、依赖管理和项目信息管理
Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑

2.什么是构建?
  项目构建过程包括【清理项目】→【编译项目】→【测试项目】→【生成测试报告】→【打包项目】→【部署项目】这几个步骤,这六个步骤就是一个项目的完整构建过程。

3.ant,maven的比较
Ant不是指蚂蚁,而是意指“另一个整洁的工具”(Another Neat Tool),它最早用来构建著名的Tomcat,Ant可以看成一个Java版本的Make,也是一款非常优秀的构建工具。最早用于构建著名的Tomcat项目
但是Ant和Maven显著的区别 是,Ant是过程式的,Maven是声明式的。Ant可以理解为一种由xml定义的可扩展脚本语言。Ant脚本可以省去重复的劳动,Maven做得更绝, 可以省去劳动。

Ant
Maven
目录结构 没有约定的目录结构 拥有约定,统一的代码放置目录
生命周期 没有生命周期,需要写配置文件定义目标和执行序列 拥有一个生命周期,例如执行 mvn install 就可以自动执行编译,测试,打包等构建过程
依赖管理 没有集成依赖管理,需要借助Ivy来解决依赖管理
拥有依赖管理(DMS),仓库管理

4.maven软件安装目录结构

bin:含有mvn运行的脚本
boot:含有plexus-classworlds类加载器框架
conf:含有settings.xml配置文件
lib:含有Maven运行时所需要的java类库
LICENSE.txt, NOTICE.txt, README.txt针对Maven版本,第三方软件等简要介绍
5.maven项目的目录结构
下面的表格展示了默认的源码、配置文件、编译后文件的默认存储位置:
配置项 默认值
Source Code /src/main/java
resources /src/main/resources
Tests /src/test
Complied byte codes /target
distributable Jars /target/classes

6.maven的特点
依赖管理
几乎任何Java应用都会借用一些第三方的开源类库,这些类库通过依赖的方式引入进项目。随着依赖的增多,版本不一致、版本冲突、依赖臃肿等问题会接踵而来。Maven提供了一个优秀的解决方案,通过坐标系统精确定位每一个构件(artifact)。
项目信息管理
maven把分散在各处的项目信息,包括项目描述、开发者列表、版本控制地址、许可证、缺陷管理系统地址等集中起来。Maven可以把这些信息生成 一个站点,用于开源项目的发布。通过一些插件,我们还可以轻松的获得项目文档、测试报告、静态分析报告、源码版本日志报告等有价值的项目信息。
中央仓库
maven为全世界的Java开发者提供了一个免费的中央仓库,在其中几乎可以找到任何流行开源类库。通过一些衍生搜索工具,确定类库坐标后,Maven会帮我们自动下载构建,省去手工劳动。
约定优于配置
Maven约定了项目目录结构、测试用例命名方法等内容。只要遵循这些成熟的规则,用户在项目间切换的时候救免去了额外的学习成本。
7.插件介绍
maven-archetype-plugin
Archtype指项目的骨架,Maven初学者最开始执行的Maven命令可能就是mvn archetype:generate,这实际上就是让maven-archetype-plugin生成一个很简单的项目骨架,帮助开发者快速上手。

maven-assembly-plugin
用途是制作项目分发包,该分发包可能包含了项目的可执行文件、源代码、readme、平台脚本等等。

maven-dependency-plugin
maven-dependency-plugin
最大的用途是帮助分析项目依赖
dependency:list能够列出项目最终解析到的依赖列表
dependency:tree能进一步的描绘项目依赖树
dependency:analyze可以告诉你项目依赖潜在的问题

maven-release-plugin
maven-release-plugin的用途是帮助自动化项目版本发布,它依赖于POM中的SCM信息。
release:prepare用来准备版本发布,具体的工作包括检查是否有未提交代码、检查是否有SNAPSHOT依赖、升级项目的SNAPSHOT版本至RELEASE版本、为项目打标签等等。
4.如果要发布snapshot版本,不需要特殊操作,只需要mvn clean deploy即可
5.如果要发布release版本,通常只需要如下几步

mvn release:prepare
Maven会进入交互模式,询问需要发布release的版本(默认是将当前版本的“-SNAPSHOT去掉”);然后询问发布后snapshot版本的版本号(默认当前版本增加一位小版本号);直接回车即可确认。
然后插件开始工作,主要进行的操作有:
A) 替换父工程和子模块的pom.xml中的version字段为1.0.5;然后在本地git仓库当前分支Commit一个版本
B) 在本地git仓库,创建一个tag,默认命名为XXX-1.0.5
C) 再将父工程和子模块的pom.xml中的version字段替换成1.0.6-SNAPSHOT;然后本地git仓库当前分支再Commit一个版本
D) 将以上本地版本push到git remote仓库
mvn release:perform 主要进行的操作是将第一步生成的tag clone到本地,然后对其进行build和deploy操作,完成之后能看到maven release仓库中已经有了对应的版本
mvn release:clean 这一步将上述过程中生成的临时文件清除

maven-resources-plugin
为了使项目结构更为清晰,Maven区别对待Java代码文件和资源文件,maven-compiler-plugin用来编译Java代码,maven-resources-plugin则用来处理资源文件。
默认的主资源文件目录是src/main/resources,很多用户会需要添加额外的资源文件目录,这个时候就可以通过配置maven-resources-plugin来实现。
参考文献:http://www.cnblogs.com/avivaye/p/5341341.html
8.名词解释
8.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
8.2 Artifact
这个有点不好解释,大致说就是一个项目将要产生的文件,可以是jar文件,源文件,二进制文件,war文件,甚至是pom文件。每个artifact都由groupId:artifactId:version组成的标识符唯一识别。需要被使用(依赖)的artifact都要放在仓库(见Repository)中
8.3 Repositories
Repositories是用来存储Artifact的。如果说我们的项目产生的Artifact是一个个小工具,那么Repositories就是一个仓库,里面有我们自己创建的工具,也可以储存别人造的工具,我们在项目中需要使用某种工具时,在pom中声明dependency,编译代码时就会根据dependency去下载工具(Artifact),供自己使用。
8.4 Archetype
原型对于项目的作用就相当于模具对于工具的作用,我们想做一个锤子,将铁水倒入模具成型后,稍加修改就可以了。
类似我们可以根据项目类型的需要使用不同的Archetype创建项目。通过Archetype我们可以快速标准的创建项目。利用Archetype创建完项目后都有标准的文件夹目录结构
9. 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
10.与前端项目管理工具的简单比较
make主要是C/C++用,但同时也是一种通用的构建工具,跟shell绑定的比较好
ant、maven是Java专用的,ant比较老已经彻底过气,maven用的比较多也已稍稍过气,现在gradle用的较多
gulp、grunt、webpack是javascript专用的,grunt稍过气,现在比较流行的是grunt和webpack,这两个侧重点不同,可以结合使用
Gulp就是为了规范前端开发流程,实现前后端分离、模块化开发、版本控制、文件合并与压缩、mock数据等功能的一个前端自动化构建工具
Webpack 是当下最热门的前端资源模块化管理和打包工具。它可以将许多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源。还可以将按需加载的模块进行代码分隔,等到实际需要的时候再异步加载。通过 loader的转换,任何形式的资源都可以视作模块,比如 CommonJs 模块、AMD 模块、ES6 模块、CSS、图片、JSON、Coffeescript、LESS 等。

链接:http://www.jianshu.com/p/b1022d224817

二、maven基本原理
1.maven生命周期
Maven有三套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”,初学者容易将Maven的生命周期看成一个整体,其实不然。这三套生命周期分别是:
Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。
Site Lifecycle 生成项目报告,站点,发布站点。

2.pom文件的简单介绍
2.1scope 范围介绍
compile (编译范围)
compile是默认的范围;如果没有提供一个范围,那该依赖的范围就是编译范围。编译范围依赖在所有的classpath 中可用,同时它们也会被打包。

provided (已提供范围)
provided 依赖只有在当JDK 或者一个容器已提供该依赖之后才使用。例如, 如果你开发了一个web 应用,你可能在编译 classpath 中需要可用的Servlet API 来编译一个servlet,但是你不会想要在打包好的WAR 中包含这个Servlet API;这个Servlet API JAR 由你的应用服务器或者servlet 容器提供。已提供范围的依赖在编译classpath (不是运行时)可用。它们不是传递性的,也不会被打包。

runtime (运行时范围)
runtime 依赖在运行和测试系统的时候需要,但在编译的时候不需要。比如,你可能在编译的时候只需要JDBC API JAR,而只有在运行的时候才需要JDBC
驱动实现。

test (测试范围)
test范围依赖 在一般的编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用。

system (系统范围)
system范围依赖与provided 类似,但是你必须显式的提供一个对于本地系统中JAR 文件的路径。这么做是为了允许基于本地对象编译,而这些对象是系统类库的一部分。这样的构件应该是一直可用的,Maven 也不会在仓库中去寻找它。如果你将一个依赖范围设置成系统范围,你必须同时提供一个 systemPath 元素。注意该范围是不推荐使用的(你应该一直尽量去从公共或定制的 Maven 仓库中引用依赖)。

元素
描述
ext
groupId 定义当前模块隶属的实际Maven项目, 表示方式与Java包类似 groupId不应直接对应项目隶属的公司/组织(一个公司/组织下可能会有很多的项目).
artifactId 定义实际项目中的一个Maven模块 推荐使用项目名作为artifactId前缀, 如:commons-lang3以commons作为前缀(因为Maven打包默认以artifactId作为前缀)
version 定义当前项目所处版本(如1.0-SNAPSHOT、4.2.7.RELEASE、1.2.15、14.0.1-h-3 等) Maven版本号定义约定: <主版本>.<次版本>.<增量版本>-<里程碑版本>
packaging 定义Maven项目打包方式, 通常打包方式与所生成构件扩展名对应 有jar(默认)、war、pom、maven-plugin等.
classifier 用来帮助定义构建输出的一些附属构件(如javadoc、sources) 不能直接定义项目的classifier(因为附属构件不是由项目默认生成, 须有附加插件的帮助)

三、maven常用命令
1. 创建Maven的普通java项目
mvn archetype:create
-DgroupId=packageName
-DartifactId=projectName
2. 创建Maven的Web项目
mvn archetype:create
-DgroupId=packageName
-DartifactId=webappName
-DarchetypeArtifactId=maven-archetype-webapp
3. 编译源代码
mvn compile
4. 编译测试代码
mvn test-compile
5. 运行测试
mvn test
6. 产生site
mvn site
7. 打包
mvn package
8. 在本地Repository中安装jar
mvn install
9. 清除产生的项目
mvn clean
10. 生成eclipse项目
mvn eclipse:eclipse
11. 生成idea项目
mvn idea:idea
12. 组合使用goal命令,如只打包不测试
mvn -Dtest package
14. 只打jar包
mvn jar:jar
15. 只测试而不编译,也不测试编译
mvn test -skipping compile -skipping test-compile
四、常见问题修复方法
1.mvn -e
To see the full stack trace of the errors, re-run Maven with the -e switch.
2.mvn -X
switch to enable full debug logging.
3.mvn dependency:list
4.dependency:analyze
可以告诉你项目依赖潜在的问题
5.mvn help:effective-pom
Displays the effective POM as an XML for this build, with the active profiles factored in.
五、参考资料
1.Maven核心原理博客
http://blog.csdn.net/zjf280441589/article/details/53044308
2.《Maven实战》

以上是关于maven简介的主要内容,如果未能解决你的问题,请参考以下文章

maven中,dependency 中的 classifier属性

怎么看pom里面的附属包来自哪个

Linux安装maven(详细教程)

POM (Project Object Model)简介

Maven

Maven初见