Maven 依赖范围

Maven 依赖范围属性用于指定相对于不同生命周期阶段(构建,测试,运行时等)的依赖项可见性。 Maven 提供了六个范围,即compileprovidedruntimetestsystemimport

Table of Contents

1\. Compile Scope
2\. Provided Scope
3\. Runtime Scope
4\. Test Scope
5\. System Scope
6\. Import Scope
7\. Transitivity Resolution

Maven 依赖范围 – compile

这是 maven 默认范围构建测试运行项目需要具有compile范围的依赖项。

在大多数情况下,必须使用范围compile才能将import语句解析为您的 Java 类源代码。

<dependencies>
	<dependency>
		<groupId>log4j</groupId>
		<artifactId>log4j</artifactId>
		<version>1.2.14</version>
		<!-- You can ommit this because it is default -->
		<scope>compile</scope>
	</dependency>
</dependencies>

Maven 依赖范围 – provided

Maven 依赖范围provided构建和测试期间用于整个项目。 它们也需要运行,但是不应导出,因为依赖项将由运行时提供,例如,由 servlet 容器或应用服务器提供。

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

Maven 依赖范围 – runtime

不需要构建具有 maven 依赖范围runtime的依赖项,但它们是测试和运行项目的类路径的一部分。

<dependency>
    <groupId>com.thoughtworks.xstream</groupId>
    <artifactId>xstream</artifactId>
    <version>1.4.4</version>
    <scope>runtime</scope>
 </dependency>

Maven 依赖范围 – test

不需要使用 maven 依赖范围test来构建和运行项目。 需要它们来编译和运行单元测试

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

Maven 依赖范围 – system

具有system的依赖项与具有范围provided的依赖项相似。 唯一的区别是system依赖项不是从远程仓库中检索到的。 它们位于项目的子目录下,并从那里进行引用。 有关更多详细信息,请参见外部依赖项

<dependency>
  <groupId>extDependency</groupId>
  <artifactId>extDependency</artifactId>
  <scope>system</scope>
  <version>1.0</version>
  <systemPath>${basedir}\war\WEB-INF\lib\extDependency.jar</systemPath>
</dependency>

Maven 依赖范围 – import

import范围仅在dependencyManagement部分中的类型为pom的依赖项上受支持。 它在指定的 POM 的dependencyManagement部分中指示要用有效的依赖项列表替换的依赖项。

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>other.pom.group.id</groupId>
            <artifactId>other-pom-artifact-id</artifactId>
            <version>SNAPSHOT</version>
            <scope>import</scope>
            <type>pom</type>
        </dependency>   
    </dependencies>
</dependencyManagement>

Maven 依赖项可传递性解析

当您包含一个 maven 依赖项并且它具有它自己的其他依赖项(即传递性依赖项)时,您可能还想弄清楚这些传递性依赖项的范围。

让我们用一个简单的表来了解 maven 传递依赖项。 在此表中,如果在左列中将范围设置为依赖项,则在顶部行可传递依赖项将导致在其交点处列出的范围。

依赖项 编译 提供 运行 测试
compile compile runtime
provided provided provided
runtime runtime runtime
test test test

将我的问题放在评论部分。