java – jars是否应该“提供”依赖项?

前端之家收集整理的这篇文章主要介绍了java – jars是否应该“提供”依赖项?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我们正在构建一个将在Websphere上运行的耳朵,其中提供了j2ee.jar.

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

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

什么是最好的方法? util.jar应该提供依赖关系,即使它只是一个简陋的jar?或者jar应该只有编译依赖?

最佳答案
JAR可以提供依赖关系…但是依赖于它的用户需要确保实际上将在运行时提供此依赖关系.由于提供的依赖项不可传递,因此它们还需要确保它们不依赖于它进行编译;但如果他们这样做,最好的做法是使用编译(或提供)作用域明确声明它,而不是依赖某种形式的传递性(查看Dependency Plugin的analyze目标,例如,使用的列表,但未申报,依赖).

>在创建可执行JAR时,JAR中提供的依赖项非常有用.考虑构建一个超级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依赖于Java EE Web应用程序类中的JAR是很奇怪的.)

猜你在找的Java相关文章