【问题标题】:Can I set the classloader policy for WebSphere in the ibm-web-bnd.xmi file?我可以在 ibm-web-bnd.xmi 文件中为 WebSphere 设置类加载器策略吗?
【发布时间】:2010-10-23 05:28:58
【问题描述】:

我有一个在 WAS 6 上运行的 JEE 应用程序。它需要将类加载器顺序设置为“首先使用应用程序类加载器加载的类”,并将 WAR 类加载器策略选项设置为“应用程序的单个类加载器” .

是否可以在 EAR 文件中指定这些选项,无论是在 ibm-web-bnd.xmi 文件还是其他文件中,这样管理员就不需要手动更改这些设置?

由于应用程序是通过自动化脚本部署的,而负责部署的人不在现场,而且出于其他一些政治原因,这将有很大帮助!

【问题讨论】:

    标签: java websphere classloader


    【解决方案1】:

    编辑 (2): WebSphere Application Server Toolkit (AST) 是一个工具,您可以使用此信息来增强 EAR 文件(例如,请参阅 this document 中的“配置增强的 EAR”部分) .

    编辑(1): This post 建议可以在 EAR 中的 deployment.xml 文件中设置“首先使用应用程序类加载器加载的类”(PARENT_LAST 设置)。 p>

    如果您可以控制自动部署脚本,则可以这样做。下面是一些 wsadmin jython 代码,用于将 Web 模块类加载器顺序设置为“首先使用应用程序类加载器加载的类”(有趣的是,该设置称为 PARENT_LAST,它在以前版本的管理控制台中被标记...)。

    wsadmin 示例(jython):

    def getWebModule(config, applicationName):
        webModules = config.list('WebModuleDeployment').
             split(system.getProperty('line.separator'))
        for webModule in webModules:
            if (webModule.find(applicationName) != -1):
                return webModule
        return None
    
    applicationName = "<Your application name here>"
    
    webModule = getWebModule(AdminConfig, applicationName)
    if (webModule != None):
        AdminConfig.modify(webModule, "[[classloaderMode PARENT_LAST]]")
        AdminConfig.save()
    else:
        print "Error: Cannot find web module for application: " + applicationName
    

    【讨论】:

    • 不幸的是,我无法控制脚本。出于政治原因,我需要在打包 EAR 之前处理所有这些问题(尽管可以说这是负责部署的管理员的工作......)
    • 添加了一个论坛帖子链接,该帖子描述了如何在 deployment.xml 文件中设置 PARENT_LAST 选项。它的细节有点短,但可能会给你一个开始。
    【解决方案2】:

    感谢@Matthew Murdoch 的回答,我能够想出一个解决方案。在这里,以防它帮助别人。

    我创建了一个这样的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_1241112964096">
      <deployedObject xmi:type="appdeployment:ApplicationDeployment" xmi:id="ApplicationDeployment_1241112964096" startingWeight="1" warClassLoaderPolicy="SINGLE">
        <classloader xmi:id="Classloader_1241112964096" mode="PARENT_LAST"/>
        <modules xmi:type="appdeployment:WebModuleDeployment" xmi:id="WebModuleDeployment_1241112964096" startingWeight="10000" uri="AGS.war">
          <classloader xmi:id="Classloader_1241112964097"/>
        </modules>
      </deployedObject>
    </appdeployment:Deployment>
    

    确保更改您的 WAR 文件的名称以匹配(我的称为 AGS.war)。

    我还更改了 xmi:id 属性中的数字,以确保它们是唯一的,但我不确定它们在应用程序中是否唯一真的很重要。

    然后,我通过 ANT 将 deployment.xml 文件放在我的 EAR 文件的根目录中:

        <ear destfile="${artifactsDir}/${earName}.ear" appxml="${projectName}_EAR/application.xml">
            <fileset dir="${artifactsDir}" includes="${warName}.war"/>
            <fileset dir="${projectName}_EAR/" includes="deployment.xml"/>
        </ear>
    

    【讨论】:

      【解决方案3】:

      查看此链接。根据您的服务器版本,有多种方法可以使用 Jython 设置类加载器策略 - http://pic.dhe.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=%2Fcom.ibm.websphere.express.doc%2Finfo%2Fexp%2Fae%2Frxml_7libapp4.html

      【讨论】:

        【解决方案4】:

        与 pkaeding 的答案类似,我发现如下,不是按名称特定于特定的 .war,但在应用于 .ear 文件中的默认 .war 时很有用。 (其中包含一个 .war 文件的 .ear 文件只有那个 .war,因此在条目中不需要命名 .war。)这种方法可能适用于您可能需要重命名 .war 的情况出于某种原因稍后进行项目,因此您无需担心更新deployment.xml 文件。我发现deployment.xml 文件隐藏在单元格引用目录路径中;不知道当文件放置在目录级别META-INF 并且没有更深时是否可以正常显示。

        在我的特殊情况下,我在我的 .ear 项目中找到了deployment.xml

        \META-INF\ibmconfig\cells\defaultCell\applications\defaultApp\deployments\defaultApp\

        文件的内容看起来很像:

        <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_1262775196208">
          <deployedObject xmi:type="appdeployment:ApplicationDeployment"
            xmi:id="ApplicationDeployment_1262775196208" startingWeight="10">
              <classloader xmi:id="Classloader_1262775196208" mode="PARENT_LAST" />
          </deployedObject>
        </appdeployment:Deployment>
        

        行:

        <classloader xmi:id="Classloader_1262775196208" mode="PARENT_LAST" />
        

        原文如下:

        <classloader xmi:id="Classloader_1262775196208" mode="PARENT_FIRST" />
        

        注意没有对任何 .war 的引用。正如 pkaeding 所提到的,您不应该期望各种 id 号码对您来说是相同的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-06-05
          • 1970-01-01
          • 2015-11-14
          • 1970-01-01
          • 1970-01-01
          • 2014-06-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多