Java 罐子里应该有「;“提供”;依赖关系?

Java 罐子里应该有「;“提供”;依赖关系?,java,maven,jakarta-ee,jar,Java,Maven,Jakarta Ee,Jar,我们正在构建一个将在提供j2ee.jar的Websphere上运行的ear 现在我们有一种情况,一个ejb(称为ejb.jar)依赖于另一个依赖于j2ee.jar的jar(称为util.jar) 如果将util.jar的pom中的j2ee.jar标记为“提供”,则不会生成ejb.jar,因为提供的不是可传递的。如果我们将其标记为“compile”,它可能成为ear的编译依赖项,除非我们覆盖范围 最好的方法是什么?util.jar是否应该提供依赖项,即使它只是一个普通的jar?或者JAR应该只有编

我们正在构建一个将在提供j2ee.jar的Websphere上运行的ear

现在我们有一种情况,一个ejb(称为ejb.jar)依赖于另一个依赖于j2ee.jar的jar(称为util.jar)

如果将util.jar的pom中的j2ee.jar标记为“提供”,则不会生成ejb.jar,因为提供的不是可传递的。如果我们将其标记为“compile”,它可能成为ear的编译依赖项,除非我们覆盖范围


最好的方法是什么?util.jar是否应该提供依赖项,即使它只是一个普通的jar?或者JAR应该只有编译依赖项吗?

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

  • 在创建可执行JAR时,JAR中提供的依赖项非常有用。考虑一个uber jar的构建(一个jar,其中包含了它所有的依赖项):你可能想说一个特定的依赖项不应该在uber jar中结束,因为它启动的容器将在运行时提供它。
  • 此外,JAR可能需要依赖项来编译其代码,但实际上并不需要它来运行;例如,考虑Maven插件,因为它们只需要创建注释。
  • 最后一点,有些JAR对它们将在哪个上下文中使用有很好的想法:例如,SpringWebMVC当然依赖于ServletAPI进行编译,但在运行时,它知道它将在JavaEE上下文中使用,ServletAPI将由JavaEE服务器提供
不过,根据经验,除了上述情况外,您可能不希望在JAR项目中提供JAR依赖项:应该由客户机决定是否为特定情况提供您的一些编译时依赖项,并让客户机覆盖范围。作为一名图书馆作家,你并不知道你的图书馆将如何被使用


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

假设您使用的是基于ecipse的IDE,您是否有一个与WebSphere或J2EE兼容的项目运行时?我看到您正在使用maven构建,我认为这是添加关联运行时的等效方法jars@Lightbeard感谢您的评论,但这并不是关于在IDE中构建,也不是关于将依赖项放入本地存储库。这纯粹是关于如果在可传递的JAR中使用“提供的”依赖项,如何以有用且正确的方式构造POM的问题。From:“在为Java Enterprise Edition构建web应用程序时,您应该将对Servlet API和相关Java EE API的依赖项设置为提供的范围”@Lightbeard谢谢,但我已经知道了。我所说的是JAR中提供的依赖关系(不是在WAR/EAR中,它们显然很有用)