Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Maven中Scope的分类

Maven中Scope的分类

作者头像
Ant丶
发布于 2022-03-01 12:11:54
发布于 2022-03-01 12:11:54
88100
代码可运行
举报
文章被收录于专栏:cayzlhcayzlh
运行总次数:0
代码可运行

Maven中Scope的分类

Scope的分类

compile

默认就是compile,什么都不配置也就是意味着compile。compile表示被依赖项目需要参与当前项目的编译,当然后续的测试,运行周期也参与其中,是一个比较强的依赖。打包的时候通常需要包含进去。

test

scope为test表示依赖项目仅仅参与测试相关的工作,包括测试代码的编译,执行。比较典型的如junit。

runntime

runntime表示被依赖项目无需参与项目的编译,不过后期的测试和运行周期需要其参与。与compile相比,跳过编译而已,说实话在终端的项目(非开源,企业内部系统)中,和compile区别不是很大。比较常见的如JSR×××的实现,对应的API jar是compile的,具体实现是runtime的,compile只需要知道接口就足够了。oracle jdbc驱动架包就是一个很好的例子,一般scope为runntime。另外runntime的依赖通常和optional搭配使用,optional为true。我可以用A实现,也可以用B实现。

provided

provided意味着打包的时候可以不用包进去,别的设施(Web Container)会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。相当于compile,但是在打包阶段做了exclude的动作。

system

从参与度来说,也provided相同,不过被依赖项不会从maven仓库抓,而是从本地文件系统拿,一定需要配合systemPath属性使用

scope的依赖传递

A–>B–>C。当前项目为A,A依赖于B,B依赖于C。知道B在A项目中的scope,那么怎么知道C在A中的scope呢?答案是: 当C是test或者provided时,C直接被丢弃,A不依赖C; 否则A依赖C,C的scope继承于B的scope。

import

在做SpringBoot应用的时候,都会有如下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>1.3.3.RELEASE</version>
</parent>

继承一个父模块,然后再引入相应的依赖。

但是一般来说,自己的项目不会用springboot作为父maven;Maven的继承和Java的继承一样,是无法实现多重继承的,如果10个、20个甚至更多模块继承自同一个模块,那么按照我们之前的做法,这个父模块的dependencyManagement会包含大量的依赖。如果你想把这些依赖分类以更清晰的管理,那就不可能了,import scope依赖能解决这个问题。你可以把dependencyManagement放到单独的专门用来管理依赖的pom中,然后在需要使用依赖的模块中通过import scope依赖,就可以引入dependencyManagement。例如可以写这样一个用于依赖管理的pom:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<project>
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.test.sample</groupId>
	<artifactId>base-parent1</artifactId>
	<packaging>pom</packaging>
	<version>1.0.0-SNAPSHOT</version>
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>junit</groupId>
				<artifactid>junit</artifactId>
				<version>4.8.2</version>
			</dependency>
			<dependency>
				<groupId>log4j</groupId>
				<artifactid>log4j</artifactId>
				<version>1.2.16</version>
			</dependency>
		</dependencies>
	</dependencyManagement>
</project>

然后我就可以通过非继承的方式来引入这段依赖管理配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>com.test.sample</groupId>
			<artifactid>base-parent1</artifactId>
			<version>1.0.0-SNAPSHOT</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
	</dependencies>
</dependencyManagement>
 
<dependency>
	<groupId>junit</groupId>
	<artifactid>junit</artifactId>
</dependency>
<dependency>
	<groupId>log4j</groupId>
	<artifactid>log4j</artifactId>
</dependency>

注意:import scope只能用在dependencyManagement里面

父模块的pom就会非常干净,由专门的packaging为pom来管理依赖,也契合的面向对象设计中的单一职责原则。此外,还能够创建多个这样的依赖管理pom,以更细化的方式管理依赖。这种做法与面向对象设计中使用组合而非继承也有点相似的味道。

用这个方法来解决SpringBoot的那个继承问题:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-dependencies</artifactId>
			<version>1.3.3.RELEASE</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
	</dependencies>
</dependencyManagement>
 
<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>
</dependencies>

这样配置的话,自己的项目里面就不需要继承SpringBoot的module了,而可以继承自己项目的module了。

