maven作用域
在 Maven 中,<scope> 元素用于指定依赖项的作用域。它控制了依赖项在不同阶段的可见性和包含方式。<scope> 元素有以下常用的取值:
compile:默认的作用域,表示依赖项在编译、测试和运行时都可见,也会被打包到最终构建的应用程序中。
provided:表示依赖项在编译和测试时可见,但在运行时由目标环境提供。在打包过程中,该依赖项不会被包含在最终构建的应用程序中。
runtime:表示依赖项在运行时可见,但在编译和测试阶段不可见。在打包过程中,该依赖项不会被包含在最终构建的应用程序中。
test:表示依赖项仅在测试阶段可见,不会被包含在最终构建的应用程序中。
system:表示依赖项不在任何Maven存储库中但存在于本地机器上的依赖项。
compile
在Apache Maven中,<scope>元素用于定义依赖项的范围。当您将依赖项声明为<scope>compile</scope>时,这意味着该依赖项将在编译、测试和运行时的所有环境中都可用。
这是Maven中最常用的==默认依赖范围==,如果您不指定范围,则依赖项将默认为compile范围。
例如,在您的pom.xml文件中声明一个具有compile范围的依赖项可以如下所示:
<dependencies>
<dependency>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<scope>compile</scope>
</dependency>
</dependencies>
这样声明的依赖项将在编译、测试和运行时的所有阶段都可用,并将包含在最终构建的输出中。
需要注意的是,compile范围的依赖项==不会包含在其他依赖项的传递性依赖中==。如果您希望将依赖项包含在其他模块中的依赖关系中,您可能需要将其声明为provided或runtime范围,具体取决于您的需求。
provided
在Apache Maven中,<scope>provided</scope>用于定义依赖项的范围。当您将依赖项声明为provided范围时,这意味着该依赖项在编译和测试阶段可用,但在运行时由目标环境(如应用服务器)提供。
==使用provided范围的典型情况是在开发Web应用程序时,将Servlet容器(如Tomcat)提供的Servlet API作为provided依赖项。==
在编译和测试代码时,您需要这个依赖项来进行开发和测试,但在部署到Servlet容器时,容器本身将提供Servlet API,因此您不需要将其打包到最终的部署包中。
以下是将依赖项声明为provided范围的示例:
<dependencies>
<dependency>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<scope>provided</scope>
</dependency>
</dependencies>
请注意,provided范围的依赖项==在编译和测试期间对项目是可见的,但在运行时不会包含在构建的输出中==。这意味着您需要确保目标环境在运行时能够提供所需的依赖项。
使用provided范围可以帮助减小最终部署包的大小,并确保项目在目标环境中的运行正常。
runtime
在Apache Maven中,<scope>runtime</scope>用于定义依赖项的范围。当您将依赖项声明为runtime范围时,这意味着该依赖项在运行时是必需的,但在编译和测试阶段并不需要。
使用runtime范围的典型情况是当您需要在项目的运行时环境中使用某个依赖项,但在编译和测试代码时并不需要该依赖项。这通常是因为该依赖项包含了运行时所需的类或库,但对于编译和测试目的而言,它不是必需的。
以下是将依赖项声明为runtime范围的示例:
<dependencies>
<dependency>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<scope>runtime</scope>
</dependency>
</dependencies>
在这种情况下,该依赖项将在编译和测试阶段不可见,但在运行时将包含在构建的输出中,并在项目的运行时环境中使用。
使用runtime范围适用于那些只在运行时需要的依赖项,例如数据库驱动程序或特定的运行时库。它可以帮助减小编译和测试的依赖项集,并确保项目在运行时能够访问所需的依赖项。
test
在Apache Maven中,<scope>test</scope>用于定义依赖项的范围。当您将依赖项声明为test范围时,这意味着该依赖项仅在编译和执行测试代码时可用,而在项目的运行时阶段不会包含在构建的输出中。
==使用test范围的依赖项通常是为了满足测试代码的依赖关系,例如单元测试或集成测试。==
这些依赖项只需要在编译和运行测试代码时才需要,而在实际的应用程序运行时并不需要。
以下是将依赖项声明为test范围的示例:
<dependencies>
<dependency>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<scope>test</scope>
</dependency>
</dependencies>
使用test范围的依赖项不会包含在最终构建的输出中,因为这些依赖项仅用于测试目的。这有助于保持最终构建包的轻量性,并确保项目在运行时不受测试代码的影响。
==请注意,test范围的依赖项不会传递给其他依赖项,即它们不会成为其他依赖项的传递性依赖。==
这意味着您需要明确地将任何在测试代码中使用的依赖项声明为test范围,以确保它们在测试过程中可用。
使用test范围的依赖项有助于确保测试代码的依赖关系得到满足,并促进了良好的测试实践。
system
在Apache Maven中,<scope>system</scope>用于定义依赖项的范围之一。当您将依赖项声明为system范围时,您需要使用<systemPath>元素来指定依赖项在本地文件系统上的路径。
使用system范围的依赖项意味着该依赖项不会从任何Maven存储库中获取,而是从本地系统中的特定位置获取。这通常用于引用本地系统上的某些特定库或JAR文件,而不是从远程存储库下载。
以下是将依赖项声明为system范围的示例:
<dependencies>
<dependency>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<scope>system</scope>
<systemPath>/path/to/dependency.jar</systemPath>
</dependency>
</dependencies>
在上述示例中,通过指定<systemPath>元素,您可以提供依赖项在本地系统上的路径。Maven将使用该路径来定位依赖项并将其包含在项目的构建中。
需要注意的是,==使用system范围要谨慎,因为它绕过了Maven的依赖项解析和管理机制==。这可能导致构建在不同环境中的不一致性,并增加项目的维护难度。因此,应该仅在确实需要引用本地系统上的特定依赖项时才使用system范围,并确保依赖项在所有构建环境中都正确可用。