首页 > 其他分享 >[Maven] Maven scope 总结

[Maven] Maven scope 总结

时间:2023-08-29 10:45:54浏览次数:40  
标签:总结 provided 依赖 boot Maven slf4j org scope

1 问题背景

1.1 一起maven dependency scope := provided 引发的事故

今天在运行科室的bdp-common-resource工程时,在src/main目录下一个类中插入了一段含main方法的临时调试代码:

import lombok.extern.slf4j.Slf4j;
// ...

@Slf4j
public class DBCFileUtils {
    // ...

    public static void main(String[] args) {
        System.out.println("hello");
    }
    
    // ...
}
  • 控制台运行结果却赫然线显示slf4j日志错误,无法正常显示本应输出的日志:
java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
  • 经过分析,知道:
  • org.slf4j.LoggerFactory 属于 org.slf4j:slf4j-api
  • 直接原因:目标工程在运行编译的包,没有引入 org.slf4j:slf4j-api 这一依赖包
  • 难道是没有引入slf4j/log4j包吗?非也:
<!-- log dependency -->
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-api</artifactId>
	<scope>provided</scope>
</dependency>

<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-log4j12</artifactId>
	<scope>provided</scope>
</dependency>
  • 几经排查,发现:问题就出在scope:=provided上!

scope 的值由provided改为compile,一切就解决了~

  • 经过这次事件,有必要好好学习/复习一下: maven dependency 的 scope

2 Maven dependency scope

Maven中的scope主要有以下6种。

接下来分别介绍下这几种scope:

2.1 compile

  • 不声明scope元素的情况下的默认值
  • compile表示被依赖包需要参与当前项目的编译,包括后续的测试运行周期也参与其中,是一个比较强的依赖;
  • 打包阶段:依赖被打入到项目jar包中。

2.2 provided

  • provided 类型的scope只会在项目的编译、测试阶段起作用;
  • 可以认为在目标容器中已经提供了这个依赖,无需再提供,但是在编写代码或者编译时可能会用到这个依赖;
  • 打包阶段:依赖不会被打入到项目jar包中。
说到provided,这里就要说到<dependency>下的子标签<optional> :
    如果一个依赖的 <optional> 设置为true,则:
      该依赖在打包时,不会被打进jar包;同时,不会通过依赖传递传递到依赖该项目的工程;
      例如:x依赖B,B由依赖于A(x->B->A),则A中设置<optional> 为true的依赖不会被传递到x中。

这两者的区别在于:
  1、<optional>为true 表示某个依赖可选,该依赖是否使用都不会影响服务运行;
  2、provided的<scope>在目标容器中已经提供了这个依赖,无需再提供。(潜台词,如果目标容器无此依赖,就可能会出错)

2.3 runtime

  • runtime与compile比较相似,区别在于:runtime 跳过了编译阶段打包时通常需要包含进去。

2.4 test

  • 在一般的编译和运行时都不需要,它们只有在测试编译阶段测试运行阶段可用
  • 不会被打包到项目jar包中;
  • 同时,如果项目A依赖于项目B,项目B中的test作用域下的依赖不会被继承。

2.5 system

  • 表示使用本地系统路径下的jar包,需要和一个systemPath一起使用,如下:
<!--引用-->
<dependency>
	<groupId>xxxx</groupId>
	<artifactId>xxx</artifactId>
	<systemPath>${basedir}/lib/xxxxx.jar</systemPath>
	<scope>system</scope>
	<version>1.4.12</version>
</dependency>

2.6 import

  • import 只能在pom.xml文件的<dependencyManagement>中使用,从而引入其他的pom文件中引入依赖。

如:在Spring boot项目的POM文件中,我们可以通过在POM文件中继承 Spring-boot-starter-parent来引用Srping boot默认依赖的jar包,如下:

<!-- Inherit defaults from Spring Boot -->
<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.0.1.BUILD-SNAPSHOT</version>
</parent>
  • 但是,通过上面的方法:parent继承的方法只能继承一个 spring-boot-start-parent
  • 实际开发中,用户很可能需要继承自己公司的标准parent配置,这个时候可以使用 scope=import 来实现多继承。代码如下:
<dependencyManagement>
	 <dependencies>
		 <dependency>
			 <!-- Import dependency management from Spring Boot -->
			 <groupId>org.springframework.boot</groupId>
			 <artifactId>spring-boot-dependencies</artifactId>
			 <version>2.0.1.BUILD-SNAPSHOT</version>
			 <type>pom</type>
			 <scope>import</scope>
		</dependency>
	</dependencies>
