一、概述
Maven翻译为“专家”。它是Apache下的一个纯Java开发的项目管理工具。使用Maven对Java项目进行构建和依赖管理。
Maven的优点:
- 一步构建;
- 依赖管理;
- 跨平台;
- 有利于提高大型团队的开发效率;
1.1 什么是项目构建
项目构建就是一个项目从编写源代码开始,到编译、测试、运行、打包、部署的过程。
Maven项目的构建过程:
Maven将项目构建的过程进行标准化,每个阶段都使用一个命令完成。例如:
clean:清理阶段命令。
compile:编译阶段命令。
package:打包阶段命令。
二、Maven安装
2.1 软件下载
下载地址:http://maven.apache.org/download.cgi
下载完成后的目录结构如下图所示:
bin:保存了maven相关的命令,例如:mvn.bat。
boot:maven运行需要的类加载器;
conf:setting.xml整个maven工具的核心配置文件;
lib:maven运行依赖的jar包;
2.2 配置MAVEN_HOME环境变量
MAVEN3.3以上版本需要安装JDK.17+版本。同时,需要还需要配置JAVA_HOME和MAVEN_HOME环境变量。
把Maven的bin目录路径添加到path环境变量中。
配置完成后,打开命令窗口,输入“mvn -v”命令。界面效果如下图所示:
2.3 配置仓库
2.3.1 配置仓库的作用
Maven仓库相当于一个文件服务器。它是用来保存jar包文件的地方。
Maven仓库分为三种:本地仓库、远程仓库和中央仓库。
- 本地仓库:用来存储从远程仓库或中央仓库下载的插件和jar包。项目使用的一些插件和jar包应该优先从本地仓库中下载。
- 远程仓库:如果本地仓库没有想要的插件或jar包,那么,maven就会去远程仓库中下载。
- 中央仓库:在Maven工具中内置了一个远程仓库(http://repo1.maven.org/maven2),它就是一个中央仓库,用于服务全球的Maven用户。它里面包含了非常全的jar包,包含了世界上大部分流行的开源项目构件。该仓库是由Maven团队负责维护。
2.3.2 配置仓库路径
修改MAVEN_HOME/conf/settings.xml配置文件,然后查找localRepository节点,该节点就是maven本地仓库的路径。
三、搭建Maven项目
3.1 搭建Java项目
搭建命令:
mvn archetype:generate [参数列表]
参数说明:
-DarchatypeCatelog=internal
-DgroupId=com.xjy.maven.quickstart
-DartifactId=simple
-DarchetypeArtifactId=maven-archetype-quickstart
-Dversion=0.1.1-snapshot
例如:
运行的时候提示确认信息,输入“y”即可。
创建成功后,项目的目录结构如下图所示:
src/main/java : java的源代码
src/main/test : 测试源码目录
pom.xml : 项目配置文件
3.2 搭建Web项目
搭建命令:
mvn archetype:generate [参数列表]
参数说明:
-DarchatypeCatelog=internal
-DgroupId=com.xjy.maven.quickstart
-DartifactId=simpleweb
-DarchetypeArtifactId=maven-archetype-webapp
-Dversion=0.1.1-snapshot
例如:
运行时候提示确认信息,输入“y”即可。
安装完成后,项目目录结构如下图所示:
src/main/webapp # web的根目录
src/main/resources #web的配置文件目录
src/main/webapp/WEB-INF web项目的配置目录
四、Maven命令详解
4.1 生命周期
maven项目的构建过程一般经历了以下阶段:
每个阶段都对应一个Maven命令,例如:编译(compile)、测试(test)、package(打包)、安装(install)、部署(deploy)。
执行命令会将该命令在生命周期当中之前的阶段自动执行。例如:执行mvn test命令的时候,会自动执行mvn compile命令。
4.2 常用命令
(1)mvn compile
进入maven项目的根路径,执行mvn compile命令。
执行成功后,会生成一个target目录。该目录存放了编译后的文件。
(2)mvn test
修改com.xjy.maven.quickstart.AppTest类的testApp方法。
public void testApp()
{
//assertTrue( true );
System.out.println("hello maven...");
}
在命令窗口进入simple目录,然后执行mvn test命令。执行效果如下图所示:
(3)mvn package
执行该命令后,maven会在target目录下生成项目的jar包。
执行该命令的时候,会自动执行编译、测试命令。如果不想运行测试命令,可以在mvn package命令后面添加-Dmaven.test.skip=true参数。
(4)mvn install
该命令用于将项目打包成构件,并安装到本地的maven仓库中。
(5)mvn deploy
该命令用于把项目发布到本地仓库或服务器,例如:Tomcat服务器。
五、在Eclipse中使用m2eclipse插件
m2eclipse插件为Eclipse提供了Maven的集成。如果是使用新版本的Eclipse工具,默认就已经安装了m2eclipse插件。
5.1 配置maven环境
(1)配置maven安装目录。
(2)配置maven仓库位置。
(3)重构索引
在Eclipse中打开Maven Repositories视图:
鼠标右键选择本地仓库,然后选择Rebuild Index即可。
5.2 创建maven工程
第一步:新建一个Maven工程。
如果勾选了create a simple project,那么就直接跳到第三步。
(2)选择项目骨架。
(3)输入项目信息。
配置完成后,点击Finish即可。
5.3 配置Tomcat运行项目
(1)添加servlet和jsp的依赖。
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
(2)添加相关插件。
<build>
<plugins>
<!-- 资源文件拷贝插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.7</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- java编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- 配置Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<port>80</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
(3)运行项目。
设置Goals:
5.4 运行过程中可能遇到的问题
5.4.1
运行时候可能会出现以下错误:
解决办法:在JRE添加下面配置信息。
-Dmaven.multiModuleProjectDirectory=MAVEN_HOME
配置效果:
5.4.2 从远程仓库下载相关jar包超时
解决办法:修改maven仓库的镜像地址。
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url> http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
六、Maven配置详解
6.1 仓库
maven仓库:本地仓库、中央仓库、第三方仓库。
本地仓库:供Eclipse使用。本地仓库是保存在本地磁盘上。项目使用的jar包应该优先从本地仓库中加载。
中央仓库:供Maven下载到本地仓库使用,中央仓库是由Maven团队自己来维护。
第三方仓库:称为“私服”。一般是由公司内部人创建的,只提供给公司内部员工使用。
6.2 Maven下载jar包流程
如果配置了本地仓库,maven会根据坐标从本地仓库中查找jar包。如果本地仓库中没有指定jar包,才会从中央仓库中查找。如果中央仓库中有相应的jar包,那么就会把该jar包下载到本地仓库中,然后再提供给用户使用。
如果配置了私服,那么如果本地仓库没有指定jar包,就会从私服中查找相应的jar包。如果私服也没有,才会从中央仓库中查找。如果中央仓库中有相应jar包,那么就会下载到私服中保存起来,然后再提供给本地仓库保存,最后本地仓库再提供给用户使用。
6.3 POM全景图
POM的英文全名为Project Object Model,即项目对象模型,它是maven项目的核心配置文件。在POM文件中可以定义项目的坐标、项目依赖、项目信息、插件等等。
完整的POM文件:
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 项目名称,一般是公司域名的倒写 -->
<groupId>com.entor</groupId>
<!-- 模块名称 -->
<artifactId>maven-day01</artifactId>
<!-- 产品的版本号 -->
<version>0.0.1-SNAPSHOT</version>
<!-- 打包方式,一般是jar、war、pom三种方式 -->
<packaging>war</packaging>
<!-- 配置依赖关系 -->
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
<!-- 项目构建配置 -->
<build>
<!-- 配置插件 -->
<plugins>
<!-- 资源文件拷贝插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.7</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- java编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- 配置Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<port>80</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
</project>
6.4 坐标
6.4.1 什么是坐标
每个Maven工程都需要定义本工程的坐标。坐标是Maven对jar包的身份定义。
定义坐标的格式:
<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<scope></scope>
</dependency>
groupId:项目名,一般是公司域名的倒写
artifactId:模块名
version:产品版本号
scope:依赖范围,它的值可以是compile、test、provided、runtime、system
如果没有指定依赖范围,默认就是compile范围。
6.4.2 查找坐标
第一种方式:在互联网上查找(比如:http://mvnrepository.com)。
第二种方式:使用Maven插件的索引功能。
输入groupId或artifactId的信息。如果本地仓库中有对应jar包,就会显示该jar包的所有版本。然后用户只需要选择对应版本的jar包即可。
6.5 依赖冲突问题
6.5.1 什么是依赖冲突
假如在我们的Maven项目中加入Struts2-core-2.3.14的依赖,结果发现所有关于Struts2的依赖都加进来了。
因为我们的项目依赖了struts2-core-2.3.14.jar,而struts2-core-2.3.14.jar会依赖xwork-core-2.3.14.jar、commons-lang3.3.2.jar等等,所以这些依赖的jar包也会出现在我们的Maven工程中。如果项目中依赖的jar包也依赖了其他版本的jar包,就可能会出现依赖冲突的问题。比如说,spring-web依赖了spring-core-4.2.4.RELEASE,而spring-test也依赖了spring-core-3.2.0.RELEASE。
6.5.2 解决依赖冲突
(1)依赖调节
依赖调节的原则:路径近者优先原则和第一声明者优先原则。
- 示例1:
假如A项目依赖B项目依赖C1项目,而且A项目又直接依赖了C2项目,如果按照路径近者优先的原则,C2优先被项目A所依赖。
- 示例2:
假如A项目依赖了B1项目,而且A项目又依赖了B2项目,如果按照第一声明者优先原则,谁先声明谁就会优先被依赖。
(2)排除依赖
上面示例1也可以通过手动排除方式,指定A项目不依赖C1项目。我们可以在dependency节点中指定exclusions子节点来指定不需要依赖的jar包。
例如:
(3)锁定版本
锁定版本可以使得用户无需考虑依赖路径、声明优先等因素,Maven会使用指定版本的jar包。此方法在企业开发中应用较多。例如: