3.6.Maven-依赖管理-依赖范围

一.依赖范围:

在pom.xml配置文件中所配置的依赖默认情况下是可以在任何地方使用的,这个地方包括main文件夹下、test文件夹下,也可以在这个项目打包的时候将这个jar包打包进去,这是默认情况。

然而在Maven项目中可以通过标签scope来控制依赖的作用范围,也就是说可以通过scope的配置来控制当前依赖是在主程序范围内有效、还是测试程序范围内有效,scope的取值如下图:

如上图,compile是默认值,可以不写,该值意味着在主程序、测试程序以及打包(运行)均有效,在大多项目开发中scope的取值都是默认值compile。其他同理。

上图中junit单元测试,仅仅在测试程序范围内有效。


二.例一:

以上述图片的maven-project01为例,

在pom.xml文件下没有设置依赖范围,那就是默认的compile,意味着该依赖的作用范围为主程序、测试程序以及打包(运行),

首先验证在主程序内是否生效,打开main包下的主程序,如下图:

如上图,判断main包下主程序中依赖是否生效,主要看能不能使用该依赖的接口或者类即可,logback依赖提供了接口Logger,如下图:

如上图,输入Logger系统会有提示slf4j包或者logback包下(注意不是logging包下)的类或者接口,说明依赖生效。

接下来看测试程序范围内是否有效,在test包下的java目录下创建一个类,如下图:

如上图,现创建一个方法来判断依赖是否生效,如下图:

如上图,输入Logger系统会有提示slf4j包或者logback包下(注意不是logging包下)的类或者接口,说明依赖生效。

最后要判断项目打包时该依赖是否参与,如下图:

如上图,首先在pom.xml文件中添加一个打包插件:

XML 复制代码
<!--打包插件-->
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.4.1</version>
                <configuration>
                    <descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals><goal>single</goal></goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

其实Maven也会提供一个打包的功能(package),但是Maven提供的打包的插件只能将当前项目的资源打包进去,所依赖的JAR包是不会一起打包进去的,如下图:

接下来进行打包(package)操作,判断logback的依赖会不会打包进去,打开Maven面板,点击打包(package)后就会进行打包操作,打包后的结果如下图:

如上图,打包好的JAR包会放在target目录下,在磁盘中打开target目录,如下图:

如上图,现在看打包好的JAR包中是否包含logback的依赖,选择有dependencies的JAR包,如下图:

用记事本打开:

如上图,可知ch->qos->logback下的依赖是有的,这就说明scope配置为默认值compile时在任何范围内都是有效的,包含主程序、测试程序、打包(运行)。


三.例二:

scope配置为默认值compile时,如下图:

main包下的主程序和test包下的java包下的程序分别引入slf4j包下的Logger(也可以引入logback包下的,但不能引入logging包下,因为logging包不是特有的依赖),如下图:

接下来设置scope的值为test并刷新Maven,如下图:

如上图,

首先打开main包下的主程序,如下图:

如上图,发现main包下的主程序已经不能使用该依赖了,

再打开test包下的java包下的程序,如下图:

如上图,发现test包下的java包下的程序是可以使用该依赖的,这就是scope设置为test的效果(主程序不能使用,测试程序可以使用)。

最后测试打包时这个logback现在还会不会参与打包,先把target目录删掉,再进行Maven面板上的打包(package)操作,结果如下图:

如下图,有了一个新的target包:

打开磁盘目录:

用记事本打开有dependencies的JAR包,其中是否包含logback的依赖,如下图:

如上图,可知没有包含logback的依赖,所以打包时没有生效。

其他的scope值同理,就不演示了。


相关推荐
huangdong_18 小时前
电商平台图片URL原图转换技术深度解析:从缩略图到高清原图的完整方案
java·后端·spring
記億揺晃着的那天18 小时前
Java 调用外部 Go 程序的实践:ProcessBuilder 在生产环境中的应用
java·golang·processbuilder
JAVA面经实录91718 小时前
Java 数据结构与算法 (终极完整学习文档)
java·数据结构·算法
JAVA面经实录91719 小时前
操作系统面试题
java·服务器·数据库·计算机网络·面试
一杯奶茶¥20 小时前
基于springboot的失物招领管理系统带万字文档 校园失物招领管理系统 失物认领管理系统java springboot vue
java·vue.js·spring boot·java项目
不能只会打代码20 小时前
边缘视频分析平台的架构设计与性能优化——从750ms到190ms的调优之路
java·spring boot·redis·性能优化·边缘计算·物联网竞赛
小刘|20 小时前
Spring AI Alibaba 集成和风天气 API 实战
java·服务器·前端
KANGBboy20 小时前
java知识五(继承)
java·开发语言
AI人工智能+电脑小能手20 小时前
【大白话说Java面试题 第117题】【并发篇】第17题:线程有几种状态,之间如何转换?
java·开发语言·面试
DIY源码阁20 小时前
JavaSwing饮品管理系统 - MySQL版
java·数据库·mysql·eclipse