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值同理,就不演示了。


相关推荐
小强库计算机毕业设计40 分钟前
SpringBoot+Vue3 学生宿舍管理系统实战
java·spring boot·后端·vue·学生宿舍管理系统
李冰然1 小时前
深入Java集合框架:HashMap源码解析(JDK 8)
java
人道领域2 小时前
【0-1的agent进阶篇】RAG:从Embedding到检索增强生成的底层逻辑
java·embedding·agent·rag
桦说编程2 小时前
盘点并发集合里那些容易误判的行为
java·后端·性能优化
IT爱学堂3 小时前
java版数据结构和算法+AI算法和技能学习指南
java·开发语言
evans在进步4 小时前
LeetCode 394:字符串解码——Java 单栈模拟与嵌套解析详解
java·python·leetcode
AI人工智能+电脑小能手4 小时前
大白话说Java设计模式-17-装饰器模式(源码剖析篇)
java·spring·设计模式·装饰器模式·源码分析·io流
m0_547486665 小时前
《Java程序设计与实践 》全套PPT课件2026
java·开发语言
土司大王5 小时前
LeetCode hto100——字母异位词分组
java·算法·leetcode
码匠许师傅5 小时前
【C++ 面试真题】聊聊 C++ 中的 lambda 表达式
java·c++·面试