ibm-web-bnd.xmiファイルでWebSphereのクラスローダーポリシーを設定できますか?
-
03-07-2019 - |
質問
WAS 6で実行するJEEアプリケーションがあります。クラスローダーの順序を<!> quot;アプリケーションクラスローダーでロードされたクラスを最初に<!> quot;に設定し、WARクラスローダーポリシーオプションを設定する必要があります。 <!> quot;アプリケーションの単一クラスローダー<!> quot;。
これらのオプションは、ibm-web-bnd.xmiファイルまたは他のファイルのいずれであっても、EARファイル内で指定できるので、管理者はこれらの設定を手動で変更する必要はありませんか?
アプリは自動化されたスクリプトを介してデプロイされ、デプロイを担当する人はオフサイトにいるため、その他の政治的な理由から、これは大いに役立ちます!
解決
@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>
他のヒント
編集(2): WebSphere Application Server Toolkit(AST)は、この情報を使用してEARファイルを拡張するために使用できるツールです( このドキュメント)の「拡張EARの設定」セクションの例。
編集(1): この投稿は、「アプリケーションクラスローダーを最初にロードしたクラス」(PARENT_LAST設定)をEAR内のdeployment.xmlファイルで設定できることを示唆しています。
自動展開スクリプトを制御できる場合、これを実行できます。以下に、Webモジュールクラスローダーの順序を「アプリケーションクラスローダーを最初にロードしたクラス」に設定するためのwsadmin jythonコードを示します(興味深いことに、この設定は、以前のバージョンの管理コンソールでラベル付けされた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
このリンクをご覧ください。サーバーのバージョンに基づいてJythonを使用してクラスローダーポリシーを設定する方法はいくつかあります- http://pic.dhe.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=%2Fcom.ibm.websphere.express.doc%2Finfo%2Fexp%2Fae%2Frxml_7libapp4.html
pkaedingの回答と同様に、特定の.warに特定の名前ではなく、.earファイル内のデフォルトの.warに適用する場合に役立つ次のように発見しました。 (1つの.warファイルを含む.earファイルには.warのみが含まれているため、エントリに.warの名前を付ける必要はありません。)このアプローチは、.warの名前を変更する必要がある場合に適している場合があります。何らかの理由で後でプロジェクトを作成するため、deployment.xml
ファイルの更新について心配する必要はありません。 META-INF
ファイルがセル参照ディレクトリトレイル内に埋まっていることがわかりました。ファイルがディレクトリレベル<=>に配置され、それ以上深くない場合に示されているように問題ない場合は、dunno。
特定のケースでは、次の場所の.earプロジェクトで<=>を見つけました:
<!> lt; project_root <!> gt; \ 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番号が同じであることを期待すべきではありません。