2014-01-29 17 views
10

Ich habe eine Feder-MVC-Web-Anwendung, die ich den Klassenlader auf ändern muss. Ich muss den Klassenlader ändern, um gleich PARENT_LAST zu sein. Ich verwende WAS 6.1 und habe bereits ein JavaScript-Skript von einer früheren Webanwendung, die ich kopieren kann, um den Job zu erledigen.Wie Java-Klasse Loader PARENT_LAST

In der letzten Anwendung Apache Ant wurde verwendet, und was sie taten war, um die Bereitstellung abhängig von der Ausführung des Jacl-Skript.

In meiner neuen Webanwendung verwende ich maven install, um eine WAR-Datei zu erstellen und diese WAR-Datei auf meinem Anwendungsserver zu implementieren.

Wie kann ich den Klassenlader mit Maven auf PARENT_LAST setzen? Ich weiß, wie man es in der Konsole macht, aber wenn es einen Weg gibt, es mit Skripten zu machen, wäre das nett.

Diese Einstellung wird auch irgendwo in der WAR-Datei gespeichert, so dass bei der Bereitstellung der Anwendung die Einstellung übernommen wird. Diese Frage kommt von meinem mangelnden Verständnis dafür, wie jacl-Skripte funktionieren?

dank

+0

Nicht ganz sicher, dass das Entfernen des 'Java' Tags gerechtfertigt sein kann? – Torxed

Antwort

16

Wenn Sie bereitstellen nur die WAR-Datei selbst Sie können dies nicht kontrollieren, aber wenn Sie Ihre WAR-Datei in einer EAR-Datei haben, können Sie die deployment.xml Lösung verwenden. Die deployment.xml Datei würde wie folgt aussehen:

<?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_1347529484613"> 
    <deployedObject xmi:type="appdeployment:ApplicationDeployment" xmi:id="ApplicationDeployment_1347544766353" startingWeight="99" warClassLoaderPolicy="SINGLE"> 
    <modules xmi:type="appdeployment:WebModuleDeployment" xmi:id="WebModuleDeployment_1347543866613" startingWeight="1" uri="YourWebApp.war" classloaderMode="PARENT_LAST"/> 
    <classloader xmi:id="Classloader_1347543866613" mode="PARENT_LAST"/> 
    </deployedObject> 
</appdeployment:Deployment> 

Sobald Sie alles, was Sie tun müssen, zu tun ist, um die Datei in der richtigen Position Ihres EAR-Projekt Build hinzuzufügen vorausgesetzt, Sie src/main/application verwenden, die src/main/application/META-INF/ibmconfig/cells/defaultCell/applications/defaultApp/deployments/defaultApp/deployment.xml wäre und baue das EAR wie gewohnt mit Maven.

Während der Serverbereitstellung wird dies von WAS übernommen.

+0

danke das ist eine wirklich gute antwort. Ich verstehe jetzt, wenn ich die Einstellung ändern möchte, muss ich ein Ohr anstelle eines Krieges bauen. Es ist unglücklich. Aber ich denke, die andere Alternative wird immer manuell in der Web-Admin-Konsole nach der Bereitstellung gesetzt – Richie

+1

Richtig. Viele (aber nicht alle) implementierungsspezifischen Einstellungen, in denen WAS über eigene Deployment-Deskriptoren verfügt, befinden sich in der EAR-Datei. Wir haben festgestellt, dass die Bereitstellung einer EAR-Datei anstelle einer WAR-Datei vor allem aufgrund der einfachen Bereitstellung für uns besser ist. – DanielBarbarian

1

Websphere verwendet deployment.xml Dateibereitstellung Einstellung jedes Moduls in einem Ohr Datei zu regieren. Sie können die Classloader-Einstellung unter dem folgenden Pfad in deployment.xml ändern:

/MyTestEAR/META-INF/ibmconfig/cells/defaultCell/applications/defaultApp/deployments/defaultApp/deployment.xml

ich nicht wissen, wie Sie das in Maven konfigurieren können.

2

AFAIK gibt es keine Möglichkeit, WAR für PARENT_LAST während der Montage vorkonfigurieren. Die Klassenlade-Richtlinie wird während der Bereitstellung festgelegt. Die Art der Einstellung hängt daher davon ab, wie die Anwendung bereitgestellt wird.

Ändern der Richtlinie mithilfe des Skripts ist einfach. Skripte werden mit dem Tool wsadmin ausgeführt. Der Jython-Ausschnitt unten erfüllt die Aufgabe. Es kann leicht in Jacl umgewandelt werden.

dep = AdminConfig.getid('/Deployment:app_name/') 
depObject = AdminConfig.showAttribute(dep, 'deployedObject') 
classldr = AdminConfig.showAttribute(depObject, 'classloader') 
AdminConfig.modify(classldr, [['mode', 'PARENT_LAST']]) 
AdminConfig.save()