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


相关推荐
范什么特西2 小时前
狂神报错页面设置
java·tomcat
架构师沉默2 小时前
AI 真的会取代程序员吗?
java·后端·架构
Memory_荒年3 小时前
ReentrantLock 线程安全揭秘:从“锁”到“重入”的魔法
java·后端·源码
L0CK3 小时前
秒杀异步下单业务逻辑梳理
java
zuoerjinshu3 小时前
【spring专题】编译spring5.3源码
java·后端·spring
JavaGuide3 小时前
鹅厂面试:SELECT * 一定导致索引失效?常见索引失效场景有哪些?
java·数据库·后端·mysql·大厂面试
QuZero3 小时前
Java `volatile` and Memory Model
java·jvm
me8323 小时前
【Java】解决Maven多模块父POM加载失败+IDEA无法新建Java类问题
java·maven·intellij-idea
亚马逊云开发者3 小时前
RAG 向量存储月费 800 刀?S3 Vectors 直接砍到 100 出头
java