2.Maven创建以及依赖、继承、聚合
文章目录
- 1. Maven工程类型
- 1.1 POM工程
- 1.2 JAR工程
- 1.3 WAR工程
- 2. 在IDEA中创建Maven工程
- 3. Maven项目结构
- 4. POM模式-Maven工程关系
- 4.1 依赖
- 4.1.1 概念
- 4.1.2 注入依赖
- 4.1.3 依赖的传递性(特性)
- 4.1.4 依赖的两个原则
- 4.1.5 排除依赖
- 4.1.6 依赖范围
- 4.2 继承
- 4.3 聚合
1. Maven工程类型
1.1 POM工程
POM工程是一个逻辑工程,用在父级工程或聚合工程中。用于做jar包的版本控制
1.2 JAR工程
将会打包成Jar包,用作jar包使用,即常见的本地工程,Java Project
使用java -jar jar包名称
运行
1.3 WAR工程
将会打包成war,发布在服务器上的工程
2. 在IDEA中创建Maven工程
新建Maven工程
填写基本信息
创建成功
3. Maven项目结构
src/main/java
这个目录下储存java源代码src/main/resources
储存主要的资源文件。比如xml配置文件和properties文件src/test/java
储存测试用的类,比如JUNIT的测试一般就放在这个目录下面
因为测试类本身实际是不属于项目的,所以放在任何一个包下都显得很尴尬,所以maven专门创建了一个测试包用于存放测试的类src/test/resources
可以自己创建,储存测试环境用的资源文件,如果测试环境使用的和开发环境不同,可以单独指定,否则默认使用main/resources下的文件pom.xml
是Maven的基础配置文件。配置项目和项目之间关系,包括配置依赖关系等等
4. POM模式-Maven工程关系
POM模式,把每个项目看做一个对象,之间的关系有依赖,继承,聚合
4.1 依赖
4.1.1 概念
依赖关系,即A工厂开发或者运行过程中需要B工程的支持,则代表A工程依赖B工程
需要在A项目的POM中添加B项目的而依赖,也就是导Jar包
B工程可以把自己打成jar包,放入远程仓库,A工程中就可以下载依赖到B工程
4.1.2 注入依赖
在POM文件的 dependencies标签中配置该项目所有的依赖向,可以有多个dependence元素,以声明多个依赖
每个依赖dependence标签都应该包含以下元素:groupId, artifactId, version : 依赖的基本坐标,这三个属性加起来就是jar包的唯一标识
案例:加入mybatis依赖
4.1.3 依赖的传递性(特性)
依赖分为
直接依赖
在本项目中声明的依赖
间接依赖
在依赖项目中,所声明的依赖
传递依赖
传递依赖是Maven2.0的新特性,如果你的项目依赖一个库,这个库有依赖了别的库。你不必手动引入这些库,Maven会把这些库也间接的引入进来。这就是传递依赖。是将间接依赖的jar包也引入当前项目中
案例:上述建了一个maven-Demo1依赖了Mybatis,现在新建一个maven-Demo2,直接依赖Maven-Demo1,查看结果
先把maven-Demo1打包到本地仓库
mvn install
创建maven-Demo2,导入maven-Demo1的依赖
4.1.4 依赖的两个原则
最短路径优先原则
对于间接依赖来说,如果间接依赖了同一个包的多个版本,就会产生依赖冲突,针对这一情况,Maven采用最短路径优先原则。也就是间接依赖步数少的优先。比如
A->B->C->D(2.0)
和A-E-D(1.0)
两个间接依赖,那么最终采用的是D(1.0)
因为步数少最先声明原则
如果两个间接依赖的步数是相同的,那么第一原则不能解决所有冲突,比如
A-Y-D(2.0)
和A-E-D(1.0)
,在Maven2.0.8以及之前,是没有办法确定的,但是在Maven2.0.9开始,为了尽可能的避免构建的不确定性,Maven定义了第二原则,第一原则优先。在路径长度相同的前提下,在POM中的依赖顺序决定了谁被使用。按定义顺序决定
4.1.5 排除依赖
上面说的是靠Maven自动选择冲突依赖,但是很多时候,我们需要手动控制依赖版本,那么可以手动排除间接依赖的版本,留下自己用的版本
在Dependency标签中添加Exclusions中定义排除的依赖,可以排除多个,每个exclusion定义了一个依赖,其中包含groupId和artifactId,因为不排除不需要版本号
案例:排除maven-Demo1中的mybatis依赖
4.1.6 依赖范围
在dependency标签中的scope标签中声明该依赖的范围
compile
默认的范围,编译、测试和运行时有效
provided
编译和测试时有效,运行时无效
runtime
只有运行时有效
system
系统范围和provided类似,但是必须显示指定一个本地系统路径,
对于一些maven仓库下载不了的jar包,可以安装到本地仓库,或者放到项目中,通过system引入依赖
test
编译测试时有效
import
import只适用于pom文件中的
<dependencyManagement>
部分。表明指定的POM必须使用<dependencyManagement>
部分的依赖。<dependencyManagement><dependencies><!-- springboot 的依赖工程 pom类型 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.5.3</version><type>pom</type><scope>import</scope></dependency></dependencies> </dependencyManagement>
4.2 继承
如果A项目继承B项目,则代表A工程默认依赖B工程的所有资源,且可以适用B工程中定义的所有资源信息
被继承的工程(B工程)只能是POM工程
可以在父工程的<dependencyManagement>
进行依赖版本号管理
本质上是POM文件的继承
4.3 聚合
当我们开发的工程拥有2个以上的模块的时候,每个模块都是一个独立的功能集合。比如某大学系统中拥有搜索平台,学习平台,考试平台等。开发的时候,每个平台可以独立编译,测试,运行。这个时候,我们需要一个聚合工程
在创建聚合工程的时候,总的工程必须是POM类型的工程。各模块个任意类型
聚合的前提是继承
聚合时,所有的子项目需要声明管理父项目。父工程中也通过modules管理所有的模块
2.Maven创建以及依赖、继承、聚合相关推荐
- maven创建父子依赖项目—pom
maven创建父子依赖项目 maven创建父子依赖项目: 参考思路: 思维图: 三种项目示例: jar:控制台项目: war:web项目: war:web项目:(待写) 案例:横向拆分(按照项目结构进 ...
- 如何使用Maven创建具有依赖项的可执行JAR?
我想将我的项目打包在一个可执行的JAR中进行分发. 如何使Maven项目将所有依赖项JAR打包到我的输出JAR中? #1楼 刘坚认为是对的. Maven依赖插件允许您扩展所有依赖,然后可以将其视为资源 ...
- 【Maven实战】依赖的聚合和版本管理
1.在之前的文章中,我们已经建立了四个Maven项目,但是此时如果我们要对这四个项目进行编译打包时,必须一个一个的进行执行命令,而聚合就是指只要我们在其中一个项目中编写一些代码,则在进行此项目的编译和 ...
- Eclipse下Maven工程多模块继承和聚合的创建
使用Maven对项目进行管理的时候,多模块的继承和聚合是必不可少的,本文简要说明一下在eclipse IDE下创建多模块工程. 1.Maven多模块的聚合 一个Maven工程下创建多个模块,然后用一个 ...
- Maven学习文档常用命令继承聚合
学习视频 www.atguigu.com 目前的技术在开发中存在的问题 一个项目就是一个工程 如果项目非常庞大,就不适合继续使用package来划分模块.最好是每一个模块对应一 个工程,利于分工协作. ...
- maven项目的依赖、继承管理
目录 maven依赖 scope 依赖范围 依赖传递 依赖冲突 可选依赖 排除依赖 maven继承 继承 maven依赖 scope 依赖范围 其中依赖范围scope 用来控制依赖和编译,测试,运行的 ...
- Maven pom 继承聚合
Maven pom 继承聚合 1.1.0 简介 对于一个pom.xml来说有几个元素是必须定义的,一个是project根元素,然后就是它里面的modelVersion.groupId.artifact ...
- Maven创建聚合项目
之前没有时间对项目进行整理,现在能够闲下来写一些东西了.今天主要说明的是maven创建聚合工程的方法. 创建过程 1.首先创建一个正常的maven项目 2.删除src目录(聚合项目最外层不需要编码,只 ...
- 项目一众筹00_04Maven配置工作空间环境、STS创建第二个Maven项目,演示依赖、一个新的工作空间环境标准设置
Maven配置工作空间环境.STS创建第二个Maven项目,演示依赖目录 文章目录 Maven配置工作空间环境.STS创建第二个Maven项目,演示依赖目录 Maven配置工作空间环境 sts(ecl ...
最新文章
- Simple Dynamic Strings(SDS)源码解析和使用说明二
- Caffe中计算图像均值的实现(cifar10)
- BZOJ3998: [TJOI2015]弦论(后缀自动机,Parent树)
- oracle 主键_Oracle约束详解
- haproxy定义规则限制IP访问
- bootstraptable控制分页_bootstrap table分页(前后端两种方式实现)
- 程序员过关斩将--更加优雅的Token认证方式JWT
- Spark数据本地性
- Struts2学习笔记(十九) 验证码
- mrp手机qq2008下载-MRP格式的手机QQ2008软件介绍及如何正确安装MRPQQ2008挂Q版
- Android即时通讯实现原理
- 河南省第四届ACM程序设计大赛(共八道,目前只做两道。待续)
- python 中文排序(按拼音)
- 信息系统项目管理师 第一章-信息系统与信息化
- 三星“掌门人”李在镕身在看守所 但仍“遥控”三星
- 小闫陪你入门 Java (二)
- 基于PyQt的分组工具
- ROUGE评价算法学习
- 遭遇svchoct.exe,vonine.exe,HBKernel32.sys,ssdtti.sys,System.exe,ublhbztl.sys等2
- centos7 同步网络时间