美文网首页
Maven笔记—— 依赖作用域 scope

Maven笔记—— 依赖作用域 scope

作者: 憩在河岸上的鱼丶 | 来源:发表于2022-10-07 17:50 被阅读0次

1.Maven中的依赖作用范围概述

Maven中使用 scope 来指定当前包的依赖范围和依赖的传递性。常见的可选值有:compile, provided, runtime, test, system 等。scope 主要是用在 pom.xml 文件中的依赖定义部分,例如:

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>3.2.1.RELEASE</version>
            <scope>test</scope>
        </dependency>

2.scope各种取值详解

scope取值 有效范围(compile, runtime, test) 依赖传递 例子
compile all spring-core
provided compile, test servlet-api
runtime runtime, test JDBC驱动
test test JUnit
system compile, test

正如上表所示,

compile :为默认的依赖作用范围。如果在定义依赖关系的时候,没有明确指定依赖作用范围的话,则默认采用该依赖作用范围。此种依赖,在编译、运行、测试时均有效。

provided :在编译、测试时有效,但是在运行时无效。例如:servlet-api.jar,编译时需要继承HttpServlet,自然需要引入该jar包,但运行项目时,Servlet容器即Tomcat已经提供该jar包,就不需要Maven重复地引入一遍了

<dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.1</version>
        <scope>provided</scope>
</dependency>

runtime :在运行、测试时有效,但是在编译代码时无效。例如:JDBC驱动实现mysql-connector-java.jar,项目代码编译只需要JDK提供的JDBC接口,即java.sql.xx包,只有在测试或运行项目时才需要实现上述接口的具体JDBC驱动即com.mysql.jdbc.Driver

<!-- 因为在代码编译期可能需要使用JDBC API(例如:重写数据源连接方式),所以作用域设置为provided ,        
而在运行的时候才需要JDBC的驱动才可以。所以下面的数据库连接作用域一般都设置为runtime-->         
<dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-jdbc</artifactId>
             <scope>provided</scope>
</dependency>         
<!-- 数据库连接驱动-->         
<dependency>
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>
             <scope>runtime</scope>
</dependency>

test :只在测试时有效,例如:JUnit。

<dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
        <scope>test</scope>
</dependency>

system :在编译、测试时有效,但是在运行时无效。和provided的区别是,使用system范围的依赖时必须通过systemPath元素显式地指定依赖文件的路径。由于此类依赖不是通过Maven仓库解析的,而且往往与本机系统绑定,可能造成构建的不可移植,因此应该谨慎使用。systemPath元素可以引用环境变量。例如:

<dependency>
        <groupId>javax.sql</groupId>
        <artifactId>jdbc-stdext</artifactId>
        <version>2.0</version>
        <scope>system</scope>
        <systemPath>${java.home}/lib/rt.jar</systemPath>
</dependency>

相关文章

网友评论

      本文标题:Maven笔记—— 依赖作用域 scope

      本文链接:https://www.haomeiwen.com/subject/mlubartx.html