答案似乎是“视情况而定”。
如果所讨论的 JAR(或类)不存在与服务器上部署的其他组件冲突的依赖项,则建议的解决方案 (CATALINA_HOME/lib/ext/
和CATALINA_HOME/conf/catalina.properties :: shared.loader
) 都应该可以正常工作。因此,两者都是“正确答案”,我看不出哪个比另一个“更正确”。
但是,当我第一次问这个问题时,我错过了一个关键细节(但这并不会使它无效):在我的情况下,有问题的 JAR 需要 Spring 4.2.9.RELEASE(和其他依赖项),但其他相关的 WAR 部署在同一台服务器上包含并需要 Spring 3.0.7。(要缓存的对象不依赖于 Spring,但是 JAR 设计时并没有考虑到这个问题,并且它还包含其他依赖于 Spring 的相关代码,现在很难分离。)
一般来说,只要所有已经部署的 WAR 包含他们需要的一切,就应该可以放入CATALINA_HOME/lib/ext/
任何你想要的东西:“模块优先/父最后”类加载策略应该防止冲突,即使(如本例中)Spring 4.2。 Spring 9 可用于父类加载器,Spring 3.0.7 可用于 WAR 类加载器。但是以这种方式混淆事物对我来说看起来有点“不干净”和混乱。
因此我决定使用“待缓存”对象的类加载器哈希码作为映射中的键,其中缓存的数据是值。然后所有缓存的数据都由“类加载器”选择,这会自动透明地确保分配兼容性。如果服务器上还部署了另一个 WAR,它可以更改并因此使缓存数据无效,它可以从缓存中删除整个地图,强制“读取访问”WAR 在下次访问时重新加载数据。
然而,这种方法不允许跨 WAR 缓存:实际上每个 WAR 都会获得自己的私有缓存段。
另一种方法是故意将所有数据转换为缓存到/从例如JSON,以便获得类似于java.lang.String
缓存数据的“自然全局”数据类型。如果从项目一开始就选择,对我来说这似乎是最干净的方式,但如果已经有一个复杂的(并且通常工作的)实现,这可能会导致一些工作要做。
欢迎对此自我回答发表评论!