一.Maven是什么?
Maven是一个跨平台项目管理工具,是使用Java语言开发的,可以对 Java 项目进行构建、依赖管理。当然Maven 也可被用于构建和管理各种项目,例如 C#,Ruby,Scala和其他语言编写的项目。
二.为什么要使用Maven?
2.1 Maven主要有两大功能,分别是项目构建和依赖管理
依赖管理可以理解为jar包的管理
项目构建包括以下几个环节:清理、编译、测试、报告、打包、部署。构建项目的方式有以下几种:
- 是使用IDE工具进行项目构建,相对来说步骤零散不好操作,每个新项目都要自己手动导入很多的jar包。
- Ant:一个专门的构建项目的工具,通过一些配置来完成项目的构建,这些配置要明确的告诉ant,源码包在哪?目标class文件应该存放在哪?资源文件应该在哪?
- Maven:上面提到过是一个项目管理工具,通过使用Maven,可以对项目完成简单的快速的构建,不需要告诉Maven很多信息,但要按照Maven的规范去进行代码的开发,也就是说Maven是有规范的,而且这个规范的约束大于配置;
2.2 官网地址和官方包目录结构
官网:http://maven.apache.org
maven官方压缩包的目录结构
三.配置Maven的运行时环境
3.1 配置Maven环境变量(MAVEN_HOME
和path
)
]
- 测试maven是否安装成功:在 cmd系统命令行中执行
mvn -v
3.2 配置settings.xml
- 默认本地仓库存放位置是在系统用户目录下的
.m2/repository
中。 - 因为仓库很大,最好不要放在C盘,重新指定存放目录。将安装包中conf目录下的settings.xml拷贝到.m2目录下,并修改
localRepository
标签,指定仓库位置。 - 注意:默认.m2目录不存在,因为没有执行任何maven相关命令,在命令窗口中执行
mvn help:system
命令,则自动生成.m2目录.
3.3 JDK版本配置
默认maven的jdk编译版本不是自己安装的1.8版本。需要进行版本配置,修改settings.xml如下:
jdk-1.8
true
1.8
1.8
1.8
1.8
3.4 mirror 镜像配置(阿里云镜像)
镜像就相当于是中央仓库的一个副本,内容和中央仓库完全一样,目前有不少国内镜像,其中阿里云算是比较稳定的,同时也能保证下载速度。
修改settings.xml如下:
alimaven
aliyun maven
http://maven.aliyun.com/nexus/content/groups/public/
central
至此Maven的环境配置已经完成。
四.Maven的项目生命周期
在maven中存在"三套"生命周期,每一套生命周期相互独立,互不影响。在一套生命周期内,执行后面的命令则前面操作会自动执行。
- CleanLiftCycle 清理生命周期:pre-clean,clean,post-clean
- DefaultLiftCycle`默认生命周期:validate,compile,test,package,verify,install,deploy(细分包括23 个阶段)
- SiteLiftCycle 站点生命周期:pre-site,site,post-site,site-deploy(生成项目的站点文档)
五.Maven POM
POM(
Project Object Model
,项目对象模型 ) 是 Maven 工程的基本工作单元,是一个XML文件,包含了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。
POM 标签大全详解(来自菜鸟教程http://www.runoob.com)
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
六.Maven项目之间的管理(依赖、继承、聚合)
6.1 依赖
在工程之中需要依赖各种各样的jar包,也可能需要依赖其他的maven工程打包好的包。这个时候就需要在pom.xml中使用依赖关系进行配置。例如:
com.bjsxt
HelloMaven
0.0.1-SNAPSHOT
6.2 继承
继承为了消除重复,我们把很多相同的配置提取出来。所以,maven提供了一个父类maven项目(新建类型为pom
的maven工程Parent)来装所有公共使用的jar,只要继承都可以使用
groupA
artifactA
1.0
当然也可以选择性继承,但是父项目的配置的依赖需要配置在dependencyManagement
中
......
在子项目的dependency
标签中,不配置version
,就会到父项目的dependencyManagement
中去找相关依赖
groupA
artifactA
1.0
com.bjsxt
HelloMaven
6.3 聚合
拆分:将每一层代码放到一个工程里面,降低耦合度,提高可复用性,为其他工程依赖。然后对拆分后的项目进行聚合
如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合,这样做,我们只需要对父工程进行mvn的install
命令,它就会依次把继承依赖的所有工程都自动执行mvn的invalid
、compile
、test
、package
、verify
(验证)、install
命令了。
创建好的父工程目录中只有pom.xml,可以判断出父工程不进行编码。
父工程的作用: 项目需要的依赖信息在父工程的pom文件中定义,子模块继承即可将子模块聚合到一起
在父项目中通过Module标签,将子项目聚合到一起,子项目创建选择的是Maven module,同时指定父项目
maven-pojo
maven-service
maven-mapper
maven-controller
6.4 标签中的scope
依赖范围scope(compile\test\provided\runtime
)
说明:如果使用到tomcat自带jar包,将项目中依赖范围设置成provided
七.Maven中的一些常用插件
7.1 Tomcat
maven项目可以在本地tomcat中运行,也可以在pom.xml中添加tomcat插件,配置插件内容,并运行。编写一个jsp页面,查看运行效果。
org.apache.tomcat.maven
tomcat7-maven-plugin
2.1
8080
/
UTF-8
tomcat7
7.2 assembly插件
- 1.Assembly 插件的作用:
- 构建一个完整的发布包,包含脚本、配置文件以及所有运行时所依赖的元素(jar),将所有依赖的jar包打包到压缩包中。
- 支持多种格式,如
zip、tar.gz、tar.bz2、jar、dir、war
等等
- 2.实现步骤:在原有项目基础上添加下面步骤(以Provider项目为例)
- 2.1 在Provider的Maven项目的pom.xml中添加assembly插件(见下面的的pom.xml配置信息)
- 2.2 在项目根目录下新建assembly文件夹
- 2.3 解压assembly压缩包,并把
bin
和conf
文件夹复制到新建的assembly文件夹. - 2.4 在assembly文件夹下新建assembly.xml文件,并添加内容(详见资料文档)
- 2.5 右键项目--> Run as --> Maven Install 后会在target下生成
.tar.gz
的文件. - 2.6 window系统中解压后直接运行
bin/startup.bat
即可 - 2.7 linux系统中解压后运行
bin/startup.sh
、linux系统中停止使用,解压后运行bin/stop.sh
pom.xml配置信息
maven-assembly-plugin
assembly/assembly.xml
make-assembly
package
single
assembly.xml配置信息
assembly
tar.gz
true
assembly/bin
bin
0755
assembly/conf
conf
0644
lib
八.Maven使用的常见问题总结
1、我从SVN上下载了一个以Maven构建的工程,下载完毕没有jar包怎么办?
从资源库上下载下来的Maven工程,是没有jar包的,此时可以这么做:
(1)删除Maven工程,但是删除的时候不要删除本地工程里面的Maven工程,只删除MyEclipse中的Maven工程
(2)右键Import->Maven4MyEclipse->Existing Maven Projects,导入你的Maven工程,此时MyEclipse在构建工程的时候,假如你的本地仓库中没有dependcy中的jar包,便会去远程仓库下载jar包到本地仓库中。你的工程导入完毕之后,Library应该是这样的:
2、重新下载Maven工程所依赖的jar包、导入jar包都需要触发Maven工程的build workspace,那么如何才能触发Maven工程的build workspace?
找到一个pom.xml,随便修改一下,加一个空格、减一个空格什么的,ctrl+s
保存一下,便会触发Maven工程的build workspace了
3、本地仓库的目录结构是什么样子的?
groupId
、artifactId
、version
确定一个唯一的Maven,比方说我有一个mybatis的dependcy:
org.mybatis
mybatis
3.2.5
那么mybatis的jar包应该在%Maven仓库地址%\org\mybatis\mybatis\3.2.5\这一路径下,看到了吧,先groupId,再artifactId,最后version,每个名字都是一个文件夹的名字
4、有些jar包在dependcy里面有配置,Import了Maven工程,下载完工程所依赖的jar包之后,发现本地仓库里面却没有,怎么办?
可能是原先下载jar包的时候出了什么问题,从artifactId目录开始删除以下的所有文件/文件夹,然后触发一次Maven工程的build workspace就可以了
5、本地仓库中确定已经有jar包了,工程里面却报错,说找不到jar包,该怎么办?
应该有很多解决办法,目前解决的一种办法是,MyEclipse->Window->Preferences->搜索Maven->User Settings,Update Settings和Reindex点一下就好了。或者Eclipse的Maven->update
,另外,可以尝试一下把本地Maven仓库内的jar包删除一下,然后重新build workspace
,可能也可以。
6.发生了依赖冲突
在导致冲突的dependency
标签里面,加入如下内容
example
example
然后这个dependency就不会去把被exclude的东西放进来了。
如果你不知道冲突在哪,pom.xml选择时点击,Dependency Hierarchy
可以看到依赖关系,在intellij中,右击这个dependency,菜单中的Maven->Show Dependecies中也可以看到依赖图(这个图上也可以选中然后右击菜单选exclude
)。