Maven
什么是 Maven
- Maven:一个用于自动化构建项目和管理项目依赖的工具
- 自动化构建项目:按照企业中主流的项目模板,创建完善的项目结构
- 管理项目依赖( jar 包):配置式添加和管理,自动下载和导入
Maven 环境搭建
-
前置环境:jdk 环境( Maven 3.3+ require JDK 1.7+)
-
Maven下载与配置
我的电脑---->属性---->高级系统设置---->环境变量---->系统变量
---->系统变量中选中 Path 变量,编辑新建,添加值为 Maven 下的 bin 文件目录
---->命令行中输入 mvn -v,显示版本信息即配置成功
Maven 生命周期
Maven 生命周期即项目构建过程,可以通过命令行输入 mvn 相关命令进行操作,IDEA 可操作右侧 maven 选项
Maven 有以下三个标准的生命周期:
- clean:项目构建之前的清理过程
- pre-clean:执行一些需要在 clean 之前完成的工作
- clean:移除所有上一次构建生成的文件
- post-clean:执行一些需要在 clean 之后立刻完成的工作
在一个生命周期中,运行某个阶段的时候,它之前的所有阶段都会被运行,也就是说,如果执行 mvn clean 将运行 pre-clean, clean 两个生命周期阶段
- default(或 build):项目编译和打包处理(主要生命周期)
生命周期阶段 | 描述 |
---|---|
validate(校验) | 校验项目是否正确并且所有必要的信息可以完成项目的构建过程 |
initialize(初始化) | 初始化构建状态,比如设置属性值 |
generate-sources(生成源代码) | 生成包含在编译阶段中的任何源代码 |
process-sources(处理源代码) | 处理源代码,比如说,过滤任意值 |
generate-resources(生成资源文件) | 生成将会包含在项目包中的资源文件 |
process-resources (处理资源文件) | 复制和处理资源到目标目录,为打包阶段最好准备 |
compile(编译) | 编译项目的源代码 |
process-classes(处理类文件) | 处理编译生成的文件,比如说对Java class文件做字节码改善优化 |
generate-test-sources(生成测试源代码) | 生成包含在编译阶段中的任何测试源代码 |
process-test-sources(处理测试源代码) | 处理测试源代码,比如说,过滤任意值 |
generate-test-resources(生成测试资源文件) | 为测试创建资源文件 |
test-compile(编译测试源码) | 编译测试源代码到测试目标目录 |
process-test-classes(处理测试类文件) | 处理测试源码编译生成的文件 |
test(测试) | 使用合适的单元测试框架运行测试(Juint是其中之一) |
prepare-package(准备打包) | 在实际打包之前,执行任何的必要的操作为打包做准备 |
package(打包) | 将编译后的代码打包成可分发格式的文件,比如JAR、WAR或者EAR文件 |
pre-integration-test(集成测试前) | 在执行集成测试前进行必要的动作。比如说,搭建需要的环境 |
integration-test(集成测试) | 处理和部署项目到可以运行集成测试环境中 |
post-integration-test(集成测试后) | 在执行集成测试完成后进行必要的动作。比如说,清理集成测试环境 |
verify (验证) | 运行任意的检查来验证项目包有效且达到质量标准。 |
install(安装) | 安装项目包到本地仓库,这样项目包可以用作其他本地项目的依赖 |
deploy(部署) | 将最终的项目包复制到远程仓库中与其他开发者和项目共享 |
- site:项目报告、站点信息、发布环节
- pre-site:执行一些需要在生成站点文档之前完成的工作
- site:生成项目的站点文档
- post-site: 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
- site-deploy:将生成的站点文档部署到特定的服务器上
执行 mvn site 后
settings.xml 全局配置文件
Maven 依赖搜索顺序
- 在本地仓库中搜索,如果找不到,执行步骤 2,如果找到了则执行其他操作
- 在中央仓库中搜索,如果找不到,并且有一个或多个远程仓库已经设置,则执行步骤 4,如果找到了则下载到本地仓库中以备将来引用
- 如果远程仓库没有被设置,Maven 将简单的停滞处理并抛出错误(无法找到依赖的文件)
- 在一个或多个远程仓库中搜索依赖的文件,如果找到则下载到本地仓库以备将来引用,否则 Maven 将停止处理并抛出错误(无法找到依赖的文件)
<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 http://maven.apache.org/xsd/settings-1.2.0.xsd">
<localRepository>/path/to/local/repo</localRepository> // 配置本地仓库
<interactiveMode>true</interactiveMode> // 是否需要和用户交互,默认 true
<offline>false</offline> // 是否需要启用离线模式,默认 flase
<pluginGroup>com.your.plugins</pluginGroup> // 插件没有提供 groupId 时自动添加
<proxies> // 用于配置连接仓库的代理
<proxy>
<id>optional</id>
<active>true</active>
<protocol>http</protocol>
<username>proxyuser</username>
<password>proxypass</password>
<host>proxy.host.net</host>
<port>80</port>
<nonProxyHosts>local.net|some.host.com</nonProxyHosts>
</proxy>
</proxy>
<servers> // 远程仓库服务器在访问时所需的认证信息
<server>
<id>deploymentRepo</id>
<username>repouser</username>
<password>repopwd</password>
</server>
</servers>
<mirrors> // 配置镜像仓库
<mirror>
<id>mirrorId</id>
<mirrorOf>repositoryId</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://my.repository.com/repo/path</url>
</mirror>
</mirrors>
<profiles> // 完成一些特定环境下的定制化操作
<profile>
<id>jdk-1.4</id>
<activation> // 指定某些条件下自动切换 profiles 配置
<jdk>1.4</jdk>
</activation>
<repositories> // 配置远程仓库列表
<repository>
<id>jdk14</id>
<name>Repository for JDK 1.4 builds</name>
<url>http://www.myhost.com/maven/jdk14</url>
<layout>default</layout>
<snapshotPolicy>always</snapshotPolicy>
</repository>
</repositories>
</profile>
<profile>
<id>env-dev</id>
<activation>
<property>
<name>target-env</name>
<value>dev</value>
</property>
</activation>
<properties> // 声明扩展配置项
<tomcatPath>/path/to/tomcat/instance</tomcatPath>
</properties>
</profile>
</profiles>
<activeProfiles> // 手动激活 profiles 配置
<activeProfile>alwaysActiveProfile</activeProfile>
<activeProfile>anotherAlwaysActiveProfile</activeProfile>
</activeProfiles>
</settings>
在 maven / conf / settings.xml 中配置本地仓库路径(Default: ${user.home}/.m2/repository)
<localRepository>D:\杂七杂八\蓝旭\apache-maven-3.8.1\usrlibs</localRepository>
在 maven / conf / settings.xml 中的 < mirrors >< /mirrors > 标签中配置国内 maven 镜像(阿里云镜像)
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
在 maven / conf / settings.xml 中的 < profiles >< /profiles > 标签中配置 jdk 版本
<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>
IDEA 创建 Maven
Maven 项目目录结构
- main : 该目录下存放的是该项目的主要代码文件,下面有三个文件夹,分别用来存放:
- java:该目录用来存放 java 的源代码文件
- resources:该目录主要用来存放项目的一些配置文件(比如 spring 的 xml 配置文件)。
- webapp:该目录相当于 web 项目下 webcontent 的目录,用来存放 jsp、web.xml 等文件.
- test :该目录用来存放项目的测试文件
- java:该目录主要存放该项目的测试所用的 java 源代码。
- resources:该目录存放测试使用的资源文件。
- pom.xml
File---->New---->Project(使用骨架)
main 目录下手动创建 java 等文件,src 下创建 test 文件
File---->New---->Project(不使用骨架)
main 目录下手动创建 webapp 等文件
File---->Project Structure---->Modules
需要补齐 web.xml 和 pom.xml 中的一些配置
pom.xml 项目配置文件
POM ( Project Object Model,项目对象模型 ) 是 Maven 工程的基本工作单元,是一个 XML 文件,包含了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。
执行任务或目标时,Maven 会在当前目录中查找 POM。它读取 POM,获取所需的配置信息,然后执行目标。
<groupId>org.example</groupId> // 所属组织名
<artifactId>mavenDemo</artifactId> // 项目名
<version>1.0-SNAPSHOT</version> // 使用版本号
<packaging>war</packaging> // 项目打包形式
通过坐标 gav( groupId,artifactId,version )寻找项目或依赖
配置 jar 包依赖
搜索所需 jar 包---->复制依赖代码---->加入到 pom.xml 中的 < dependencies>< /dependencies> 标签中
依赖范围
在项目发布过程中,帮助决定哪些构件被包括进来
<scope></scope>
scope | 编译 | 运行 | 测试 | 打包 |
---|---|---|---|---|
compile | Y | Y | Y | Y |
provided | Y | N | Y | N |
runtime | N | Y | Y | Y |
test | N | N | Y | N |
system | Y | N | Y | N |
- compile:默认范围,编译,运行,测试,打包阶段时有效
- provided:类似于编译,用于编译和测试阶段,运行阶段时该依赖由服务器提供,打包时无效
例如:servlet-api.jar,tomcat 服务器会⾃带 servlet-api.jar 包 - runtime:运行,测试,打包阶段有效
例如:jdbc 驱动 - test:只在测试阶段有效
例如:junit.jar - system:类似 provided,需要外在提供相应的元素。通过 systemPath 来取得
例如:本地 jar 包 - systemPath:仅用于范围为 system 提供相应的路径
- optional:当项目自身被依赖时,标注依赖是否传递。用于连续依赖时使用
传递依赖与排除依赖
- 传递依赖:如果我们的项目引用了一个 jar 包,而该 jar 包又引用了其他 jar 包,那么在默认情况下项目编译时,Maven 会把直接引用和间接引用的 jar 包都下载到本地。
- 排除依赖:如果我们只想下载直接引用的 jar 包,那么需要在 pom.xml 中做如下配置:(将需要排除的 jar 包的坐标写在中)
<exclusions>
<exclusion>
<groupId>xxx</groupId>
<artifactId>xxx</artifactId>
<version>xxx</version>
</exclusion>
</exclusions>
依赖冲突
若项目中多个 jar 同时引用了相同的 jar (版本不同)时,会产生依赖冲突,解决策略
- 短路优先
本项目——>A.jar——>B.jar——>X.jar
本项目——>C.jar——>X.jar
引用 C 的 X.jar
- 声明优先
若引用路径长度相同时,在 pom.xml 中谁先被声明,就使用谁
聚合
多个项目同时运行称为聚合( IDEA 创建聚合工程 )
需在 pom.xml 设置
<modules>
<module>../a</module>
<module>../b</module>
</modules>
继承
在聚合多个项目时,如果这些被聚合的项目中需要引入相同的 jar ,那么可以将这些 jar 写入父 pom 中,各个子项目继承该 pom 即可
mvn help:effective-pom // 查看父 pom 配置命令
- 父 pom 配置:将需要继承的 jar 包的坐标放入标签
<dependencyManagement>
<dependencies>
<dependency>
<groupId>.....</groupId>
<artifactId>.....</artifactId>
<version>.....</version>
</dependency>
</dependencies>
</dependencyManagement>
- 子 pom 配置:
<parent>
<groupId>父pom所在项目的groupId</groupId>
<artifactId>父pom所在项目的artifactId</artifactId>
<version>父pom所在项目的版本号</version>
</parent>