maven是一个项目管理工具,他的作用:1.构建项目及项目的生命周期;2.依赖管理;3.插件管理;
1、pom配置详解
pom(Project Object Model)指的是项目对象模型,用来描述当前的maven项目。使用pom.xml文件来实现。
【补充】
setting.xml主要用于配置maven的运行环境等一系列通用的属性,是全局级别的配置文件;而pom.xml主要描述了项目的maven坐标,依赖关系,开发者需要遵循的规则,缺陷管理系统,组织和licenses,以及其他所有的项目相关因素,是项目级别的配置文件。
pom.xml
<?xml version="1.0" encoding="UTF‐8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema‐instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven‐4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.heima.maven</groupId>
<artifactId>maven‐web2</artifactId>
<version>1.0‐SNAPSHOT</version>
<packaging>war</packaging>
</project>
【pom文件详解】
<project> :pom文件的根节点;
<modelVersion>: 声明项目描述符遵循哪一个POM模型版本。模型本身的版本很少改变,虽然如此,但它仍然是必不可少的,目前POM模型版本是4.0.0;
<groupId> :maven项目组织id标识符,一般是公司域名倒过来写;
<artifactId>:项目的标识符‐‐项目名。
<version>:项目的版本号;
<packaging>:maven项目的打包方式一般配置jar或者war;
2、依赖管理【重点】
Maven的一个核心的作用就是管理项目的依赖,引入我们所需的各种jar包等。为了能自动化的解析任何一个Java构件,Maven必须将这些Jar包或者其他资源进行唯一标识,这是管理项目的依赖的基础,也就是我们要说的坐标。包括我们自己开发的项目,也是要通过坐标进行唯一标识的,这样才能才其它项目中进行依赖引用。
2.1 Maven坐标
Maven的一个核心的作用就是管理项目的依赖,引入我们所需的各种jar包等。为了能自动化的解析任何一个Java构件,Maven必须将这些Jar包或者其他资源进行唯一标识,这是管理项目的依赖的基础,也就是我们要说的坐标。包括我们自己开发的项目,也是要通过坐标进行唯一标识的,这样才能才其它项目中进行依赖引用。坐标的定义元素如下:
- groupId:定义当前项目(jar包)隶属的实际项目组。
- artifactId:定义当前项目(jar包)的名称;
- version:定义当前项目(jar包)的版本号;
通过上面三个参数我们就能够确定一个唯一版本号的jar包。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring‐core</artifactId>
<version>4.1.2.RELEASE</version>
</dependency>
2.2 依赖导入
1、使用IDEA工具导入:
IDEA中给我们提供了一种搜索jar包的方式,帮助我们快速导入jar包。使用方法如下:
- 第一步:鼠标光标移入到在pom.xml文件中,按Alt+Insert键。会弹出一个选择框:
- 选择Dependency后会弹出一个搜索框:输入要添加的jar包的名字
选择需要的jar包后按回车键即可自动添加此依赖;
2、从远程仓库中获取坐标:
如果我们导入的依赖本地仓库中没有,使用IDEA搜索就搜索不到了,我们需要从网络中查找这个依赖的坐标,然后将其添加到pom文件中。添加完成之后,maven会帮我们从私服或中央仓库中下载该依赖。
搜索依赖坐标的方法:
- 在中央仓库中查找:http://mvnrepository.com/
将以下坐标复制到pom文件中即可:
pom文件中引入依赖后,会去私服或者中央仓库中下载依赖:如果项目结构的 External Librarites中出现刚引入的依赖,则说明依赖引入成功。
3、依赖配置
我们通过坐标引入需要的依赖之后,有时候不能直接使用当前的依赖。需要对这些依赖进行配置。这些配置包括:依赖范围设置,依赖版本维护。
3.1 依赖范围设置
3.1.1 依赖范围是什么
maven在编译 项目主代码的时候需要使用一套classpath,在编译和执行测试 的时候需要使用另外一套classpath。最后,在实际运行 maven项目的时候又会用到另外一套classpath。不同阶段的classpath需要的依赖不同。所以,我们在导入依赖之后,往往会设置依赖的作用范围。
3.1.2 5种依赖范围
依赖范围就是用来控制依赖(jar包)与着三种classpath(编译classpath,测试classpath,运行classpath)之间的关系的。
compile :编译依赖范围。如果没有指定,默认就是这种依赖范围。使用此依赖范围的Maven依赖,对于编译、测试、运行三种classpath都有效。
test :测试依赖范围。使用此依赖范围的Maven依赖,只对测试classpath有效。在编译主代码和运行项目期间都不需要使用此依赖。典型的例子就是Junit,它只在编译和运行测试代码时有效。
provided :已提供依赖范围。使用此依赖范围的maven依赖在编译和测试classpath有效,但运行时无效。典型的例子就是servlet‐api。编译和测试的时候需要使用servlet‐api中的方法,但是使用tomcat运行项目的时候不需要,因为tomcat在运行期间会提供这个依赖。
runtime: 运行时依赖范围。使用次依赖范围的maven依赖对于测试和运行classpath有效,但在编译主代码时无效。典型的例子是JDBC驱动实现,项目主代码的编译只需要提供JDK提供的JDBC接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体JDBC驱动。
system :系统依赖范围。该依赖与三种classpath的关系和provided依赖范围完全一致。但是,使用system范围的依赖时必须通过systemPath元素显式地指定依赖文件的路径。由于此依赖不是通过Maven仓库解析的,而且往往与本机系统绑定,可能造成构建的不可移植,因此应该谨慎使用。systemPath元素可以引用环境变量。
例如:oracle的驱动包,从中央仓库无法下载,需要先下载到本地,再通过本地路径引入。先下载orace的包到本地:
然后在pom文件中导入依赖:
<dependency>
<groupId>oracle</groupId>
<artifactId>ojdbc</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>
D:/software/maven/apache‐maven‐3.5.2/repository/ojdbc6.jar
</systemPath>
</dependency>
上述各种依赖范围与三种classpath的关系如下图所示:
3.1.3 指定依赖范围的方法
- 我们在导入依赖的时候,在标签中使用设置即可,如下所示:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring‐core</artifactId>
<version>4.3.9.RELEASE</version>
<!‐‐compile是默认的依赖范围,可以不用写出来‐‐>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet‐api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql‐connector‐java</artifactId>
<version>5.0.8</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>oracle</groupId>
<artifactId>ojdbc</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>
D:/software/maven/apache‐maven‐3.5.2/repository/ojdbc6.jar
</systemPath>
</dependency>
3.2 依赖版本维护
如果pom文件中引入的依赖太多,各种依赖又有不同的版本,为了统一维护版本。我们可以将依赖的版本号抽取出来进行统一管理。抽取方法如下:
第一步 :在pom.xml中使用属性定义jar包的版本
<properties>
<spring.version>4.2.4.RELEASE</spring.version>
<struts.version>2.3.8</struts.version>
</properties>
第二步 :在依赖的中使用${}引入前面定义好的版本
<properties>
<spring.version>4.2.4.RELEASE</spring.version>
<struts.version>2.3.8</struts.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring‐context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2‐spring‐plugin</artifactId>
<version>${struts.version}</version>
</dependency>
</dependencies>
好处:方便对项目中使用的jar包版本的统一管理。
4、maven插件
我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成。例如编译源代码是由maven-compiler-plugin完成的,但是这些插件都是maven默认的插件,如果需要配置自己的插件,则需要通过插件的坐标来引入插件。插件的坐标可以从maven官方提供的插件列表进行下载:
Maven官方有两个插件列表:
第一个列表的GroupId为org.apache.maven.plugins,这里的插件最为成熟,具体地址为:
http://maven.apache.org/plugins/index.html。
第二个列表的GroupId为org.codehaus.mojo,这里的插件没有那么核心,但也有不少十分有用,其地址为:http://mojo.codehaus.org/plugins.html。
常用的插件有编译插件和tomcat插件,这两个插件的坐标及配置如下:
4.1 编译插件 maven-compiler-plugin
<!‐‐JDK编译插件‐‐>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven‐compiler‐plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF‐8</encoding>
</configuration>
</plugin>
4.2 测试插件maven-surefire-plugin
<!‐‐test插件‐‐>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven‐surefire‐plugin</artifactId>
<version>2.16</version>
<configuration>
<forkMode>once</forkMode>
<argLine>‐Dfile.encoding=UTF‐8</argLine>
</configuration>
</plugin>
4.3 tomcat插件
<!‐‐ tomcat7插件 ‐‐>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7‐maven‐plugin</artifactId>
<version>2.2</version>
<configuration>
<port>80</port>
<path>/</path>
</configuration>
</plugin>
4.3 插件完整配置
所有的插件必须配置在-->中
<build>
<plugins>
<!‐‐JDK编译插件‐‐>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven‐compiler‐plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF‐8</encoding>
</configuration>
</plugin>
<!‐‐test插件‐‐>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven‐surefire‐plugin</artifactId>
<version>2.16</version>
<configuration>
<forkMode>once</forkMode>
<argLine>‐Dfile.encoding=UTF‐8</argLine>
</configuration>
</plugin>
</plugins>
</build>
附1:清理maven仓库
初始情况下,我们的本地仓库是没有任何jar包的,此时会从私服去下载(如果没有配置,就直接从中央仓库去下载),可能由于网络的原因,jar包下载不完全,这些不完整的jar包都是以lastUpdated结尾。此时,maven不会再重新帮你下载,需要你删除这些以lastUpdated结尾的文件。如果本地仓库中有很多这样的以lastUpadted结尾的文件,可以执行如下脚本来删除:
在上面的bat文件上右键---》编辑 。修改文件:
修改完毕后,双击运行即可删除maven仓库中的残留文件。
附2:更新依赖索引
有时候给idea配置完maven仓库信息后,在idea中依然搜索不到仓库中的jar包。这是因为仓库中的jar包索引尚未更新到idea中。这个时候我们就需要更新idea中maven的索引了,具体做法如下:
打开设置----搜索maven----Repositories----选中本地仓库-----点击Update