各种应用程序服务器中单个 JAR 的类装入器策略



我们经常遇到旧jar驻留在应用程序服务器中但新jar部署在我们耳朵中的问题。应用服务器选择加载旧 jar,应用程序会抛出"不支持的方法"异常或类似异常。

对于主应用程序服务器(websphere,jboss,weblogic ...),如何为单个jar配置类加载器策略?

(例如,在 wwebsphere 中,有类加载策略"父优先/应用程序优先",但这对应用程序来说是全局的,并且会改变许多 jar 的行为,而问题只在于一个 jar...,对于 weblogic 有 weblogic-application.xml IIRC 等。

这是一个收集调用,请描述在您选择的应用程序服务器中配置它的正确方法(不仅是 websphere)。

因此,您只能在特定的类加载器上控制类加载。在 websphere 中,有一个功能可以创建自己的自定义类加载器,具有指定的"委派模式"或类加载器策略,即父项最后或父项优先。因此,您的选择是创建一个自定义类加载器,其中包含您的依赖 jar 文件,并将类加载器策略指定为类加载器的"父最后"。

另一种选择是 WAR 类加载器策略,即如果依赖关系来自特定的 Web 模块。然后你必须把你的罐子/s放到那个WAR中的web-inf/lib中。

请注意,仍然存在

风险,因为"相同"类的多个版本驻留在同一个 JVM 堆空间中,这些版本由 Websphere 类装入器装入,哪些版本由定制类装入器装入。这意味着存在类版本冲突的风险,您的代码将遭受 ClassCastExceptions 和 LinkageErrors 的影响。

有关更多信息,请阅读此处:http://pic.dhe.ibm.com/infocenter/wasinfo/v6r0/index.jsp?topic=%2Fcom.ibm.websphere.express.doc%2Finfo%2Fexp%2Fae%2Fttrb_classload_viewer.html

在WAS中,没有办法在JAR级别控制类加载。我不太明白为什么你不能使用父最后策略,因为它是避免不需要的依赖关系的自然和安全的方法。

如果仍然需要在 JAR 级别处理依赖项,您可能会发现 Web 应用程序捆绑包很有用。这是基于OSGi,它提供了完全不同的类加载模型。

单个 jar 的中间立场是将它们放入 websphere "共享库"中,该库将在产品拥有 jar 之前进行搜索,而不会更改为整个模块的父级。

以下是有关"隔离"共享库的教育链接,这是共享库的可选进一步设置:

http://publib.boulder.ibm.com/infocenter/ieduasst/v1r1m0/index.jsp?topic=/com.ibm.iea.was_v7/was/7.0/Administration/WASv7_IsolatedSharedLibraries/player.html

最新更新