1 回答
TA贡献1812条经验 获得超5个赞
正如Maven 文档规定的范围所提供的:
这很像 compile,但表明您希望 JDK 或容器在运行时提供依赖项。例如,在为 Java Enterprise Edition 构建 Web 应用程序时,您可以将对 Servlet API 和相关 Java EE API 的依赖项设置为提供的范围,因为 Web 容器提供这些类。此范围仅在编译和测试类路径上可用,并且不可传递。
那里已经提到了一个用例:在构建稍后要部署在 JavaEE 应用程序服务器上的 JavaEE 应用程序时,应用程序服务器提供了 javaEE 实现。
因此,要告诉 Maven 您在编译时需要此依赖项但稍后未打包到项目中,您将使用提供的范围,例如:
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
另一个用例是构建使用不同容器类型的 JavaEE 应用程序。有一个JavaEE EJB 和一个 Web 容器,您需要确保您的类不会被打包/加载到错误的容器中,甚至不会被加载到两个容器中,因为这可能会给您的应用程序和类加载器带来各种问题。
假设您正在构建一个包含 EJB 模块和 Web 模块的应用程序,并且您希望 EJB 在 EJB 容器中运行。您还希望在 web 模块中使用您的 EJB。由于 EJB 在 EJB 容器中运行,而 Web 模块在 web 容器中运行,因此您不能简单地在您的 Web 项目中添加具有作用域 compile 的 EJB-Dependency。因为如果你这样做,maven 会将 ejb 打包到 war 文件中,而 EJB 最终会出现在 web 容器中。
因此,在您的 Web 应用程序中,您可以将依赖项添加为
<artifactId>my-web</artifactId>
<packaging>war</packaging>
<dependency>
<groupId>your.group</groupId>
<artifactId>my-ejb</artifactId>
<type>ejb</type>
<scope>provided</scope>
</dependency>
这样你就告诉 maven 你想使用你的 EJB 模块,但它不应该把它打包到你的 war 文件中,你将确保这个模块在运行时自己可用。
添加回答
举报