</dependencyManagement>
  • 通过上面方式,就可以获取spring-boot-dependencies.2.0.1.BUILD-SNAPSHOT.pom文件中dependencyManagement配置的jar包依赖。
  • 如果要继承多个,可以在dependencyManagement中添加,如:
<dependencyManagement>
	<dependencies>
		<!-- Override Spring Data release train provided by Spring Boot -->
		<dependency>
			 <groupId>org.springframework.data</groupId>
			 <artifactId>spring-data-releasetrain</artifactId>
			 <version>Fowler-SR2</version>
			 <type>pom</type>
			 <scope>import</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-dependencies</artifactId>
			<version>2.0.1.BUILD-SNAPSHOT</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
	</dependencies>
</dependencyManagement>

X 参考文献

标签:总结,provided,依赖,boot,Maven,slf4j,org,scope
From: https://www.cnblogs.com/johnnyzen/p/17664153.html

相关文章

  • 【maven】idea运行项目的时候,因为依赖maven坐标是provided报错NoClassDefFoundError解
    1、查看报错的类的生命周期-基于在idea安装mavenhelper插件  2、在运行maven项目的入口新增配置项 ......
  • Python学习总结:类属性、类方法、self、cls
    转载:Python学习总结(五)类属性、类方法、self、cls_摩霄志在潜修羽的博客-CSDN博客......
  • UDS之时间参数总结篇
    UDS:(UnifiedDiagnosticService)统一诊断服务协议。之所以称为统一诊断服务,则是因为该协议是建立在各种传输方式之上的应用层协议,与底层所采用的通信介质都没有关系,该协议内容在ISO14229-1中定义,目前该协议版本已更新至2020版。 AddressingMode(AM)在发送诊断指令的过程......
  • Maven的安装与环境变量的配置
    Maven的安装与环境变量的配置1、下载安装maven2、配置环境变量在系统环境变量中加入MAVEN_HOME这个的路径就是maven的安装路径M2_HOME这个是maven目录下的bin目录中还要再path路径下配置:%MAVEN_HOME%\bin3、阿里云镜像的配置因为国内有墙,所以要使用aliyu......
  • 数字 IC 总结
    数字IC知识总结芯片衡量指标(PPA)Performance(性能)Power(功耗)Area(面积)吞吐率每秒传递的bit位数字IC设计流程前端(逻辑设计)需求分析:客户向fabless提出设计要求,fabless将其翻译为对芯片产品的技术需求。算法设计:使用高级编程语言如C++设计和优化芯片钟所使用的......
  • 15 CSS总结
    15CSS总结到此,css的知识就结束了,掌握这些知识,搞爬虫足够了。如果朋友还有兴趣可以去css其他学习网站去看看其他的一些属性用法,(菜鸟教程https://www.runoob.com/css/css-tutorial.html),以下是总结的知识点:......
  • Oracle10常见服务总结
    (1)OracleService数据库服务,这个服务会自动地启动和停止数据库。如果安装了一个数据库,它的缺省启动类型为自动。服务进程为ORACLE.EXE,参数文件initSID.ora,日志文件SIDALRT.log,控制台SVRMGRL.EXE、SQLPLUS.EXE。 (2)OracleTNSListener监听器服务,服务只有在数据库需要远程访问时才需要(无......
  • 操作系统总结
    1、硬件结构2、系统结构3、进程管理4、内存管理......
  • 免费好用的Diff和Merge工具大总结
    总结:比较下来:diffmerge和P4merge最好用,kdiff比较专业些,支持自动merge。一csdiff下载:http://www.componentsoftware.com/Products/CSDiff/index.htm特点:1)免费;2)需要安装;3)文件和文件夹比较;4)支持源代码,html和word文档;截图:1)初始界面 2)folder比较3)文件比较二diffmerge下载:http://sou......
  • vim命令总结
    1.删除字符 要删除一个字符,只需要将光标移到该字符上按下"x"。2.删除一行 删除一整行内容使用"dd"命令。删除后下面的行会移上来填补空缺。3.删除换行符 在Vim中你可以把两行合并为一行,也就是说两行之间的换行符被删除了:命令是"J"。4.撤销 如果你误删了过多的内容......