【问题标题】:Websphere 7 classloading delegationWebsphere 7 类加载委托
【发布时间】:2012-05-02 21:12:16
【问题描述】:

您好,我正在尝试让 axis2 在 Websphere 7 上运行,我在 apache 轴站点中进行了建议配置(更改了 axis2.xml “EnableChildFirstClassLoading”参数并将类加载器从“PARENT_FIST”更改为“PARENT_LAST”包含axis2的webmodule)

但是在同一个 EAR 中有另一个带有 JSP 和 struts 的 Web 应用程序在更改类加载器后停止工作(由于 jar 库版本问题),我的 deployment.xml 看起来类似于:

<?xml version="1.0" encoding="UTF-8"?>
<appdeployment:Deployment xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:appdeployment="http://www.ibm.com/websphere/appserver/schemas/5.0/appdeployment.xmi" xmi:id="Deployment_1335990730424">
<deployedObject xmi:type="appdeployment:ApplicationDeployment" xmi:id="ApplicationDeployment_1335990730424" startingWeight="10">
<modules xmi:type="appdeployment:WebModuleDeployment" xmi:id="WebModuleDeployment_1335990730424" startingWeight="10000" uri="StrutsWeb.war"/>
<modules xmi:type="appdeployment:WebModuleDeployment" xmi:id="WebModuleDeployment_1335990730425" startingWeight="10000" uri="Axis2Web.war" classloaderMode="PARENT_LAST"/>
<classloader xmi:id="Classloader_1335990730424" mode="PARENT_FIRST"/>
</deployedObject>
</appdeployment:Deployment>

一旦我从axis2 web 模块中删除“PARENT_LAST”,struts 模块就会开始工作,使用“PARENT_LAST”,web 服务可以完美运行,但struts web 模块不能。似乎类加载器模式更改正在影响两个 Web 模块。

提前致谢,

【问题讨论】:

    标签: dependencies websphere axis2 classloader


    【解决方案1】:

    在 WebSphere Application Server(与几乎所有应用程序服务器一样)中,有一个类加载器层次结构:

    Application server class loaders
    |   Includes WAS_HOME/plugins, WAS_HOME/lib, etc.
    |
    +-- Application class loader
        |   Includes files in lib/ folder of the .ear
        |   Includes all JARs referenced from Class-Path in all .war
        |
        +-- StrutsWeb.war class loader
        |      Includes WEB-INF/classes and all JARs in WEB-INF/lib
        |
        +-- Axis2Web.war
               Includes WEB-INF/classes and all JARs in WEB-INF/lib
    

    配置 sn-p 中的 &lt;classloader&gt; 元素嵌套在 ApplicationDeployment 中,因此它对应于应用程序类加载器。您可能不想修改此元素,您可能想修改各个 WAR 模块的委托模式。但是,如果更改此设置有效果,那么您可能在应用程序类加载器类路径上有 JAR,它实际上应该位于 WAR 模块的 WEB-INF/lib 中。

    【讨论】:

    • 嗨,谢谢你的回答,我要做的是覆盖与 websphere 捆绑的轴实现,我在 WEB-INF/lib 上有所有必需的库,而 PARENT_LAST 可以忽略服务器实现,但是更改该委托模式会使其他 Web 模块失败。
    • 我无法解释为什么更改一个 WAR 的委派模式会影响任何其他 WAR。我非常怀疑这是某种错误配置或错误包装,但我猜不出是什么。与 IBM 开立 PMR 可能是最简单的方法。
    • 感谢您的回复,我检查了应用程序类加载器并配置为 Multiple 而不是 Single,这可能是导致此行为的原因,我想我将从 Axis 切换到 JAX-RPC。
    • 我考虑过,但是您的配置 sn-p 中的 ApplicationDeployment 没有显示 warClassLoaderPolicy="SINGLE"。无论如何,这肯定是调整模式会影响两个模块的原因:使用单个类加载器策略意味着应用程序中的所有模块共享一个类加载器。
    最近更新 更多