Apache Maven 基础
Apache Maven
01核心概念
maven 概念
-
Maven 是一个项目管理工具,可以对 Java 项目进行构建、依赖管理
-
解决的问题:
-
- 项目的 jar 来源
-
- 项目的依赖如何管理
-
- 项目构建
-
名词解释
-
Project
- 可被 Maven 识别的项目结构,是项目运行的工作空间, Maven Project 构建之后会生产 Java SE 或 Java EE 项目的目录结构(Java Project)
-
POM
- POM (Project Object Model),项目对象模型.. 是 Maven 工程的基本单位,是一个 XML 格式的文件,包含了项目的基本信息,主要是用于描述项目如何构建,声明项目依赖,等等
-
仓库
-
本地仓库
- 存放资源(jar)的本地目录,Maven 项目请求拉取资源的时候,优先查找本地仓库,如果找不到对应的资源,回从远程库中拉倒本地库,项目在从本地库拉取资源
-
远程仓库
-
中央仓库
- 由 Maven 社区提供的仓库,其中包含了大量常用的库.所有主流的资源到哪
-
私有仓库
- 开发人员自己定制仓库,包含了所需要的代码库或者其他工程中用到的 jar 文件
-
-
坐标
-
groupId
- 公司或者组织的唯一标志
-
artifactId
- 项目的唯一id
-
version
- 项目的版号
-
02生命周期

clean
- 清理项目编译空间
validate
- 验证项目是否正确且所有信息必须都是可用的
compile
- 执行编译, 源代码编译, Maven Project -> JavaProject
test
- 运行项目中的测试(单元测试)
package
- 打包成可用分发格式文件,如 JAR\WAR. Java Project -> Jar / WAR 包
verify
- 验证打包好的程序
install
- 安装本项目到本地仓库
deploy
- 将打包好的 Jar/War 包推送到远程仓库
03项目类型
jar
- Java SE 项目工程
war
- Java EE 工程项目
pom
- POM 项目工程是逻辑工程,主要用于父级工程中.(继承\聚合)的父工程
04项目关系
聚合关系
- 可以帮助我们把项目的多个模块聚合起来,一次性可构建多个模块
- 解决了多模块构建效率低,能快速构建多个子项目
- 可以通过父项目中
<modules>子项目</modules>
判断子项目是否被聚合了
继承关系
- 可以将各个模块相同的依赖和配置提取出来,能简化子项目POM,并且也可以促进模块化配置的一致性(如版本号)
- Maven 项目中的继承是 POM 资源之间的继承,不是项目之间的继承
- 在子项目中的 pom.xml 中增加
<parent> 父坐标 </parent>
依赖关系
- 项目A 使用项目 B 的资源,我们将 B 包导入到 A 项目中, 即 A 依赖于 B
- 在 IDEA 中 A B 项目放在通过工作空间中,开发中可以直接引用,但是启动的时候,必须将 B 项目安装到本地仓库,A才能引用
05常用配置
配置本地仓库
<localRepository>
本地仓库目录
</localRepository>
配置阿里镜像仓库
-
详情
<mirror> <id>alimaven</id> <mirrorOf>central</mirrorOf> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/repositories/central/</url> </mirror>
06命令使用
mvn + 生命周期
跳过测试
-DskipTests:不执行测试用例,但会编译生成测试的class-Dmaven.test.skip=true:不执行也不编译测试内容
加快构建速度
-Dmaven.compile.fork=true启用多线程编译-T 8C:表示 8 个核编译
指定项目构建
--projects或者-pl:构建指定的项目,多个项目以逗号隔开
构建项目所依赖的项目也要常用构建
--also-make或者-am
例子
mvn clean install -DskipTests -Dmaven.compile.fork=true -T 3C -pl project 1,project2,project3 -am
07依赖管理
依赖范围(scope)
-
Maven 在编译、测试、运行阶段所需的依赖不完成一致,所以 Maven 通过三种不同的 classpath 实现在不同阶段引入所需的依赖:编译 classpath、测试classpath、运行classpath
-
范围
-
compile
- 编译、测试、运行
-
test
-
如Junit
- 测试
-
-
provided
- 编译、测试
-
runtime
- 测试、运行
-
system
- 编译、测试;通过手动指定依赖
<systemPath></systemPath>
- 编译、测试;通过手动指定依赖
-
import
- 不会影响
-
传递性依赖
- 项目 A 依赖项目 B ,而项目B 依赖项目 C,那么项目 A 依赖项目 C
依赖调节
-
项目 A 依赖项目 B 和项目 C,而项目B 和项目 C 依赖于项目 D,那项目 A 是通过 A -> B -> D 是通过 A -> C -> D 依赖 项目 D的?需要引入依赖调节解决该问题
-
依赖调节原则
- 原则1:路径最短者优先
- 原则2:第一声明者优先
可选依赖(option )
- 当 dependency 下的 option 配置为 true ,表示依赖是可选的,不会因为传递性依赖导致依赖被引入
排除依赖(exclusions)
- 因传递性依赖会引入第三方的依赖,第三方依赖可能存在安全问题,或者发生了依赖冲突,这时候就需要排除依赖
08高级用法
dependencyManagement
- Maven 中 dependencyManagement 元素提供了版本管理,只要在父模块中声明依赖的版本号,那么子模块再次引入依赖的时候就不需要显式的列出版本号,这样在父模块就能管理整个项目的依赖版本。
注意:被 dependencyManagement 包起来的依赖不会被主动引入,需要在子模块中再次引入
在 src 下的非java文件不会编译到 classpath 中
-
配置不过滤文件
<resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources>
Maven BOM
- Maven提供的功能,它通过定义一整套相互兼容的jar包版本集合,使用时只需要依赖该BOM文件,即可放心的使用需要的依赖jar包,且无需再指定版本号。
BOM 的本质是 pom 文件,文件中定义了一组可以相互兼容的依赖,并且通过 dependencyManagement 包装起来 - 覆盖 BOM 只要在子项目中 dependency 中添加 version 即可
思维导图


浙公网安备 33010602011771号