【问题标题】:classloader policy for single jars in various application servers?各种应用程序服务器中单个 jar 的类加载器策略?
【发布时间】:2013-09-24 16:43:30
【问题描述】:

我们经常遇到驻留在应用程序服务器中的旧 jars 但在我们耳中部署新 jars 的问题。 Appserver 选择加载旧 jar 并且应用程序抛出“UnsupportedMethod”异常或类似情况。

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

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

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

【问题讨论】:

  • 我仍然想念其他应用服务器的答案...

标签: jakarta-ee jboss websphere weblogic


【解决方案1】:

因此,您只能在特定的类加载器上控制类加载。在 websphere 中,有一个功能可以使用指定的“委托模式”或类加载器策略创建您自己的自定义类加载器,即父级最后或父级优先。因此,您的选择是创建一个自定义类加载器,其中包含您的依赖 jar-file/s,并将类加载器策略指定为类加载器的“最后一个父级”。

另一个选项是 WAR 类加载器策略,即如果依赖来自特定的 web 模块。然后你必须把你的 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】:

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

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

【讨论】:

  • 交付了数百个罐子,我们无法预测结果。
【解决方案3】:

单个 jar 的中间立场是将它们放入 websphere“共享库”中,该库将在产品拥有 jar 之前进行搜索,而无需更改为整个模块的 parent-last。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-25
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多