Maven中的dependency的scope作用域

6,009 阅读2分钟

Dependency scope是用来限制Dependency作用范围的,影响Maven项目在各个声明周期导入的package状态。

配置示例如下:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.2.9.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

compile

这是默认作用域。compile作用域范围的依赖项在所有情况下都是有效的,包括编译、运行和测试。

provided

这个作用域表示该依赖项有JDK或运行容器在运行时提供。也就是说,该依赖项在测试和编译下才会用到。

runtime

这个作用域表示该依赖项在运行时需要,在编译的时候不需要。在测试下,该依赖项也会被使用。

test

这个作用域表示该依赖项只在测试时有用,在编译和运行时不会被用到。

system

表示该依赖项是由我们提供的,不需要maven到仓库中寻找。使用的时候需要和另一个标签systemPath配合使用,这个标签表示该依赖项在系统中的位置,使用的是绝对路径。官网给出一个关于使用JDK的tools.jar的例子。

<dependency>
  <groupId>sun.jdk</groupId>
  <artifactId>tools</artifactId>
  <version>1.5.0</version>
  <scope>system</scope>
  <systemPath>${java.home}/../lib/tools.jar</systemPath>
</dependency>

import

我们知道通过继承一个项目的依赖,我们可以在子项目中很好的申明需要使用父项目的dependencyMangement中定义的依赖项。但是每一个项目只能申明唯一的一个父项目,那么在某些时候就会限制我们项目的建立。

为此,Maven为我们提供了一种方法,那就是通过设置依赖项的socpe为import。注意,这种方式只在Maven2.0.9以上的版本才生效。

下面为父项目artifactA的pom.xml文件:

<project>  
       ...  
       <groupId>groupA</groupId>  
       <artifactId>artifactA</artifactId>  
       <version>1.0</version>  
       <packaging>pom</packaging>  
       <dependencyManagement>  
              <dependencies>  
                     <dependency>  
                            <groupId>test</groupId>  
                            <artifactId>A</artifactId>  
                            <version>1.0</version>  
                     </dependency>  
                     <dependency>  
                            <groupId>test</groupId>  
                            <artifactId>B</artifactId>  
                            <version>1.1</version>  
                     </dependency>  
                     <dependency>  
                            <groupId>test</groupId>  
                            <artifactId>C</artifactId>  
                            <version>1.2</version>  
                     </dependency>  
                     <dependency>  
                            <groupId>test</groupId>  
                            <artifactId>D</artifactId>  
                            <version>1.3</version>  
                     </dependency>  
              </dependencies>  
       </dependencyManagement>  
       ...  
</project> 

如果使用之前的继承机制,那么这个时候子项目artifactB的pom.xml文件是这样定义的:

<project>  
       ...  
       <parent>  
              <groupId>groupA</groupId>  
              <artifactId>artifactA</artifactId>  
              <version>1.0</version>  
       </parent>  
    
       <groupId>groupA</groupId>  
       <artifactId>artifactB</artifactId>  
       <version>1.0</version>  
       <packaging>pom</packaging> 
    
       <dependencies>  
              <dependency>  
                     <groupId>test</groupId>  
                     <artifactId>A</artifactId>  
              </dependency>  
              <dependency>  
                     <groupId>test</groupId>  
                     <artifactId>D</artifactId>  
                     <scope>runtime</scope>  
              </dependency>  
       </dependencies>  
       ...  
</project>  

按照import方式,是这样定义的:

<project>  
       ...  
       <groupId>groupA</groupId>  
       <artifactId>artifactB</artifactId>  
       <version>1.0</version>  
       <packaging>pom</packaging>  
    
       <dependencyManagement>  
              <dependencies>  
                     <dependency>  
                            <groupId>groupA</groupId>  
                            <artifactId>artifactA</artifactId>  
                            <version>1.0</version>  
                            <type>pom</type>  
                            <scope>import</scope>  
                     </dependency>  
              </dependencies>  
       </dependencyManagement>  
    
       <dependencies>  
              <dependency>  
                     <groupId>test</groupId>  
                     <artifactId>A</artifactId>  
              </dependency>  
              <dependency>  
                     <groupId>test</groupId>  
                     <artifactId>D</artifactId>  
                     <scope>runtime</scope>  
              </dependency>  
       </dependencies>  
       ...  
   
</project>