接触maven已经很久了,在清理电脑资料中发现以前写的一篇maven培训的文章,整理下发出来方便初学者了解下一些maven的基础(文中没提到的请参考官网)。
一、什么是Maven?
Maven是Apache下的开源项目http://maven.apache.org/。
Maven有“内行”和“专家”的意思,也可以翻译成为“知识的积累”。
Apache Maven is a software project management and comprehension tool.
Based on the concept of a project object model (POM), Maven can manage a project's build, reporting and documentation from a central piece of information.
Maven是软件项目管理和理解的工具。
基于项目对象模型POM(Project-Object-Model),Maven开源通过一小段描述信息来管理项目构建,报告和文档。
二、为什么用Maven?
以前我们普通的java项目,当需要依赖包的时候需要从其官网上下载对应的依赖jar包,需要我们手动的导入到lib文件夹下。而用maven构建项目,我们只需要写上jar包的名字和版本信息,maven会自动去网站上下载我们需要的jar。执行代码的时候需要我们去编译、运行单元测试、生成文档、打包、部署,而maven工具为我们封装了这些重复的工作。
1. Maven让build过程简单
Maven有中心仓库https://repo.maven.apache.org/maven2 ,默认配置都会去中心仓库下载包;下载的包会存储到本地仓库。项目中一般会搭建私有仓库,用来管理项目中相关的包。
不需要去到处找jar,只需要添加依赖。可以通过http://mvnrepository.com/ 去找。
代码复用,可以将公共的代码或者其他人需要调用的jar抽离出来发布到私有Maven库上,其他人只需要关注需要用引入依赖,不需要关心依赖的jar。
2. Maven可以方便的发布版本
Maven提供了很方便的插件进行版本发布,通过简单的命令(mvn deploy)就能将工程发布到Maven仓库中。
3. 方便学习开源项目
github和码云上大多数的开源项目都会用到Maven,可以通过Maven命令直接运行。
三、Maven安装
首先要必须安装java,Maven3.3以上版本必须要jdk1.7以上版本。
在Maven官网下载页https://maven.apache.org/download.cgi 找到需要的安装包以及系统要求:
将安装包复制到需要安装Maven的机器上解压,然后设置环境变量M2_HOME,指向对应的Maven目录;然后将M2_HOME\bin加到path中。(这里就不详细描述怎么配置环境变量了,系统不一样配置方式不一样,linux记得source下让环境变量生效)。
在命令行执行
mvn -v
查看是否安装成功。
image.png
四、Maven配置
1.setting.xml 配置
在maven安装目录下进入conf文件夹,可以找到setting.xml文件。
详细介绍http://maven.apache.org/settings.html
一般我们需要修改的配置:
localRepository:本地存储artifacts路径,所有下载的包和本地安装的包都会放在这里。
image.png
servers:发布snapshot和release的server,和项目设置结合使用
image.png
对应的pom设置(这里配置的url是搭建好的maven私服地址):
image.png
mirrors:仓库镜像,通过镜像去获取包(地址是搭建好的maven私服地址)
image.png
profiles:我们这里是用来激活配置的maven镜像去下载maven2中心库的包(其中配置的地址是maven仓库的默认地址)
image.png
2. pom文件
pom是项目对象模型 (Project Object Model)的简称,当Maven运行的时候它向项目对象模型(POM)查看关于这个项目的信息。POM回答类似这样的问题:这个项目是什么类型的?这个项目的名称是什么?这个项目的构建有自定义么?
详细介绍可以查看http://maven.apache.org/pom.html
2.1 Maven坐标(Coordinates)
groupId, artifactId, version和packaging这些组合的标识符拼成了一个项目的坐标:
groupId :团体,公司,小组,组织,项目,或者其它团体。团体标识的约定是,它以创建这个项目的组织名称的逆向域名(reverse domain name)开头。来自Sonatype的项目有一个以com.sonatype开头的groupId,而Apache Software的项目有以 org.apache开头的groupId。
artifactId:在groupId下的表示一个单独项目的唯一标识符。
version:一个项目的特定版本。发布的项目有一个固定的版本标识来指向该项目的某一个特定的版本。而正在开发中的项目可以用一个特殊的标识,这种标识给版本加上 一个“SNAPSHOT”的标记。
packaging:项目的类型,默认是jar,描述了项目打包后的输出。类型为jar的项目产生一个 JAR文件,类型为war的项目产生一个web应用。
Maven仓库(repositories)(公共的,私有的,和本地的)是通过这些标识符来组织的。当一个项目被安装到本地的Maven仓库,它立刻能被任何其它的项目所使用。而我们所需要做的只是,在其它项目用使用Maven的唯一坐标来加入对这个特定 构件的依赖。
2.2 Maven依赖管理 (Dependency Management)
在<dependencies>标签中,根据maven坐标来定义:
image.png
这里发现与maven坐标不同的是多了scope。
Dependency scope 是用来限制Dependency的作用范围的, 影响maven项目在各个生命周期时导入的package的状态。
compile:默认的scope,表示 dependency 都可以在生命周期中使用。而且,这些dependencies 会传递到依赖的项目中。
provided:跟compile相似,但是表明了dependency 由JDK或者容器提供,例如Servlet AP和一些Java EE APIs。这个scope 只能作用在编译和测试时,同时没有传递性。使用这个时,不会将包打入本项目中,只是依赖过来。
runtime:表示dependency不作用在编译时,但会作用在运行和测试时
test:表示dependency作用在测试时,不作用在运行时。
system:跟provided 相似,但是在系统中要以外部JAR包的形式提供,maven不会在repository查找它。
我们项目中一般使用默认的compile和test范围。
一个复杂的项目将会包含很多依赖,也有可能包含依赖于其它构件的依赖。这是Maven 最强大的特征之一,它支持了传递性依赖(transitive dependencies)。假如你的项目依赖于一个库,而这个库又依赖于五个或者十个其它的库(就像Spring或者 Hibernate那样)。你不必找出所有这些依赖然后把它们写在你的pom.xml里,你只需 要加上你直接依赖的那些库,Maven会隐式的把这些库间接依赖的库也加入到你的项目 中。Maven也会处理这些依赖中的冲突,同时能让你自定义默认行为,或者排除一些特定的传递性依赖。
image.png
2.3 Maven构建(build)
根据需要添加插件构建项目:
具体的plugins可以参考官网http://maven.apache.org/plugins/index.html (除了Build plugins还有下面要介绍的Reporting plugins)
image.png
2.4 Maven报表(reporting)
Maven可以同过mvn site来生成文档和报告,生成doc文档需要额外引用插件:
image.png
五、Maven命令
在介绍什么是Maven的时候提到‘运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑’,Maven的命令是基于生命周期来执行的。
5.1 Maven生命周期
Maven有三套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”,这三套生命周期分别是:
Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。
Site Lifecycle 生成项目报告,站点,发布站点。
最核心的是Default Lifecycle:
image.png
记住,运行任何一个阶段的时候,它前面的所有阶段都会被运行,这也就是为什么我们运行mvn install 的时候,代码会被编译,测试,打包。
官网详细介绍查看:http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
5.2 Maven常用命令
mvn test 运行应用程序中的单元测试
mvn clean 清除项目目录中的生成结果
mvn package 根据项目生成的指定格式的文件(jar,war。。。)
mvn install 在本地Repository中安装
mvn site 生成项目相关信息的网站 需要检查项目的doc注解是否合要求。
mvn deploy 发布项目到公司的maven库。 执行这个命令时需要有nexus账号,并且有权限发布。开发过程中只有在其他人需要用到你开发的包时需要做发布操作,需要确保发布到公司nexus上的包是经过测试的稳定的。
可以组合着用,比如最常用的组合:mvn clean install。
六、Maven repository管理工具
参考官网介绍http://maven.apache.org/repository-management.html
搭建私服一般会用Sonatype Nexus OSS
如果有兴趣自己在windows下搭建maven私服的可以参考windows下搭建maven私服。
网友评论