分享计划

博客内容将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/

许可协议

本文采用 署名-非商业性使用-相同方式共享 4.0 国际 许可协议,转载请注明出处。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-05-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Maven中optional和scope元素的使用,你弄明白了?
在梳理项目的过程中发现很多开发同学对Maven依赖文件的配置并不了解,特别是对Maven的optional元素和scope元素的使用也非常随意。这就会导致发布的jar包或war包非常“胖”、编译速度慢,而且还很容易生产jar冲突等问题。本篇文章从optional和scope的使用场景入手,让项目实现一波瘦身。
程序新视界
2020/12/03
7.7K0
Maven中optional和scope元素的使用,你弄明白了?
Maven
用着maven自动化构建没什么感觉,当要自己构建稍微复杂点的项目结构时就发现知识储备不足了
晚上没宵夜
2020/10/28
8470
Maven高级篇——多模块管理
👨‍🎓作者:Java学术趴 🏦仓库:Github、Gitee ✏️博客:CSDN、掘金、InfoQ、云+社区 💌公众号:Java学术趴 🚫特别声明:原创不易,未经授权不得转载或抄袭,如需转载可联系小编授权。 🙏版权声明:文章里的部分文字或者图片来自于互联网以及百度百科,如有侵权请尽快联系小编。微信搜索公众号Java学术趴联系小编。 ☠️每日毒鸡汤:这个社会是存在不公平的,不要抱怨,因为没有用!人总是在反省中进步的! 👋大家好!我是你们的老朋友Java学术趴,今天给大家分享一下分布式开发中必备的技能。Mav
Java学术趴
2022/08/16
2.8K0
Maven pom 中配置依赖机制
依赖管理是 Maven 的一个核心特性。管理单个项目的依赖关系非常简单。管理由数百个模块组成的多模块项目和应用程序的依赖关系是可能的。Maven 使用定义良好的类路径和库版本在定义、创建和维护可重复的构建方面帮助很大。
acc8226
2022/05/17
2.1K0
Maven pom 中配置依赖机制
[Maven进阶]聚合和继承
我们的项目已经从以前的单模块,变成了现在的多模块开发。项目一旦变成了多模块开发以后,就会引发一些问题,在这一节中我们会介绍两个内容聚合和继承,用这两个知识来解决下分模块后的一些问题。
十八岁讨厌编程
2022/12/10
8870
Maven pom.xml中的元素modules、parent、properties以及import
  项目中用到了maven,而且用到的内容不像利用maven/eclipse搭建ssm(spring+spring mvc+mybatis)用的那么简单;maven的核心是pom.xml,那么我就它来谈谈那些不同的地方;
