关于java:是否可以在ibm-web-bnd.xmi文件中设置WebSphere的类加载器策略?

 2021-04-27 

Can I set the classloader policy for WebSphere in the ibm-web-bnd.xmi file?

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

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

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


由于@Matthew Murdoch的回答,我得以提出解决方案。就是这样,以防其他人帮助。

我这样创建了一个deployment.xml:

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="UTF-8"?>

  <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将deploy.xml文件放在EAR文件的根目录中:

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


编辑(2):WebSphere Application Server Toolkit(AST)是可用于通过此信息来增强EAR文件的工具(例如,请参见本文档中的"配置增强的EAR"部分)。铅>

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

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

wsadmin示例(jython):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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


类似于pkaeding的答案,我发现以下内容,不是按名称特定于特定的.war,而是在应用于.ear文件中的默认.war时很有用。 (.ear文件中只有一个.war文件,而该文件只有那个.war,因此,在该条目中不必命名.war。)这种方法对于需要重命名.war的情况可能是好的。战争项目以后由于某种原因,因此您不必担心更新deployment.xml文件。我发现deployment.xml文件埋在单元格引用目录路径中;如果文件位于目录级别META-INF且不更深时显示,则表示dunno。

在我的特殊情况下,我在.ear项目的

中找到了deployment.xml

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

文件的内容非常像:

1
2
3
4
5
6
7
<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>

行:

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

最初阅读:

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

请注意,未引用任何.war。如pkaeding所述,您不应期望各种ID号对您来说都是相同的。


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