Maven依赖中的scope总结

发布时间 2023-06-13 11:56:57作者: 过情关

scope是限制Dependency的作用范围的, 影响maven项目在各个生命周期时导入的package的状态。

自2.0.9版本发布后,新增了一种:import,现在已经有了6种scope。

下面分别来说明:

compile:不声明scope元素的情况下的默认值。compile表示被依赖包需要参与当前项目的编译,包括后续的测试,运行周期也参与其中,是一个比较强的依赖。打包的时候通常需要包含进去。

provided:这个scope假定对应的依赖会由运行这个应用的JDK或者容器来提供。最好的例子就是servletAPI。和数据库连接jdbc,该依赖理论上可以参与编译,测试,运行等周期,但是不会被打包到最终的artifact中。

    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.1</version>
        <scope>provided</scope>
    </dependency>
    例如:
       <!-- 因为在代码编译期可能需要使用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>

runtime:这种作用域的依赖只会在测试和运行期可用,不需要参与项目的编译。这些依赖将会被打包到最终的artifact中。与compile相比,跳过了编译而已。典型的例子是:JDBC驱动,适用运行和测试阶段。比如你有一个基于web的应用需要在运行时才访问MySQL数据库。你的代码仅仅是基于JDBC API来编写,也就是说只在编译期需要JDBC API JAR,而在运行的时候才需要JDBC的驱动实现。

test:只参与测试工作过程中的测试和执行,典型的例子就是:JUnit,但是这些依赖不会被打包到最终的artifact中。

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

system:和provided scope很像。唯一的区别在于,在system scope中,你需要告诉Mave如何去找到这个依赖(方法是通过systemPath属性来指定依赖的路径),如果你要引用的依赖在Maven仓库中不存在时,就可以用这个scope。不推荐使用system依赖。

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

import:从其它的pom文件中导入依赖设置,它只在在dependencyManagement元素下使用,表示从其他pom中导入dependency的配置。