首页 > 其他分享 >Maven依赖管理

Maven依赖管理

时间:2023-02-13 16:11:35浏览次数:37  
标签:依赖 1.2 管理 Maven SNAPSHOT log4j project3 project2

本文主要记录Maven依赖管理中关于依赖传递和依赖范围的知识

Maven项目示例

创建3个maven项目,分配依赖log4j 1.2.12, 1.2.13, 1.2.14版本。

<!--项目1-->
<groupId>com.leo</groupId>
<artifactId>project1</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
	<dependency>
		<groupId>log4j</groupId>
		<artifactId>log4j</artifactId>
		<version>1.2.12</version>
	</dependency>
</dependencies>

<!--项目2-->
<groupId>com.leo</groupId>
<artifactId>project2</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
	<dependency>
		<groupId>log4j</groupId>
		<artifactId>log4j</artifactId>
		<version>1.2.13</version>
	</dependency>
</dependencies>

<!--项目3-->
<groupId>com.leo</groupId>
<artifactId>project3</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
	<dependency>
		<groupId>log4j</groupId>
		<artifactId>log4j</artifactId>
		<version>1.2.14</version>
	</dependency>
</dependencies>

此时三个项目的依赖关系如图所示,三个项目分别依赖了不同版本的log4j。

image

依赖传递

现在我们构造这样一种情况,project3依赖log4j和junit,project2依赖log4j和project3,maven配置如下:

<!--项目2-->
<groupId>com.leo</groupId>
<artifactId>project2</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
	<dependency>
		<groupId>log4j</groupId>
		<artifactId>log4j</artifactId>
		<version>1.2.13</version>
	</dependency>
	<dependency>
		<groupId>com.leo</groupId>
		<artifactId>project3</artifactId>
		<version>1.0-SNAPSHOT</version>
	</dependency>
</dependencies>

<!--项目3-->
<groupId>com.leo</groupId>
<artifactId>project3</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
	<dependency>
		<groupId>log4j</groupId>
		<artifactId>log4j</artifactId>
		<version>1.2.14</version>
	</dependency>
	<dependency>
		<groupId>junit</groupId>
		<artifactId>junit</artifactId>
		<version>4.12</version>
	</dependency>
</dependencies>

此时project2和project3的依赖关系如图:

image

此时project2的依赖关系中出现了project3以及project3所依赖的包。对于project2来说,此时不光可以使用project3,也可以使用project3所以来的junit包。

同时我们注意到,project3依赖了1.2.14版本的log4j,这与project2本身所依赖的1.2.13版本冲突了。

此时Maven会使用如下3个规则来选择哪个包生效:

  1. 依赖层级浅的包会覆盖依赖层级深的包。(示例中project2的log4j 1.2.13版本的依赖层级为1,1.2.14的依赖层级为2,因此第一层的版本生效)
  2. 同层依赖中,先声明的包版本生效。

image

  1. 同pom.xml文件中,后声明的版本生效。

依赖隐藏

如果不希望别人在依赖我的包时知道我的包依赖了哪些其他的包,那么可以在引用依赖时将其标注为<optional>true</optional>,这样别人在使用这个包时,就不会看到这个包依赖的包。

<!--项目2-->
<groupId>com.leo</groupId>
<artifactId>project2</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
	<dependency>
		<groupId>log4j</groupId>
		<artifactId>log4j</artifactId>
		<version>1.2.13</version>
	</dependency>
	<dependency>
		<groupId>com.leo</groupId>
		<artifactId>project3</artifactId>
		<version>1.0-SNAPSHOT</version>
	</dependency>
</dependencies>

<!--项目3-->
<groupId>com.leo</groupId>
<artifactId>project3</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
	<dependency>
		<groupId>log4j</groupId>
		<artifactId>log4j</artifactId>
		<version>1.2.14</version>
	</dependency>
	<dependency>
		<groupId>junit</groupId>
		<artifactId>junit</artifactId>
		<version>4.12</version>
		<optional>true</optional>
	</dependency>
</dependencies>

这样配置后,依赖关系如下图所示

image

可以看到在project2中是无法看到project3所依赖的junit包的。当然也就无法通过依赖传递的方式使用到junit包。

依赖屏蔽

当我们引用别人的包时,别人的包中某些依赖我们不想引入自己的项目,那我们可以使用如下方式排除间接依赖的包。

<!--项目2-->
<groupId>com.leo</groupId>
<artifactId>project2</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
	<dependency>
		<groupId>log4j</groupId>
		<artifactId>log4j</artifactId>
		<version>1.2.13</version>
	</dependency>
	<dependency>
		<groupId>com.leo</groupId>
		<artifactId>project3</artifactId>
		<version>1.0-SNAPSHOT</version>
		<!--排除不想依赖的包-->
		<exclusions>
			<exclusion>
				<groupId>log4j</groupId>
				<artifactId>log4j</artifactId>
			</exclusion>
		</exclusions>
	</dependency>
