java - war-package 内的依赖关系与共享库内的依赖关系

标签 java deployment maven shared-libraries

通常,依赖项捆绑在 Java .war 包内。

但是,也可以将依赖项放入共享库中,以便为每个已部署的 Artifact 使用相同的依赖项。

问题:每种方法的优点和缺点是什么?您会在什么情况下使用它们?

最大的要求是直观性/可维护性。我不太关心内存消耗、磁盘空间使用、带宽等,因为这些都很便宜。

无论如何,每个点都有一些要点:

在 WAR 中包含依赖项:

  • “事实上”的方法(?)
  • 易于维护(需要较少的配置和脚本等)
  • 易于部署到应用服务器
  • 每个模块都可以在库上定义特定版本
  • 降低类加载错误的风险?

使用共享库:

  • 减少内存消耗(微不足道?)
  • WAR 部署可以访问相同的实例/变量等,因为它们共享类路径?听起来真的很糟糕吗? (它真的是这样工作的吗?还是它们在不同的上下文中运行,只是使用相同的物理文件?)
  • 使分发和部署变得更加困难,因为必须单独维护/部署依赖项
  • 包尺寸较小(琐碎)
  • 无需实际重新部署 WAR 应用即可升级依赖项(这有什么好处,真的......)

当然,我们可以利用这两种方法的最佳方面,只提供公共(public)库作为共享库,并在 WAR 中包含版本特性。然而,这会增加一倍的维护工作量,而且感觉像是一个禁忌。

目前我正在使用 Glassfish 3.1.1,但这个问题实际上与应用程序服务器无关。

最佳答案

这取决于您的操作。如果您在服务器上部署应用程序,并且此类服务器的数量非常有限(例如集成、QA、生产),并且您有大量依赖项,您可以将依赖项放入共享库。

如果您要将 war 发送给必须在其服务器上部署此 war 的第三方用户,这是非常烦人的。可怜的用户必须在他的共享库中安装所有必需的依赖项(以及依赖项的依赖项)。

如果您必须在不属于您的服务器上安装您的应用程序,或者必须在运行多个企业应用程序的服务器上安装您的应用程序,您就不能使用此方法。您必须将所有依赖项打包到您的 war 文件中。否则冲突是不可避免的。

关于java - war-package 内的依赖关系与共享库内的依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8508031/

相关文章:

java - 我可以在非 EE 独立环境中使用 JPA 注释吗?

JVM 关闭前 Java 轮询器线程清理

java - Swing应用程序的分发

java - 哈希集在哪里存储其哈希码与集合中已有的哈希码相匹配的对象?

带有 HTTP 上传的 Java ProgressBar 不更新

vba - 部署 VBA 宏

c# - 写入注册表时出现 Visual Studio 部署项目错误

java - 将支持库添加到 android studio 项目

java - 有没有办法从本地 jar 在 pom 文件中创建 Maven 依赖项

android - 使用 Maven 构建时 APK 缺少一些类