1. Maven简介
Maven是什么
maven这个词可以翻译为“知识的积累”,也可以翻译为“专家”或“内行”。作为Apache组织中的一个颇为成功的开源项目,Maven主要用于基于Java语言的项目构建、依赖管理和项目信息管理。
Maven能干什么
- 使项目构建构成更容易;
- 提供统一构建系统(编译、测试、持续整合...);
- 提供高质量的项目信息(依赖、报告、site...);
- 提供开发的最佳实践指南;
- 能无缝的集成和添加新的特性。
Maven的核心概念
- 项目对象模型(Project Object Model, 简称POM),
- 坐标(Coordinates),
- 项目生命周期(Project Lifecycle),
- 插件(plugin)和目标(goal),
- 依赖管理系统(Dependency Management System),
- 仓库管理(Repositories)。
准备我们需要的环境
- 下载Maven的安装包,解压至任何目录。
- 设置环境变量M2_HOME,设置为Maven的安装路径;
- 在环境变量path中设置Maven的bin目录。
正常情况下,Maven会到中央仓库去下载我们需要的构件或者插件,但是,在网络访问不了外网的情况下,需要将内网设置的私服加入到下载的配置中。Maven会在用户主机目录下添加.m2的私有文件夹(如C:\Documents and Settings\Administrator.m2文件夹,其中Administrator为当前登录的用户),修改settings.xml配置,其配置代码如下:
mirror
*
Nexus aliyun
http://116.62.220.224:8888/repository/testGroup/
在本地Maven配置中添加完私有服务器配置后,需要在Maven工程的pom.xml中直接添加项目的依赖包即可:
4.0.0
com.garyond.test
sms-service
0.0.1-SNAPSHOT
jar
sms-service
Short Message Service
org.springframework.boot
spring-boot-starter-parent
1.5.10.RELEASE
UTF-8
UTF-8
1.8
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
此外, 我们无须修改本地的Maven配置, 只需要在项目pom.xml中添加私服的配置(repositories)即可完成相关依赖包的下载。
4.0.0
com.garyond.test
sms-service
0.0.1-SNAPSHOT
jar
sms-service
Short Message Service
org.springframework.boot
spring-boot-starter-parent
1.5.10.RELEASE
UTF-8
UTF-8
1.8
nexus
Nexus Repository
http://192.168.2.20:8081/repository/java/
true
true
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
2. Maven重要术语
坐标
Maven的世界中拥有数量非常巨大的构件,也就是我们平时用的一些jar、war等文件。Maven定义了这样一组规则:世界上任何一个构件都可以使用Maven坐标唯一标识。Maven坐标的元素包括groupId、artifactId、version、packaging、classifier。
- groupId:定义当前Maven项目隶属的实际项目。groupId的表示方式与java包名的表示方式类似,通常与域名反向一一对应
- artifactId:该元素定义实际项目中的一个Maven项目/模块
- version:版本【可以分成稳定版本和快照版本】
- packaging:打包方式。如:jar、war
- classifier:不能直接定义,用来表示构件到底用于何种JDK版本。
POM
POM(Project Object Model):Maven项目的核心文件,位于每个工程的根目录中,指示Maven如何工作的元数据文件,类似于Ant中的build.xml文件和Gradle中的build.gradle文件。
依赖(Dependency)
为了能够构建或运行,Java工程一般会依赖其它的包。在Maven中,这些被依赖的包就被称为dependency,dependency一般是其它工程的坐标,依赖具有传递性。
生命周期
项目的生命周期是指软件开发人员每天都在对项目进行清理、编译以及部署。虽然大家都在不停的做构建工作,但公司和公司间、项目和项目间,往往使用不同的方式做类似的工作。
Maven的生命周期就是为了所有的构建过程进行抽象和统一。这个生命周期包含了项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等几乎所有构建步骤。
Maven拥有三套相互独立的生命周期,他们分别为clean、default和site。clean生命周期的目的是清理项目,default生命周期的目的是构建项目,而site生命周期的目的是建立项目站点。
阶段【Phase】
每个生命周期包含一些阶段,这些阶段是有顺序的,并且后面的阶段依赖于前面的阶段,用户和Maven最直接的交互方式就是调用这些生命周期阶段。
较之于生命周期阶段的前后依赖关系,三套生命周期本身是相互独立的,用户可以仅仅调用clean生命周期的某个阶段,或者仅仅调用default生命周期的某个阶段,而不会对其他生命周期产生任何影响。
clean生命周期包含三个阶段:pre-clean、clean、post-clean
default生命周期包含很多阶段
site生命周期包含四个阶段:pre-site、site、post-site、site-deploy
插件及其目标【Goal】
Maven的核心仅仅定义了抽象的生命周期,具体的任务是交由插件完成的,插件以独立的构建形式存在。
对于插件本身,为了能够复用代码,它往往能够完成多个任务。例如maven-dependency-plugin插件,能够基于项目以来做很多事情。比如,能够分析项目依赖,找到无用的或者重复的依赖;还能够列出项目的依赖树。这些功能往往背后有很多可以复用的代码,因此,可以把这些功能聚集在一个插件里,每个功能就是一个插件目标。
我们原来仅仅通过前缀调用插件,现在可以用冒号来指定调用插件的某个具体目标了,比如:mvn dependency:tree。冒号前面是插件的前缀,冒号后是该插件的目标。
在Maven世界中,任何一个依赖、插件或者项目的构建输出,都可以称为构件。任何一个构件都有一组坐标唯一标识。得益于Maven的坐标机制,任何Maven项目使用任何一个构件的方式都是完全相同的。在此基础上,Maven可以在某个位置统一存储所有Maven项目共享的构件,这个统一的位置就是仓库。
对于Maven来说,仓库只分为两大类:本地仓库和远程仓库。当Maven根据坐标寻找构件的时候,它首先会查看本地仓库,如果本地仓库存在此构件,则直接使用;如果本地仓库部存在此构件,Maven就会去远程仓库查找,发现需要的构件之后,下载到本地仓库再使用。
私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的Maven用户使用。目前Maven提供Nexus私服, 可在Nexus官网下载安装与部署。
3. Maven POM配置元素介绍
- parent
给出父项目的位置,如果存在上一级父项目的话。如果没有特别指出的话,值就是父项目对于当前项目而言。位置是一个as a group ID, artifact ID
和version
元素的组合。
- modelVersion
描述这个POM文件遵从哪个版本的项目描述符。
- groupId
针对一个项目的普遍唯一识别符。通常用一个完全正确的包的名字来与其他项目的类似名字来进行区分(比如:org.apache.maven)
- artifactId
在给定groupID 的group里面为artifact 指定的标识符是唯一的 artifact 代表的是被制作或者被一个project应用的组件。对于Maven项目的artifact 的例子包括:一些JARs, 原代码以及二进制的发布以及WARs.。
- packaging
这个项目生产出来的artifact 类型,举个例子 jar war pom Plugins 能够创建他们自己的包,包括包的类型,所以这个列表不可能包含所有可能的类型。
- name
当前项目的全称。
- version
当前项目产生的artifact的当前版本。
- description
当前项目的一个细节描述,当需要描述这个项目的时候被Maven所用,比如在web 站点中。这个元素能够被指定为CDATA 类型,允许在描述器中 HTML的tags, 并不鼓励用空白文本来表示。如果你需要去修改生成的web 站点的索引页,你能够用你自己的索引来代替自动生成的文本。
- url
当前项目的主页的URL。
- prerequisites
描述当前项目的编译环境的先决条件。
- issueManagement
当前项目的发布管理信息。
- ciManagement
当前项目的连续集成信息。
- inceptionYear
当前项目开始的年份, 用4位数字描述。 涉及到介绍情况时用作提供版权信息。
- mailingLists
包含的信息包括邮件列表。
- developers
描述当前的项目的开发人员的信息。
- contributors
描述对当前项目有贡献的人员的信息,不特指开发人员。
- licenses
这个元素描述了当前项目的所有的许可文件。每一个许可文件用一个许可元素来描述,然后描述额外的元素。通常只列出适用于这个项目的许可文件以及适用于依赖的非licenses。如果多个licenses都列出来了,那么假设这个用户选择其中的所需的,而不是接受所有的许可文件。
- scm
指定当前项目中的版本控制工具,比如CVS, Subversion, 等等。
- organization
这个元素描述这个项目所属组织的各种属性的描述。这些属性应用于文档创建的时候 (版权通知和链接)。
- build
创建项目时必须的信息。
- profiles
本地项目编译档案文件时的列表,被激活时会修改build的过程。
- modules
模块 (有时被叫做子项目)作为当前项目的一部分。每一个被列出来的子模块都指向包含这个模块的目录文件的相对路径。
- repositories
发现依赖和扩展的远程仓库。
- pluginRepositories
发现plugins 的远程资源库的列表,主要是为了编译和报告。
- dependencies
这个元素描述了所有与当前项目相关的依赖。这些依赖被用作创建一个编译时的路径。他们被自动的从资源库中下在下来依据当前项目的定义。
- reporting
这个元素包括报告的plugins 的指定,用作Maven生成站点的自动生成报告。这些报告将会运行当用户执行mvn site。 所有的报告将会包括在浏览器的导航栏中。
- dependencyManagement
缺省的依赖信息将会从这个元素中继承。这些依赖在这一部分中被不立刻被解决的。当一个源于这个POM的元素描述了一个依赖根据匹配的 groupId 和 artifactId,这个部分的版本和其他值用作那些还没有指定的依赖。
- distributionManagement
对于一个项目分配的信息允许对于远程web服务器和资源库的site和artifacts配置。
- properties
属性可以作为POM的自始自终的替换物,如果可行的话可以用作resources 的过滤器,格式是
。
4. Maven POM配置详解
4.0.0
asia.banseon
banseon-maven2
jar
1.0-SNAPSHOT
banseon-maven
http://www.baidu.com/banseon
A maven project to study maven.
jira
http://jira.baidu.com/banseon
Demo
[email protected]
[email protected]
[email protected]
http:/hi.baidu.com/banseon/demo/dev/
HELLO WORLD
banseon
[email protected]
Project Manager
Architect
demo
http://hi.baidu.com/banseon
No
-5
Apache 2
http://www.baidu.com/banseon/LICENSE-2.0.txt
repo
A business-friendly OSS license
scm:svn:http://svn.baidu.com/banseon/maven/banseon/banseon-maven2-trunk(dao-trunk)
scm:svn:http://svn.baidu.com/banseon/maven/banseon/dao-trunk
http://svn.baidu.com/banseon
demo
http://www.baidu.com/banseon
......
......
Windows XP
Windows
x86
5.1.2600
mavenVersion
2.0.3
/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/
/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/
......
......
......
......
......
......
banseon-repository-proxy
banseon-repository-proxy
http://192.168.1.169:9999/repository/
default
......
org.apache.maven
maven-artifact
3.8.1
jar
test
spring-core
org.springframework
true
......
banseon-maven2
banseon maven2
file://${basedir}/target/deploy
banseon-maven2
Banseon-maven2 Snapshot Repository
scp://svn.baidu.com/banseon:/usr/local/maven-snapshot
banseon-site
business api website
scp://svn.baidu.com/banseon:/var/www/localhost/banseon-web