第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

查了一天資料,終于搞明白了Maven的依賴范圍

標(biāo)簽:
Java

最近看到Maven的依赖范围,之前的工作中一直在使用,但是其实并不是完全了解,查阅了很多资料,发现很多资料上介绍的都很模糊,没有具体的案例,因此写了两个module测试不同范围的依赖有什么影响。

1. Maven依赖范围说明

项目依赖范围可以如下表:

依赖范围(Scope) 对于编译classpath有效 对于测试calsspath有效 对于运行时classpath有效 说明
compile Y Y Y 默认依赖范围,例子Spring-core
test - Y - JUnit
provided Y Y - Servlet-api
runtime - Y Y JDBC驱动实现
system Y Y - 本地的,Maven仓库之外的类库文件
import - - - 通常用在dependencyManagement中

三种classpath可以分别理解为:

编译classpath: 代码的引用,也就是在src包下是否可以引用该代码

测试classpath: 测试引用,是都可以在单元测试用使用

运行classpath: 代码运行时可以引用,其他场景不能引用

2. 详细演示

2.1 compile说明

2.1.1 环境说明

假设有两个module,分别为module-amodule-b,module-b依赖module-a,

module-a的pom依赖为

<groupId>com.marco</groupId>
    <artifactId>module-a</artifactId>
    <version>1.0.0</version>

    <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.58</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

module-a中创建一个User类

public class User {
    private Long id;
    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

module-bpom文件为

		<groupId>com.marco</groupId>
    <artifactId>module-b</artifactId>
    <version>1.0.0</version>

    <dependencies>
        <dependency>
            <groupId>com.marco</groupId>
            <artifactId>module-a</artifactId>
            <version>1.0.0</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

module-b中的通过new方式创建对象演示代码

public class ModuleATest {
    public static void main(String[] args) {
        User user = new User();
        user.setId(1L);
        user.setName("小林同学");

        System.out.println(user);
    }
}

module-b中的通过反射方式创建对象演示代码

public class ModuleAReflectTest {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Class<?> userClass = Class.forName("com.marco.obj.User");
        Constructor<?> constructor = userClass.getConstructor();
        Object obj =  constructor.newInstance();
        System.out.println(obj);
    }
}
2.1.2 运行结果

通过new方式创建对象运行结果正常

通过反射方式创建User对象运行结果正常

image-20201031171016225

2.2 test说明

2.2.1 test环境配置

module-bmodule-a的依赖改成test

<groupId>com.marco</groupId>
    <artifactId>module-b</artifactId>
    <version>1.0.0</version>

    <dependencies>
        <dependency>
            <groupId>com.marco</groupId>
            <artifactId>module-a</artifactId>
            <version>1.0.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
2.2.2 运行结果

main方法中已经找不到了User类了,说明编译classPath已经找不到这个类

image-20201031164527832

test通过反射运行结果提示找不到类

image-20201031170915626

test中的方法未报错

image-20201031164721612

运行单元测试结果正常

image-20201031164802890

通过上面测试代码印证了上表中的依赖范围

2.3 provided说明

2.3.1 provided环境说明

修改module-b的pom依赖scope为provided

<groupId>com.marco</groupId>
    <artifactId>module-b</artifactId>
    <version>1.0.0</version>

    <dependencies>
        <dependency>
            <groupId>com.marco</groupId>
            <artifactId>module-a</artifactId>
            <version>1.0.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
2.3.2 运行结果

代码在idea是正常的,可以找到类

image-20201031165203282

运行结果报错,提示找不到类,

image-20201031165324374

这里我们把通过反射来创建User

image-20201031171122033

单元测试结果是正常的,就不贴了

2.4 runtime说明

2.4.1 runtime环境说明

module-b的POM文件中依赖scope改成runtime

<groupId>com.marco</groupId>
    <artifactId>module-b</artifactId>
    <version>1.0.0</version>

    <dependencies>
        <dependency>
            <groupId>com.marco</groupId>
            <artifactId>module-a</artifactId>
            <version>1.0.0</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
2.4.2 运行结果

正常new对象提示找不到该类

image-20201031171801292

通过反射得到的结果是正确的

image-20201031172612824

测试结果也是正确的

image-20201031172709237

2.6 import详细说明

import中的依赖范围不会对三种classpath产生实际的影响,一般只是用在dependencyManagement

3.总结

Maven的依赖范围最复杂的就是providedruntime

provided常用于编译和测试项目的时候有效,在运行时无效的场景。例如servlet-api,编译和测试的时候需要该依赖,但项目运行的时候,容易会提供,因此不需要重复引入。

runtime对于测试和运行的时候有效,但编译代码时无效。例如JDBC驱动实现,项目主代码中只需要提供JDBC接口,在测试运行时才需要实现具体的JDBC实现类。

其他依赖范围都相对简单,就不过多赘述了。

写了一天,各位大佬走过路过帮忙给个赞吧~~~

點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評(píng)論
  • 收藏
  • 共同學(xué)習(xí),寫下你的評(píng)論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消