了解 Websphere 共享库的使用与在您的 java 项目中定义库的对比?

understand the use of Websphere shared libraries vs. having libraries defined in your java project?

有人可以帮助我了解 Websphere 共享库的使用与在您的 java 项目中定义库的对比吗?我是 websphere 的新手,不了解共享库的概念,而只是将库 类 放在您正在处理的项目的 lib 文件夹中。

使用共享库有几个好处:

  1. 减少内存消耗。如果您有许多应用程序,使用服务器关联的共享库或独立的共享库允许 JVM 在内存中加载 类 的单个副本,而不是为内存中的库的每个副本加载 类一个应用程序。
  2. 减小 WAR 的大小。如果保留备份,这可以缩短部署时间、减少网络传输并减少存储大小。
  3. 提高环境的可管理性。如果您部署了许多应用程序并且由于修复需要升级其中一个库,那么 repackage/redeploy 许多应用程序可能比更新中央库更费力。如果您需要更新应用程序 "slowly" 而不是一次全部更新,您可以为不同版本的依赖项声明多个共享库;这种方法显然需要使用与应用程序相关的库而不是与服务器相关的库,因此您需要使用独立的共享库才能获得此处列出的其他好处。
  4. 更好地支持原生库。如果您的应用程序需要一个使用本机库的库并且您将库打包到您的应用程序中,那么您通常无法在不重新启动服务器的情况下仅重新启动您的应用程序,因为存在 JVM 限制以防止本机库被卸载或加载多个应用程序。

缺点是应用程序通常与其使用的库版本紧密耦合,因此将库与应用程序分开会使升级更加困难。

Brett 提出了有效的观点。我将为 #3 的缺点添加更多细节。

对于 #3,由于修复而将库升级到新版本(如示例)是一个好处。但是,根据我的经验,如果有多个应用程序在生产环境中共享同一个 JVM,并且它们都使用该库,则很难 (a) 使用新版本的库 (b) 及时测试所有应用程序 (c) ) 让所有利益相关者同意部署库修复,尤其是当他们在不同的业务部门时。虽然应用程序可以通过将它们的类加载器策略设置为 parent-last 来覆盖父库,这意味着那些需要集成最新修复的应用程序可以在它们的 EAR 文件中这样做并覆盖共享库。但这会破坏共享库的好处。它归结为 "shared" JVM 环境如何,以及同一 JVM 中的那些应用程序是否能够及时使用新版本的库(即通过测试)。