//1.Maven介绍
简介
一款帮助程序员构建项目的工具,我们只需要告诉Maven需要哪些 Jar 包,它会帮助我们下载所有的Jar,极大提升开发效率。 - 可从本地仓库或远程仓库(默认为MvnRepository)中自动导入jar包。 - 统一jar包资源路径,版本管理,统一项目结构,第三方良好的集成。 - 通过联网在远程仓库下载的jar包,会存储至本地仓库(C:\Users\用户名.m2)。 - 是一种XML标记语言。
安装
可以使用指定的Maven版本,或使用 IDEA 自带的Maven(版本3.3.9)。 - 使用指定的Maven版本:需配置环境变量,第一个变量的变量名为 M2_HOME 或 MAVEN_HOME,值为maven的路径。第二个变量的变量名为 Path,值为%MAVEN_HOME%\bin。 - 使用 IDEA 自带的Maven版本:无需配置。
目录结构
若要使用Maven,那么项目的目录结构必须符合Maven的规范。 - project:存放 pom.xml(Maven项目的配置文件) 和所有的子目录。 - project/src/main/java:存放项目的 java 源代码。 - project/src/main/resources:存放项目资源文件(如property)。 - project/src/main/webapp:web 项目的根目录。 - project/src/test/java:存放单元测试源代码(如JUnit)。 - project/src/test/resources:存放单元测试资源文件。 - project/target:存放打包(编译)后的项目文件。
生命周期 (Lifecycle)
清空:clean - 验证:validate - 编译:compile - 测试:test - 打包:package - 核实:verify - 安装,重新下载jar包:install - 站点,显示jar包来源:site - 部署:deploy
//1.仓库
作用
用来存放Maven管理的所有Jar包。 - 当项目编译时,Maven首先从本地仓库中寻找项目所需的Jar包,若本地仓库没有,再到Maven的中央仓库下载所需Jar包。
分类
本地仓库:本地的Jar包仓库。 - 中央仓库:官方提供的远程仓库(默认为MvnRepository)。
//2.坐标
作用
是Jar包的唯一标识,Maven通过坐标在仓库中找到项目所需的Jar包。 - 添加时,添加至 pom.xml 的 <dependencies></dependencies>
格式
< dependency>
< groupId> 所需Jar包的项目名</ groupId>
< artifactId> 所需Jar包的模块名</ artifactId>
< packaging> jar</ packaging>
< version> 所需Jar包的版本号</ version>
< scope> test(依赖范围,后面会讲)</ scope>
</ dependency>
//3.依赖
简介
传递依赖:如果引用了一个Jar包,而该Jar包又引用了其他Jar包,那么在默认情况下项目编译时,Maven会把直接引用和简洁引用(传递引用)的Jar包都下载到本地。 - 排除依赖:如果只想下载直接引用的Jar包,那么需要在pom.xml中进行配置。
配置排除依赖
< exclusions>
< exclusion>
< groupId> 需排除Jar包的项目名</ groupId>
< artifactId> 需排除Jar包的模块名</ artifactId>
< packaging> pom</ packaging>
< version> 需排除jar包的版本号</ version>
</ exclusion>
</ exclusions>
依赖范围
值 作用 compile 默认范围,用于编译 provided 类似于编译,但支持你期待jdk或者容器提供,类似于classpath runtime 在执行时需要使用 test 用于test任务时使用 system 需要外在提供相应的元素。通过systemPath来取得 systemPath 仅用于范围为system。提供相应的路径 optional 当项目自身被依赖时,标注依赖是否传递。用于连续依赖时使用
依赖冲突
若项目中多个Jar同时引用了相同的Jar时,会产生依赖冲突,但Maven采用了两种避免冲突的策略,因此在Maven中是不存在依赖冲突的。 - 短路优先:本项目—>A.jar—>B.jar—>X1.1.jar、本项目—>C.jar—>1.0.jar。若本项目引用了A.jar,A.jar又引用了B.jar,B.jar又引用了X1.1.jar,并且C.jar也引用了X1.0.jar。在此时,Maven只会引用引用路径最短的X1.0Jar。 - 声明优先:若引用长度相同时,在pom.xml中谁先被声明,就使用谁。
//4.聚合
作用
实现聚合
< modules>
< module> web-connection-pool</ module>
< module> web-java-crawler</ module>
</ modules>
//5.继承
作用
在聚合多个项目时,如果这些被聚合的项目中需要引入相同的Jar,那么可以将这些Jar写入父pom中,各个子项目继承该pom即可。 - 可以通过标签来整合子模块的编译顺序。 - 可以将一些子项目中共用的依赖或将其版本统一写到父级配置中,以便统一管理。 - groupId,artifactId,version 可直接继承,减少子项目的 pom 配置。
父pom配置
父级的pom文件只作项目的子模块的整合,在maven install 时不会生成 jar/war 压缩包。 - 将父级项目的pom.xml文件的packaging配置设为pom。 - 将需要继承的Jar包的坐标放入标签即可。
< dependencyManagement>
< dependencies>
< dependency>
< groupId> 需继承的Jar包的项目名</ groupId>
< artifactId> 需继承的Jar包的模块名</ artifactId>
< packaging> pom</ packaging>
< version> 需继承的jar包的版本号</ version>
</ dependency>
</ dependencies>
</ dependencyManagement>
子pom配置
< parent>
< groupId> 父pom所在项目的groupId</ groupId>
< artifactId> 父pom所在项目的artifactId</ artifactId>
< version> 父pom所在项目的版本号</ version>
</ parent>
//1.pom.xml
打包类型:packaging
jar:默认,将所有java文件编译为.class文件,且按照原来的层级结构放置,最终压缩为一个jar文件。一般是内部调用或作为服务使用 - war:将所有java文件编译为.class文件,且将项目中依赖的所有jar包放在WEB-INF/lib文件夹,最终压缩为一个war文件。一般用于部署 - pom:聚合、且父类都为pom类型
其他
协议版本:modelVersion 公司名称:name 公司地址:url 依赖集合:dependencies 依赖:dependency
properties
可在其中配置自定义属性。 - 配置:<属性名>值</属性名> - 调用属性的值:${属性名}
作用域:scope
compile:默认的scope,表示 dependency 都可以在生命周期中使用。而且,这些 dependencies 会传递到依赖的项目中。适用于所有阶段,会随着项目一起发布。 - provided:跟compile相似,但是表明了dependency 由JDK或者容器提供,例如Servlet AP和一些Java EE APIs。这个scope 只能作用在编译和测试时,同时没有传递性。 - runtime:表示 dependency 不作用在编译时,但会作用在运行和测试时,如JDBC驱动,适用运行和测试阶段。 - test:表示 dependency 作用在测试时,不作用在运行时。只在测试时使用,用于编译和运行测试代码。不会随项目发布。 - system:跟 provided 相似,但是在系统中要以外部JAR包的形式提供,maven不会在 repository 查找它。
版本号:version
SNAPSHOT(快照版本):动态监测 非稳定版本 - RELEASE(正式版本):根据版本号监测 版本号一致则不更新 稳定版本
打包执行的插件:build