各种应用服务器中单个jar的类加载器策略?

时间:2013-09-19 14:24:38

标签: java-ee jboss websphere weblogic

我们经常遇到驻留在应用服务器中的旧罐子的问题,但我们的耳朵里部署了较新的罐子。 Appserver选择加载旧jar和应用程序抛出“UnsupportedMethod”异常或类似。

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

(例如,有一个类加载策略“parent-first / application-first”,但这对于应用程序来说是全局的,并且会改变许多jar的行为,而问题只有一个jar ... ,对于weblogic,有weblogic-application.xml IIRC etcpp。)

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

3 个答案:

答案 0 :(得分:1)

在WAS中,无法控制JAR级别的类加载。我不太明白为什么你不能使用Parent Last策略,因为这是避免不必要的依赖的自然而安全的方法。

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

答案 1 :(得分:1)

因此,您只能控制特定类加载器上的类加载。在websphere中,有一个功能可以使用指定的“委派模式”或类加载器策略创建自己的自定义类加载器,即父级最后一个或父级。所以你的选择是创建一个自定义类加载器,其中包含你的依赖jar文件,并为类加载器指定classloader策略为“parent last”。

另一个选项是WAR类加载器策略,即依赖性来自特定的webmodule。然后你必须将你的jar / 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

答案 2 :(得分:1)

个别罐子的中间地点是将它们放入一个websphere“共享库”中,在产品拥有罐子之前搜索它们,而不会更改为整个模块的父级。

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

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