//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.聚合
作用
- 将多个项目同时运行就称为聚合。
实现聚合
- 在pom中进行配置:
<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
版权声明:本文为qq_51756226原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。