我们经常遇到应用程序服务器中驻留旧 jar 但在我们耳朵中部署新 jar 的问题。应用服务器选择加载旧的 jar,应用程序抛出“UnsupportedMethod”异常或类似异常。
对于主要应用程序服务器(websphere、jboss、weblogic ...),如何为单个 jar 配置类加载器策略?
(例如,在 wwebsphere 中,存在类加载策略“父级优先/应用程序优先”,但这对于应用程序来说是全局的,并且会改变许多 jar 的行为,而问题仅涉及一个 jar... ,对于 weblogic 有 weblogic-application.xml IIRC etcpp。)
这旨在作为一个集合调用,请描述在您选择的应用程序服务器(不仅仅是 websphere)中配置它的正确方法。
最佳答案
因此您只能控制特定类加载器上的类加载。在 websphere 中,有一个功能可以使用指定的“委托(delegate)模式”或类加载器策略(即父级最后或父级优先)创建自己的自定义类加载器。因此,您的选择是创建一个自定义类加载器,其中包含您的依赖 jar 文件,并将类加载器策略指定为类加载器的“父级最后”。
另一个选项是 WAR 类加载器策略,即依赖项是否来自特定的 Web 模块。然后你必须将你的 jar/s 放入该 WAR 中的 web-inf/lib 中。
请注意,仍然存在风险,因为同一 JVM 堆空间中将驻留“相同”类的多个版本,这些版本由 Websphere 类加载器加载,而由您的自定义类加载器加载。这意味着存在类版本冲突的风险,您的代码将遭受 ClassCastExceptions 和 LinkageErrors 的影响。
关于jakarta-ee - 各种应用程序服务器中单个 jar 的类加载器策略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18897373/