一.Maven作用
1.依赖管理
传统的 WEB 项目中,我们必须将工程所依赖的 jar 包复制到工程中,导致了工程的变得很大,maven 工程中不直接将 jar 包导入到工程中,而是通过在 pom.xml 文件中添加所需 jar包的坐标,这样就很好的避免了 jar 直接引入进来,在需要用到 jar 包的时候,只要查找 pom.xml 文件,再通过 pom.xml 文件中的坐标,到一个专门用于”存放 jar 包的仓库”(maven 仓库)中根据坐标从而找到这些 jar 包,再把这些 jar 包拿去运行。
2.项目的一键构建
我们的项目,往往都要经历编译、测试、运行、打包、安装 ,部署等一系列过程。
什么是构建?
指的是项目从编译、测试、运行、打包、安装 ,部署整个过程都交给 maven 进行管理,这个过程称为构建。
一键构建
指的是整个构建过程,使用 maven 一个命令可以轻松完成整个工作。
二.Maven安装
http://maven.apache.org/download.cgi 下载解压
设置环境变量
sudo gedit /etc/profile
#MAVEN_HOME
export MAVEN_HOME=/workshop/maven/apache-maven-3.3.9
export PATH=${MAVEN_HOME}/bin:$PATH
三.Maven 仓库的分类
1.本地仓库
用来存储从远程仓库或中央仓库下载的插件和 jar 包,项目使用一些插件或 jar 包,优先从本地仓库查找默认本地仓库位置在 u s e r . d i r / . m 2 / r e p o s i t o r y , {user.dir}/.m2/repository, user.dir/.m2/repository,{user.dir}表示 windows 用户目录
2.远程仓库
如果本地需要插件或者 jar 包,本地仓库没有,默认去远程仓库下载。远程仓库可以在互联网内也可以在局域网内。
3.中央仓库
在 maven 软件中内置一个远程仓库地址 http://repo1.maven.org/maven2 ,它是中央仓库,服务于整个互联网,它是由 Maven 团队自己维护,里面存储了非常全的 jar 包,它包含了世界上大部分流行的开源项目构件。
配置maven中央仓库镜像
MAVE_HOME/conf/settings.xml 中,修改
找到mirrors元素, 在它里面添加子元素mirror:
配置maven本地仓库路径
MAVE_HOME/conf/settings.xml 中,修改
/opt/apache-maven-3.6.0/repository
四.Maven 配置文件说明
maven 仓库地址、私服等配置信息需要在 setting.xml 文件中配置,分为全局配置和用户配置。在 maven 安装目录下的有 conf/setting.xml 文件,此 setting.xml 文件用于 maven 的所有project项目,它作为 maven 的全局配置。如需要个性配置则需要在用户配置中设置,用户配置的 setting.xml 文件默认的位置在:
u
s
e
r
.
d
i
r
/
.
m
2
/
s
e
t
t
i
n
g
s
.
x
m
l
目
录
中
,
{user.dir}/.m2/settings.xml 目录中,
user.dir/.m2/settings.xml目录中,{user.dir} 指 windows 中的用户目录。maven 会先找用户配置,如果找到则以用户配置文件为准,否则使用全局配置文件。
五.Maven 工程的目录结构
作为一个 maven 工程,它的 src 目录和 pom.xml 是必备的。
进入 src 目录后,我们发现它里面的目录结构如下:
注意:如果是普通的 java 项目,那么就没有 webapp 目录。
六.maven基本命令
1.mvn clean
把编译好的class文件删掉
2.mvn compile
编译java代码
3.mvn test
编译java源码,同时编译测试代码
4.mvn package
将项目打包,放到target目录下,java项目会打包成jar包,web项目会打包成war包
5.mvn install
将项目安装到本地仓库,供其他项目使用
在IDEA上对应按钮位置
六.maven 的概念模型
1.项目对象模型
一个 maven 工程都有一个 pom.xml 文件,通过 pom.xml 文件定义项目的坐标、项目依赖、项目信息、插件目标等。
2.依赖管理系统
通过 maven 的依赖管理对项目所依赖的 jar 包进行统一管理。
比如:项目依赖 junit4.9,通过在 pom.xml 中定义 junit4.9 的依赖即使用junit4.9,如下所示是 junit4.9
的依赖定义:
3.一个项目生命周期
使用 maven 完成项目的构建,项目构建包括:清理、编译、测试、部署等过程,maven 将这些过程规范为一个生命周期,如下所示是生命周期的各各阶段:
maven 通过执行一些简单命令即可实现上边生命周期的各各过程,比如执行 mvn compile 执行编译、执行 mvn clean 执行清理。
4.一组标准集合
maven 将整个项目管理过程定义一组标准,比如:通过 maven 构建工程有标准的目录结构,有标准的生命周期阶段、依赖管理有标准的坐标定义等。
5.插件(plugin)目标(goal)
maven 管理项目生命周期过程都是基于插件完成的。
七.IDEA创建maven项目
1.配置
配置这个参数防止没网的时候不能创建工程
2.使用maven提供的骨架创建java工程
然后选择 公司名称,项目名称,版本等信息
3.使用maven提供的骨架创建javaweb工程
八.maven依赖范围
A 依赖 B,需要在 A 的 pom.xml 文件中添加 B 的坐标,添加坐标时需要指定依赖范围,依赖范围包括:
compile:编译范围,指 A 在编译时依赖 B,此范围为默认依赖范围。编译范围的依赖会用在
编译、测试、运行,由于运行时需要所以编译范围的依赖会被打包。
provided:provided 依赖只有在当 JDK 或者一个容器已提供该依赖之后才使用, provided 依
赖在编译和测试时需要,在运行时不需要,比如:servlet api 被 tomcat 容器提供。
runtime:runtime 依赖在运行和测试系统的时候需要,但在编译的时候不需要。比如:jdbc
的驱动包。由于运行时需要所以 runtime 范围的依赖会被打包。
test:test 范围依赖 在编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用,
比如:junit。由于运行时不需要所以 test 范围依赖不会被打包。
system:system 范围依赖与 provided 类似,但是你必须显式的提供一个对于本地系统中 JAR
文件的路径,需要指定 systemPath 磁盘路径,system 依赖不推荐使用。
依赖范围由强到弱的顺序是:compile>provided>runtime>test
九.项目中添加的坐标
在pom.xml文件中
十.插件设置
1.设置 jdk 编译版本
设置jdk1.8及编码字符集utf8
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
2.添加 tomcat7 插件,并使用
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8090</port>
<path>/</path>
<uriEncoding>UTF-8</uriEncoding>
</configuration>
</plugin>
3.配置maven编译*mapper.xml(如果不配置,那么xml文件不会被复制到class下
在pom.xml配置如下内容
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<!-- maven打包时跳过test测试-->
<skip>true</skip>
</configuration>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<!-- 这个必须加,因为添加完上面,resources目录中的自动编译将失效-->
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
</resource>
</resources>
</build>
如果要编译所有文件:
<build>
<resources>
<resource>
<directory>src/main</directory>
<includes>
<include>**/*.*</include>
</includes>
</resource>
</resources>
</build>
注意有的时候:resources文件夹下面的配置文件不会被编译到classpath下,只需rebuild 项目即可
十一.依赖传递 ,依赖冲突 及 排除依赖
1.依赖传递
直接依赖和间接依赖
test2 依赖 test1,test3依赖test2
则 test2 直接依赖 test1,test3间接依赖test1
当test1项目引入 jar包 scope 为 compile 的时候,项目test2,test3都可以用这个 jar包
当test1项目引入 jar包 scope 为 test 的时候,项目test2,test3想要使用这个jar包,需要在pom.xml重新导入坐标
关闭依赖传递:true
在依赖中添加optional选项决定此依赖是否向下传递,如果是true则不传递,如果是false就传递,默认为false
2.依赖冲突
假如test1 使用junit4.10依赖,并且scope是 compile,那么test2,test3都可以使用 test1的junit4.10,因为依赖传递了
假如test2使用junit4.9依赖,那么test3就会使用 就近的一个依赖,也就是说junit4.9
3.排除依赖
exclusions可用于排除依赖,注意exclusions是写在dependency中
十二.一些常见的问题
1.maven项目如果代码用到servlet API,如HttpServletRequest,需要在pom
文件中导入Servlet坐标
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>