</dependencies>

<!--项目3-->
<groupId>com.leo</groupId>
<artifactId>project3</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
	<dependency>
		<groupId>log4j</groupId>
		<artifactId>log4j</artifactId>
		<version>1.2.14</version>
	</dependency>
	<dependency>
		<groupId>junit</groupId>
		<artifactId>junit</artifactId>
		<version>4.12</version>
	</dependency>
</dependencies>

如此配置后的依赖关系如图:

image

可以看到project2中没有引入project3所依赖的log4j。

依赖范围

引入依赖时,可以指定依赖包的生效范围

scope 主代码 测试代码 打包 范例
compile(默认) Y Y Y log4j
test Y junit
provided Y Y servlet-api
runtime Y jdbc
  • provided解释:例如,我们本地开发时使用了servlet-api 3.0版本进行调测,但当我们要把代码部署到服务器的tomcat中时,服务器的tomcat不支持3.0版本的servlet-api,它自带了自己的版本。如果我们把3.0版本打包进去,由于3.0版本会先加载,就导致在服务器的tomcat中无法运行。
  • runtime解释:jdbc平时我们在使用的时候,加载driver都是通过字符串的形式,在代码中并没有真正引用过driver的内容,因此开发时可以不用引入需要依赖的driver,只要打包时把driver打进去就行了。

依赖范围的传递性

compile test provided runtime
compile compile test provided runtime
test
provided
runtime runtime test provided runtime

行表示本项目所依赖的包配置的scope,列表示依赖包的依赖包的scope。

标签:依赖,1.2,管理,Maven,SNAPSHOT,log4j,project3,project2
From: https://www.cnblogs.com/leometeor/p/17116511.html

相关文章

  • react状态管理redux
    redux产生的历史背景当我们的前端系统变得复杂,包含众多子组件,特别是包含很长一条子组件链时。我们的state管理就会非常繁琐,例如如下图,如果Child11需要用到App里的stat......
  • 当EPM遇上ChatGPT - ChatGPT认识全面预算、企业绩效管理、多维数据库这些概念吗?
    这些天人工智能聊天机器人ChatGPT可谓是火出天际了。作为管理会计、EPM软件开发者,我们很想知道ChatGPT对EPM软件应用和技术的理解。先看看ChatGPT是怎么理解企业绩效管理-EP......
  • 会话管理技术实战(用户登录案例)
    [1].创建一个User类,封装用户名和密码。[2].提供一个首页面,欢迎用户登录:IndexServlet,提供一个退出的链接。[3].提供一个登录的Servlet:处理登录请求。[4].提供一个退出的......
  • 会话管理技术实战(购物车案例)
    会话管理技术实战(购物车案例)**[1].创建Book封装图书信息:Book[2].创建BookDB,模拟数据库,里面是保存图书[3].提供图书的购买页面:ListBookServlet[4].添加购物车功能:Pu......
  • 会话及管理技术
    第五章会话以及会话管理技术1.会话概述:什么是会话:从打开浏览器,到访问网页,到最终关闭浏览器,整个过程就是一次会话。会话的特点:包含多个请求,一次完整的会话对应一个用户。......
  • 移动设备安全管理基础指南
    什么是移动安全管理(MSM)移动安全管理是指为保护企业中的移动设备和企业数据而采取的行动。这些操作可以进一步被归类为反应性的或主动的,基于该操作是在数据和设备被破坏之......
  • 基于SSM框架的校园迎新信息管理系统
    下载地址:​​程序源码点我​​文章目录​​校园迎新信息管理系统​​​​一、主要技术:​​​​二、需求分析:​​​​三、功能模块结构​​​​四、设计结果展示​​​​六......
  • BooksManagementSystem(图书管理系统)
    一、数据库创建数据库--添加数据库createdatabaseifnotexistsbms;创建表--创建user表createtable`user`(`id`int(11)notnullauto_incrementcomme......
  • 十年老程序员:再见了Navicat,以后多数据库管理就看这款SQL工具
    作为十年的老程序员,每天的工作都是跟各种数据库亲密接触。厂家自带数据库管理工具,无法管理这么多种数据库,还得找一款多数据库管理工具/SQL工具。以前还在读大学的时候,老......
  • 低成本运维软件WGCLOUD - 主机分组管理介绍使用
    有时候我们主机比较多,不同的项目想进行分组管理WGCLOUD监测平台是支持分组的,不过默认没有启用该功能,只要修改个配置项就可以使用主机分组了在server/config/application.yml......