我可以在ibm-web-bnd.xmi文件中为WebSphere设置类加载器策略吗?

pka*_*ing 12 java websphere classloader

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

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

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

pka*_*ing 10

感谢@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>
Run Code Online (Sandbox Code Playgroud)

确保更改要匹配的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>
Run Code Online (Sandbox Code Playgroud)


Mat*_*och 8

编辑(2):WebSphere Application Server的工具包(AST)是一个工具,你可以用它来加强与该信息的EAR文件(参见例如在"配置的增强EAR"节本文件).

编辑(1): 这篇文章建议可以在EAR中的deployment.xml文件中设置'首先加载应用程序类加载器的类'(PARENT_LAST设置).

如果您可以控制自动部署脚本,则可以执行此操作.下面是一些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
Run Code Online (Sandbox Code Playgroud)