"right" 放置 WAR 依赖项的地方在哪里?

Where is the "right" place to put WAR dependencies?

我正在为现有项目创建构建脚本。他们所有的 EAR 文件都是(手动)构建的,他们这样做的方式是将 WAR 的 JAR 依赖项放入 EAR lib 文件夹中。 WAR 个文件的 WEB-INF/lib 文件夹是空的。当我使用 gradle 进行构建时,它将 WAR 的 JAR 依赖项放入 WEB-INF/lib 文件夹中,而 EAR lib 文件夹中没有任何内容。

似乎两者都行得通,而且(对我而言)更合乎逻辑的路径是将 WAR 依赖项放入 WEB-INF/lib。有更好的或更正确的方法吗?

如果您的 EAR 中只有一个 WAR 文件,那么我肯定会推荐使用 WEB-INF/lib。此外,我建议在没有 EAR 文件的情况下直接部署 WAR,因为这样可以消除一层不必要的复杂性。

当您有多个需要相同依赖项的 WAR 文件时,您可能希望将依赖项 JAR 放入 EAR 中。然后,您可以通过与应用程序中的所有 WAR 共享相同的依赖项来保存 space。

希望对您有所帮助!

正如您所指出的,如果它是一致的,那么两者在技术上都可行——假设 EAR 只包含一个 Web 模块,真正需要的只是将它们全部放在一个地方,因为 EAR 中的东西不能 "see" 默认 Java EE class 加载配置下 WAR 中的内容。

不过,从概念上讲,您是正确的 - 将 WAR 使用的所有内容都放在 WAR 本身中,而不是将其放在其他空置的 EAR 中,这样更优雅、更清晰。虽然现在没什么大不了的,但如果您将应用程序扩展到多个模块(Web 或 EJB),它就变得很重要,因为将内容放入 EAR/lib 会消除您管理模块之间的多个依赖项的能力。如果您需要 WAR1 中的一个库版本和 WAR2 中的不同版本,如果您在 EAR 级别打包所有内容,那是不可能的。