<scope>提供的</scope>依赖和网络逻辑?

  • 本文关键字:scope 网络 依赖 java maven
  • 更新时间 :
  • 英文 :


如果这个问题指的是一个常见的问题,我很抱歉,但我发现这很抽象,并且不能真正为它编造一个好的谷歌搜索词。

我正在尝试理解并找到 maven 中提供的依赖项的用例。我的想法是这样的:

假设,我有 3 个 maven 项目:A、B、C

  • B 是一个 api,就像 JPA 一样
  • C是为了论证而说,冬眠
  • A 提供了对 B 的依赖关系

如果我在同一个 Weblogic 域/服务器上部署 A 和 C。A 会将类路径上的 C 视为 B 的实现吗?

如果不是,那么对于提供的作用域依赖项来说,什么是好的用例?

提前致谢

正如 maven 文档对提供的范围所述:

这很像编译,但表明您期望 JDK 或 容器,以在运行时提供依赖项。例如,当 为 Java 企业版构建 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 项目中添加带有作用域编译的 EJB 依赖项。因为如果你这样做了,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-file 中,并且你将确保这个模块在运行时自己可用。

最新更新