【问题标题】:Should jars have "provided" dependencies?jars 是否应该“提供”依赖项?
【发布时间】:2016-11-24 15:21:17
【问题描述】:

我们正在构建一个可以在提供 j2ee.jar 的 Websphere 上运行的耳朵。

现在我们遇到了一个 ejb(称为 ejb.jar)依赖于另一个依赖于 j2ee.jar 的 jar(称为 util.jar)的情况。

如果将 util.jar 的 pom 中的 j2ee.jar 标记为“provided”,则 ejb.jar 将不会构建,因为provided 不具有传递性。如果我们把它标记为“编译”,它可能会成为ear的编译依赖,除非我们覆盖作用域。

最好的方法是什么? util.jar 是否应该提供依赖项,即使它只是一个不起眼的 jar?还是 jar 应该只有编译依赖?

【问题讨论】:

  • 假设您使用的是基于 ecipse 的 IDE,您有 added 项目的 WebSphere 或 J2EE 兼容运行时吗?
  • 我看到您正在使用 maven 构建,我认为 this 是添加关联运行时 jar 的等效方式
  • @Lightbeard 感谢您的 cmets,但这与在 IDE 中构建无关,也与将依赖项放入本地存储库无关。这纯粹是关于如果在传递 jar 中使用“提供的”依赖项,如何以有用且正确的方式构造 pom 的问题。
  • 来自maven's docs:“在为Java Enterprise Edition 构建Web 应用程序时,您需要将Servlet API 和相关Java EE API 的依赖设置为提供的范围”
  • @Lightbeard 谢谢,但我已经知道了。我说的是 jars 中提供的依赖项(不是在 wars/ears 中,它们显然很有用)

标签: java maven jakarta-ee jar


【解决方案1】:

JAR 可以提供依赖项...但是对其有依赖项的用户需要确保该依赖项实际上将在运行时提供。由于提供的依赖项是不传递的,因此它们还需要确保它们不依赖于它进行编译;但如果他们这样做,最好的做法是在编译(或提供)范围内显式声明它,并且依赖某种形式的传递性(查看依赖插件的analyze目标,例如,列出使用但未声明的依赖项)。

  • 在创建可执行 JAR 时,在 JAR 中提供的依赖关系可能很有用。考虑构建一个 uber-jar(一个包含所有依赖项的类的 JAR):您可能想说一个特定的依赖项不应该最终出现在 uber-jar 中,因为启动它的容器将提供它在运行时。
  • 此外,JAR 可能需要依赖项来编译其代码,但实际上并不需要它来运行;例如,考虑声明 maven-plugin-annotations as a provided dependency 的 Maven 插件,因为它们只需要构建注释。
  • 最后一点,有些 JAR 知道它们将在哪个上下文中使用:例如 Spring WebMVC,当然依赖于 Servlet API 进行编译,但在运行时,它知道它将在 Java EE 上下文中使用,并且 Servlet API 将由 Java EE 服务器提供。

根据经验,除了上述情况,您可能不希望在 JAR 项目中提供 JAR 依赖项:应该由客户端决定您的某些编译时依赖项是否是将为他们的具体情况提供,并让客户覆盖范围。作为图书馆作者,您并不真正了解您的图书馆将如何被使用。

在您的特定情况下,由于 ejb.jar 实际上需要 j2ee.jar 进行编译,因此最好在编译时声明该依赖关系,甚至在您的情况下使用提供的范围,无论 util.jar 有什么范围设置为j2ee.jar。 (我会注意到,实用 JAR 依赖于来自 Java EE Web 应用程序类的 JAR 是很奇怪的。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 2016-10-16
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    相关资源
    最近更新 更多