企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# Maven 依赖范围 > 原文: [https://howtodoinjava.com/maven/maven-dependency-scopes/](https://howtodoinjava.com/maven/maven-dependency-scopes/) **Maven 依赖范围**属性用于指定相对于不同生命周期阶段(构建,测试,运行时等)的依赖项可见性。 Maven 提供了六个范围,即`compile`,`provided`,`runtime`,`test`,`system`和`import`。 ```java 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 类源代码。 ```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 容器或应用服务器提供。 ```java <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>3.0.1</version> <scope>provided</scope> </dependency> ``` ## Maven 依赖范围 – `runtime` 不需要构建具有 maven 依赖范围`runtime`的依赖项,但它们是**测试和运行**项目的类路径的一部分。 ```java <dependency> <groupId>com.thoughtworks.xstream</groupId> <artifactId>xstream</artifactId> <version>1.4.4</version> <scope>runtime</scope> </dependency> ``` ## Maven 依赖范围 – `test` 不需要使用 maven 依赖范围`test`来构建和运行项目。 需要它们来**编译和运行单元测试**。 ```java <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> ``` ## Maven 依赖范围 – `system` 具有`system`的依赖项与具有范围`provided`的依赖项相似。 唯一的区别是`system`依赖项不是从远程仓库中检索到的。 它们位于项目的子目录下,并从那里进行引用。 有关更多详细信息,请参见[外部依赖项](//howtodoinjava.com/maven/maven-dependency-management/#external-dependency)。 ```java <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`部分中指示要用有效的依赖项列表替换的依赖项。 ```java <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` | – | 将我的问题放在评论部分。 学习愉快!