青石路
2018/09/10
2.6K0
Maven pom.xml中的元素modules、parent、properties以及import
Maven详解
使用 x、y、z 三个『向量』作为空间的坐标系,可以在『空间』中唯一的定位到一个『点』
Java微观世界
2025/01/21
2070
Maven详解
maven使用总结
文章目录 1. Maven使用总结 1.1. 依赖范围 1.2. 依赖传递 1.2.1. 注意 1.3. 依赖排除 1.4. 依赖原则 1.4.1. 依赖路径最短优先原则 1.4.2. pom文件中申明顺序优先 1.4.3. 覆写优先 1.5. 生命周期 1.5.1. 生命周期调用的特点 1.5.2. clean生命周期 1.5.3. default生命周期 1.5.4. Site生命周期 1.6. Maven统一管理依赖的版本号 1.7. 继承 1.7.1. 步骤 1.8. 聚合 1.8.1. 步骤
爱撒谎的男孩
2019/12/31
5350
Maven
之前我们导入依赖的时候,每次都要去下载对应的 Jar 包,这样其实是很麻烦的,并且还有可能一个 Jar 包依赖于另一个 Jar 包,因此我们需要一个更加方便的包管理机制。
小简
2023/01/04
7750
Maven
IDEA与MAVEN使用
maven是一款优秀的服务构建工具,基于约定优于配置原则,提供标准的服务构建流程。maven的优点不仅限于服务构建,使用maven能够做到高效的依赖管理,并且提供有中央仓库可以完成绝大多数依赖的下载使用。
zhipingChen
2019/02/25
5K1
IDEA与MAVEN使用
使用maven快速入门
Maven 基础知识 官网: 传送门 Maven 项目结构 $ MavenProject |-- pom.xml |-- src | |-- main | | `-- java | | `-- resources | `-- test | | `-- java | | `-- resources `-- README.md POM文件 POM文件代表 工程对象模型(Project Object Model)它是使用Maven工作的基本组件,位于工程根目录。 POM文件
Isaac Zhang
2019/09/10
4730
使用maven快速入门
Maven项目管理
Maven 翻译为"专家"、“内行”,是 Apache 下的一个纯 Java 开发的开源项目。
用户9645905
2023/11/01
3700
Maven项目管理
maven多模块和依赖冲突问题汇总记录
maven多模块和依赖冲突问题汇总记录目录前言:idea怎么创建maven多module的项目首先了解上面是多module?多Module管理项目的几种方式:创建一个多module项目(idea2019.3.3版本)创建一个父pom项目:创建子模块,引入到父pom里面子父模块的区别:父pom.xml文件内容:子pom.xml文件内容:子模块之间进行互相的依赖将上面的项目改造为spring-boot多模块项目:改造父pom文件:Spring boot maven plugin问题MAVEN依赖冲突问题:依赖的传递原则:maven的依赖引入策略最短路径原则:最先声明原则:如何解决依赖冲突的问题锁定版本法什么情况下会出现Jar包冲突问题如何查找和发现jar包冲突?1. 利用idea的maven视图工具2. Idea Maven Helper 插件3. maven命令工具:如何写一个干净依赖关系的POM文件dependency:analyze-only 命令mvn dependency:analyze-duplicate 命令
阿东
2021/08/16
4.3K0
maven多模块和依赖冲突问题汇总记录
Maven的pom文件那些事
jdk7//用于定义构建输出的一些附属的构建。classifier是不能直接定义的,只能存在附加的构件(插件)时,才能(必须)添加。在包名上也会有所提现(nexus-indexer-2.0.0-javadoc.jar)
迹_Jason
2019/05/28
1.5K0
maven 学习笔记
maven 官网 https://maven.apache.org 仓库查询 https://www.mvnrepository.com/ 编译,生成target文件夹 mvn compile 测试 mvn test 打包 mvn package 删除target文件夹 mvn clean 安装jar包到本地仓库中 mvn install 自动建立项目骨架 mvn archetype:generate [-DgroupId=xxxx(组织名,公司网址的反
Meet相识
2018/09/12
5150
【maven】什么是坐标(依赖)继承与模块、web项目启动&访问
   <dependencies>        <dependency>            <groupId>com.czxy</groupId>            <artifactId>itcast-tools</artifactId>            <version>1.5.7</version>        </dependency>    </dependencies>
陶然同学
2023/02/24
1.1K0
【maven】什么是坐标(依赖)继承与模块、web项目启动&访问
项目管理构建工具——Maven(高阶篇)
Maven作为我们项目管理构建的常用工具,具备许多功能,在这篇文章中我们来仔细介绍
秋落雨微凉
2022/10/25
1.4K0
项目管理构建工具——Maven(高阶篇)
使用Maven创建Springboot的父子工程
1、在eclipse开发工具中创建一个新的Maven项目,项目类型为quickstart,如下所示:
别先生
2020/10/30
1K0
使用Maven创建Springboot的父子工程
微服务(二)——SpringCloud入门&项目搭建
SpringCloud:分布式微服务架构的一站式解决方案,是多种微服务架构落地技术的集合体,俗称微服务全家桶
不愿意做鱼的小鲸鱼
2022/09/26
1K0
微服务(二)——SpringCloud入门&项目搭建
关于Maven的使用,这些你都了解了么?
此文档主要说明Maven的基础使用方式,以及在使用过程过程中需要遵守哪些默认的准则。我们工作中会经常写maven的配置,但是很多maven使用细节你可能并不知道,但你掌握后使用maven会更加上手。
kl博主
2023/11/18
3740
相关推荐
Maven中optional和scope元素的使用,你弄明白了?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验