14天阅读挑战赛
一、maven概念
maven是 Apache 下的一个纯 Java 开发的开源项目。
基于项目对象模型(缩写:POM)概念,
Maven利用一小段描述信息管理一个项目的构件。
Maven 是一个项目管理工具,
可以对 Java 项目进行构建以及对依赖进行管理。
二、Maven环境安装
1、maven官方网站
http://maven.apache.org/
下载apache-maven-3.5.0-bin.zip压缩包
2、解压压缩包到D盘根目录下
目录结构
--bin:mvn的运行脚本
--conf:配置文件
--boot:包含一个类加载器框架
--lib:maven运行时类库
3、配置maven环境变量
环境变量:
MAVEN_HOME D:\apache-maven-3.5.0
Path %MAVEN_HOME%\bin;
测试:mvn -v 查看当前版本
4、修改本地仓库默认位置(主要用于存储从网络上下载的jar)
1>在maven根目录下新建一个空目录repository
2>在con/settings.xml中配置
5、修改maven项目默认的jre版本(默认1.5)
拷贝以下配置到conf/settings.xml的profiles中
6、在eclipse中配置maven插件
1>确保eclipse版本为4.0以上
2>window-->preferences-->Maven-->Installations-->关联maven
3>User Settings-->关联conf/settings.xml
三、maven项目构建及常用命令
1、项目组成
groupId:项目的包名 组织名,公司网址反写+项目名
artifactId:项目名-模块名(没分模块就是项目名)
version:项目版本
SNAPSHOT:快照版本
packing:打包方式(默认jar)
2、maven目录结构
src/main/java java源码
src/main/resources 项目配置文件
src/test/java 测试类
src/test/resources 测试需要的配置文件
Maven Dependencies 项目依赖的jar包
target 项目打包目录
pom.xml 项目对象描述信息
3、cmd常用命令(都必须在项目根目录下执行)
删除target目录 mvn clean
编译项目: mvn compile
运行测试用例 mvn test
打包命令生成jar mvn package
安装jar到本地仓库中 mvn install
4、eclipse运行
项目右键项目run as-->maven builder...
-->compile(package,test,install)
四、坐标和仓库概念
1、坐标
在maven中,任何的依赖,插件,项目构件的输出都可以称之为构件
所有的构件都通过坐标作为其唯一的标识,类似于购物时填写的
电话和地址来找到你
坐标写法:
groupId,artifacteId,version可以构成一个坐标
groupId:包名.项目名
artifactId:项目名-模块名
version:当前项目版本号:一般都是由3个数字表示
第一个0:大版本号
第二个0:分支版本还号
第三个0:小版本号 0.0.1
snapshot:快照
alpha:内测版本
beta:公测版本
release:稳定版本
GA:正式发布版本
2、仓库
用于管理项目中所有的依赖(jar),
当前项目本身也可以install安装成jar安装到仓库
提供给其他人进行使用
1>本地仓库
用于存储从网络上下载的所有依赖(jar),
以及可以将项目本身打包成jar,提供给其他人使用
更改本地仓库位置:settings.xml
D:\apache-maven-3.5.0\repository
2>中央仓库:存储着全世界所有的依赖jar
地址:https://repo.maven.apache.org/maven2
3>镜像仓库
因为中央仓库在国外,直接下载比较慢,因此可以一个组织搭建
一个镜像仓库,从镜像仓库下载
相当于私服
阿里云镜像:
五、maven生命周期(面试重点*****)
1、生命周期
完整的项目构建过程:clean,compile,test,package,install
清理->编译->测试->打包->集成测试->验证->部署
maven生命周期:
1>clean 清理项目
1.1>pre-clean 执行清理前的工作
1.2>clean 清理上一次构件生成的所有文件
1.3>post-clean 执行清理后的文件
2>defaut 构建项目(最核心)
2.1>compile
2.2>test
2.3>package
2.4>install
3>site 生成项目站点
3.1>pre-site 在生成项目站点前要完成的工作
3.2>site 生成项目的站点文档
3.3>post-site 在生成项目站点后要完成的工作
3.4>site-deploy 发布生成的站点到服务器上
七、maven依赖范围(面试重点*****)
1、什么是依赖范围
规定项目导入的依赖jar在编译 、测试 、运行哪个生命周期范围内有效
2、依赖范围值
在dependency标签中通过
scope有6种值:
http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html
1>compile:默认的范围,编译测试运行都有效
2>provided:在编译和测试时有效,运行无效
如:servletapi编译时加入,运行不需要,因为
容器中有,在加入会报错
3>runtime:在测试和运行时有效
4>test:只在测试范围内有效
如:junit单元测试
5>system:根provided一样,只在编译和测试有效
但与本机系统相关联,可移植性差(javahome)
6>import:导入的依赖范围,它只使用在
dependencyManagement中,表示从其他的pom中
导入dependency的配置
如:将A中依赖导入B中
八、依赖传递以及排除传递依赖(面试重点*****)
1、什么是传递依赖
假如有Maven项目A,项目B依赖A,项目C依赖B。
那么我们可以说 C依赖A。也就是说,
依赖的关系为:C—>B—>A。那么我们执行项目C时,
会自动把B、A都下载导入到C项目的jar包文件夹中。
这就是依赖的传递性。
案例:
山鸡-->南哥 南哥-->B哥
那么山鸡-->B哥 传递依赖
创建三个maven project
1>b哥执行install安装
2>南哥依赖b哥
3>南哥执行install安装
4>删除依赖南哥
此时观察山鸡项目maven Dependencies会发现虽然山鸡
只依赖于南哥却将b哥也依赖进来了,山鸡可以使用
exclusions标签排除b哥依赖
九、依赖冲突(面试重点*******)
1、什么是依赖冲突
在传递依赖过程中,如果一个项目依赖了两个不同版本的jar,具体以哪个为准
如:在不排除山鸡传递依赖的前提下,如果B哥依赖了commons-io2.4的版本
而南哥依赖了commons-io2.0的版本,那么山鸡同时依赖两个,具体版本是哪个
2、依赖冲突解决方案:(面试重点*******)
1、短路优先原则
A->B->C->X(.jar)
A->D->X(.jar) 优先
B哥依赖commons-io2.4的版本
路径:山鸡->南哥->B哥->commons-io2.4
南哥依赖commons-io2.0的版本
路径:山鸡->南哥->commons2.0
此时观察山鸡会依赖2.0的版本,因为山鸡离南哥近
2、先声明,先优先
如果路径相同,则谁先声明,先解析谁
如:让山鸡同时依赖南哥和B哥
将山鸡中排除B哥依赖删除掉
此时会发现先引入谁的依赖,那么版本就是谁的
十、聚合和继承
聚合:对多个项目放在一起运行,同时进行安装
如:聚合B哥,南哥,山鸡三个项目
创建项目hongxing-parent,打包方式为pom
聚合三个项目:
然后执行clean install会发现同时安装三个项目
继承:如果三个子项目都使用了junit
1、在父项目中定义如下配置:
2、让三个子项目继承父项目
子项目会继承父工程的依赖,子工程中可以不用写groupId和version
3、如果需要在子工程中有选择性的去继承父工程中依赖,
需要将父工程中依赖写在dependencyManagement标签中,
子工程需要该依赖可以通过定义groupId和artifactId继承
父工程中:
子工程中:
十一、将本地自己的jar安装到本地仓库
以D:\jdbcutil.jar为例:
1>cmd中切换到D盘
2>执行命令:
mvn install:install-file -Dfile=jdbcutil.jar -DgroupId=com.xxx -DartifactId=jdbcutil -Dversion=0.0.1.RELEASE -Dpackaging=jar
十二、创建web项目并发布
1、创建maven项目,打包方式为war,
2、创建创建后,在project视图下,右键选择
Deployment...->generate 生成web-inf和web.xml等目录
3、依赖导入servlet3.1.0版本
4、需要修改web.xml的版本为3.1
聚合工程:
1、可以使用聚合工程将mvc三层分成三个模块,
3.1>父工程打包方式为pom
3.2>controller层打包方式war,dao和service两层为jar
3.3>service依赖dao,controller依赖service
2、只需要将web模块加入Tomcat执行
Tomcat插件: