一、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中配置
<localRepository>D:\apache-maven-3.5.0\repository</localRepository>
5、修改maven项目默认的jre版本(默认1.5)
拷贝以下配置到conf/settings.xml的profiles中
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
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>com.lanou.testMaven</groupId>
<artifactId>testMaven</artifactId>
<version>0.0.1-SNAPSHOT</version>
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
<localRepository>
D:\apache-maven-3.5.0\repository
</localRepository>
2>中央仓库:存储着全世界所有的依赖jar
地址:https://repo.maven.apache.org/maven2
3>镜像仓库
因为中央仓库在国外,直接下载比较慢,因此可以一个组织搭建
一个镜像仓库,从镜像仓库下载
相当于私服
<mirror>
<id>maven.net.cn</id>
<!--为哪个仓库配置镜像-->
<mirrorOf>central</mirrorOf>
<name>central mirror in china</name>
<!--镜像仓库路径-->
<url>http://maven.net.cn/content/groups/public</url>
</mirror>
阿里云镜像:
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
五、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>test</scope>配置
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中
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>maven</groupId>
<artifactId>B</artifactId>
<packaging>pom</packaging>
<name>B</name>
<version>1.0</version>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>maven</groupId>
<artifactId>A</artifactId>
<version>1.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
八、依赖传递以及排除传递依赖(面试重点*****)
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哥依赖
<dependency>
<groupId>com.hongxing</groupId>
<artifactId>hongxing-nange</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 排除依赖 -->
<exclusions>
<!-- 排除依赖列表 -->
<exclusion>
<groupId>com.hongxing</groupId>
<artifactId>hongxing-bGe</artifactId>
</exclusion>
</exclusions>
</dependency>
九、依赖冲突(面试重点*******)
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
聚合三个项目:
<modules>
<module>../hongxing-bGe</module>
<module>../hongxing-nange</module>
<module>../hongxing-shanji</module>
</modules>
然后执行clean install会发现同时安装三个项目
继承:如果三个子项目都使用了junit
1、在父项目中定义如下配置:
<properties>
<!-- 规定统一版本号 -->
<junit.version>3.8.1</junit.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
</dependencies>
2、让三个子项目继承父项目
<parent>
<groupId>com.hogxing</groupId>
<artifactId>hongxing-parernt</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
子项目会继承父工程的依赖,子工程中可以不用写groupId和version
3、如果需要在子工程中有选择性的去继承父工程中依赖,
需要将父工程中依赖写在dependencyManagement标签中,
子工程需要该依赖可以通过定义groupId和artifactId继承
父工程中:
<properties>
<!-- 规定统一版本号 -->
<junit.version>3.8.1</junit.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
子工程中:
<parent>
<groupId>com.hogxing</groupId>
<artifactId>hongxing-parernt</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
十一、将本地自己的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插件:
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8888</port>
</configuration>
</plugin>
</plugins>
</build>