【问题标题】:Where is the "right" place to put WAR dependencies?放置 WAR 依赖项的“正确”位置在哪里?
【发布时间】:2019-08-09 17:07:49
【问题描述】:
我正在为现有项目创建构建脚本。他们所有的 EAR 文件都是(手动)构建的,他们这样做的方式是将 WAR 的 JAR 依赖项放入 EAR lib 文件夹中。 WAR 文件的WEB-INF/lib 文件夹为空。当我使用 gradle 构建时,它将 WAR 的 JAR 依赖项放入 WEB-INF/lib 文件夹中,而 EAR lib 文件夹中没有任何内容。
似乎两者都可以工作,而且(在我看来)更合乎逻辑的路径是将 WAR 依赖项放在WEB-INF/lib 中。有没有首选或更正确的方法?
【问题讨论】:
标签:
java
gradle
jakarta-ee
websphere
【解决方案1】:
如果您在 EAR 中只有一个 WAR 文件,那么我肯定会推荐使用 WEB-INF/lib。此外,我建议直接部署 WAR 而不使用 EAR 文件,因为这样可以消除一层不必要的复杂性。
您希望将依赖项 JAR 放在 EAR 中的情况是,当您有多个需要相同依赖项的 WAR 文件时。然后,您可以通过与应用程序中的所有 WAR 共享相同的依赖项来节省空间。
希望这会有所帮助!
【解决方案2】:
正如您所指出的,如果它是一致的,无论是技术上的工作 - 假设 EAR 只包含一个 Web 模块,真正需要的是将它们全部放在一个地方,因为 EAR 中的东西不能“看到”默认 Java EE 类加载配置下的 WAR 中的内容。
不过,从概念上讲,您是正确的 - 将 WAR 使用的所有内容都放在 WAR 本身中,而不是将其放在其他空置的 EAR 中,这样会更加优雅和简洁。虽然现在没什么大不了的,但如果您将应用程序扩展到多个模块(Web 或 EJB)就变得很重要,因为将内容放在 EAR/lib 中会消除您管理跨模块的多个依赖项的能力。如果您在 WAR1 中需要一个版本的库,而在 WAR2 中需要不同版本的库,那么如果您在 EAR 级别打包所有内容,这是不可能的。