實現websphere8.5的自動部署
提供以下幾種方式:
方式1.可以用jenkins現成的"WebSphere Deployer"外掛來實現;
方式2.與maven整合
參考http://stackoverflow.com/questions/14808814/deploy-a-web-application-on-websphere-8-5-using-maven-3
比如用was-maven-plugin外掛即可實現對war,ear包的自動部署,幫助請見:
https://github.com/orctom/was-maven-plugin
方式3.與ant整合
http://www-01.ibm.com/support/knowledgecenter/SSAW57_8.5.5/com.ibm.websphere.javadoc.doc/web/apidocs/com/ibm/websphere/ant/tasks/InstallApplication.html?lang=en
具體的實現:
<?xmlversion="1.0" encoding="UTF-8"?>
<projectname="wasant" basedir="."default="InstallAndStart">
<propertyname="was.root" value="/mstr/IBM/WebSphere/AppServer" />
<propertyname="wsanttasks.jar"value="${was.root}/plugins/com.ibm.ws.runtime.jar"/>
<property name="app.name"value="test1"/>
<property name="ear.file"value="/root/myweb-1.0-SNAPSHOT.war"/>
<property name="contextroot"value="test1"/>
<property name="node"value="CIPBAKap0Node01"/>
<property name="cell"value="CIPBAKap0Node01Cell"/>
<property name="server"value="server1"/>
<property name="cluster"value="tesss"/>
<property name="username"value="wasadmin"/>
<property name="password"value="******"/>
<property name="host"value="10.1.94.64"/>
<property name="port"value="8880"/>
<property name="conntype"value="SOAP"/>
<!-- 使用到的任務 -->
<taskdef name="wsStartServer"classname="com.ibm.websphere.ant.tasks.StartServer"classpath="${wsanttasks.jar}" />
<taskdef name="wsStopServer"classname="com.ibm.websphere.ant.tasks.StopServer"classpath="${wsanttasks.jar}" />
<taskdef name="wsInstallApp"classname="com.ibm.websphere.ant.tasks.InstallApplication"classpath="${wsanttasks.jar}" />
<taskdef name="wsUninstallApp"classname="com.ibm.websphere.ant.tasks.UninstallApplication"classpath="${wsanttasks.jar}" />
<taskdef name="wsStartApp"classname="com.ibm.websphere.ant.tasks.StartApplication"classpath="${wsanttasks.jar}" />
<taskdef name="wsStopApp"classname="com.ibm.websphere.ant.tasks.StopApplication"classpath="${wsanttasks.jar}" />
<taskdef name="wsListApps"classname="com.ibm.websphere.ant.tasks.ListApplications"classpath="${wsanttasks.jar}" />
<taskdef name="wsAdmin"classname="com.ibm.websphere.ant.tasks.WsAdmin"classpath="${wsanttasks.jar}" />
<!-- 解除安裝應用-->
<target name="wsUninstallApp" description="UninstallApplication ${app.name}">
<wsUninstallApp
wasHome="${was.root}"
application="${app.name}"
conntype="${conntype}"
host="${host}"
port="${port}"
user="${username}"
password="${password}"
failonerror="fasle"/>
</target>
<!-- 安裝應用-->
<target name="wsInstallApp"depends="wsUninstallApp" description="Install Application${app.name}">
<wsInstallApp
wasHome="${was.root}"
ear="${ear.file}"
options="-node${node} -cell ${cell} -server ${server} -appname ${app.name} -contextroot${contextroot} -usedefaultbindings"
conntype="${conntype}"
host="${host}"
port="${port}"
user="${username}"
password="${password}"
failonerror="true"/>
</target>
<!-- 啟動應用-->
<target name="wsStartApp"description="StartApp Application ${app.name}">
<wsStartApp
wasHome="${was.root}"
application="${app.name}"
conntype="${conntype}"
host="${host}"
port="${port}"
user="${username}"
password="${password}"
failonerror="true"/>
</target>
<!-- 實際的任務組合 -->
<target name="InstallAndStart"description="Install and Start ${app.name}">
<antcalltarget="wsInstallApp"/>
<antcalltarget="wsStartApp"/>
</target>
</project>
注意:
a.installapp 目標將呼叫 uninstallapp 目標來確保企業應用程式已經解除安裝(如果已安裝)
b.執行./ws_ant.sh (該指令碼是安裝webshere時自帶的,位於安裝目錄的bin目錄下)
方式4.wasadmin 命令列(注意:應能ping同對方主機名,不然安裝應用的時候出錯)具體實現:
a.解除安裝應用./wsadmin.sh -conntype SOAP -host10.8.24.29 -port 8880 -user wasadmin -password ****** -lang jacl -c'$AdminApp uninstall test'
b.安裝應用./wsadmin.sh -conntype SOAP -host10.8.24.29 -port 8880 -user wasadmin -password ****** -lang jacl -c'$AdminApp install /root/myweb-1.0-SNAPSHOT.war {-node lvweiguang-PCNode01-cell lvweiguang-PCNode01Cell -server server1 -appname test -contextroot/test -usedefaultbindings}'
c.啟動應用./wsadmin.sh -conntype SOAP -host10.8.24.29 -port 8880 -user wasadmin -password ****** -lang jacl -c'$AdminControl invoke [$AdminControl queryNamestype=ApplicationManager,node=lvweiguang-PCNode01,*] startApplication test'
注意:
1.當只有一個節點和server的時候-node lvweiguang-PCNode01 -cell lvweiguang-PCNode01Cell -serverserver1這些不需要指定;
2.不管用哪種方式部署,第一次部署,連線的時候都需要先進行ssl 認證,點Y回車即可,以後就不需要了。
另外關於“was的自帶lib會存在與war包中的web-inf/lib存在衝突版本的jar包,所以war包安裝完畢後,要在部署的war包的管理模組中設定:類裝入器順序 為“類已裝入並且是先使用本地類裝入器(父類最後)”問題的解決方案:
1.通過was自身的設定做全域性性的調整;
1).在應用層級設定 “類裝入和更新檢測”,其中裝入順序為“<label title="指定是否在使用應用程式類裝入器之前使用父類裝入器來裝入類。" for="mode_PARENT_LAST" style="">類已裝入並且是先使用本地類裝入器(父類最後)”,war類裝入策略為“單一”。
這樣在安裝部署war包的時候通過AdminConfig可以設定該應用的類載入策略和順序。
方法一:was命令實現
set appid[$AdminConfig getid /Deployment:pa/]
#Identify thedeployed object and set
set deployedApp[$AdminConfig showAttribute $appid deployedObject]
set classldr[$AdminConfig showAttribute $deployedApp classloader]
#show currentattribute values
$AdminConfig showall$classldr
#modify
$AdminConfig modify$classldr {{mode PARENT_LAST}}
如有需要更改warClassLoaderPolicy(SINGLE or MULTIPLE)
$AdminConfigshowAttribute $deployedApp warClassLoaderPolicy
$AdminConfig modify$deployedApp {{warClassLoaderPolicy SINGLE}}
$AdminConfigsave
方法二:ant實現程式碼:
<?xml version="1.0"encoding="UTF-8"?>
<projectname="wasant" basedir="."default="InstallAndStart">
<propertyname="was.root" value="/mstr/IBM/WebSphere/AppServer" />
<propertyname="wsanttasks.jar"value="${was.root}/plugins/com.ibm.ws.runtime.jar"/>
<property name="port"value="8880"/>
<property name="conntype"value="SOAP"/>
<spanstyle="color:#ff0000;"> <propertyname="app.war.loadpolicy" value="SINGLE" />
<propertyname="app.reload.enabled" value="true" />
<propertyname="app.reload.interval" value="20" />
<propertyname="app.war.loadpolicy" value="SINGLE" />
<propertyname="app.class.load.mode" value="PARENT_LAST" />
<propertyname="setDeployments"
value="set deployments[$AdminConfig getid /Deployment:${appname}/]"/>
<propertyname="setDeploymentsObject"
value="setdeploymentObject [$AdminConfig showAttribute $deployments deployedObject]"/>
<propertyname="modifyWarClassLoaderPolicy"
value="$AdminConfig modify$deploymentObject {{warClassLoaderPolicy SINGLE}}"/>
<propertyname="setClassLoaderMode"
value="set classloader[$AdminConfig showAttribute $deploymentObject classloader]" />
<propertyname="modifyClassLoaderMode"
value="$AdminConfig modify$classloader {{mode ${app.class.load.mode}}}"/></span>
<!-- 使用到的任務 -->
<taskdef name="wsStartServer"classname="com.ibm.websphere.ant.tasks.StartServer"classpath="${wsanttasks.jar}" />
<taskdef name="wsStopServer"classname="com.ibm.websphere.ant.tasks.StopServer"classpath="${wsanttasks.jar}" />
<taskdef name="wsInstallApp"classname="com.ibm.websphere.ant.tasks.InstallApplication"classpath="${wsanttasks.jar}" />
<taskdef name="wsUninstallApp"classname="com.ibm.websphere.ant.tasks.UninstallApplication"classpath="${wsanttasks.jar}" />
<taskdef name="wsStartApp"classname="com.ibm.websphere.ant.tasks.StartApplication"classpath="${wsanttasks.jar}" />
<taskdef name="wsStopApp"classname="com.ibm.websphere.ant.tasks.StopApplication"classpath="${wsanttasks.jar}" />
<taskdef name="wsListApps"classname="com.ibm.websphere.ant.tasks.ListApplications"classpath="${wsanttasks.jar}" />
<taskdef name="wsAdmin"classname="com.ibm.websphere.ant.tasks.WsAdmin"classpath="${wsanttasks.jar}" />
<!-- 解除安裝應用-->
<target name="wsUninstallApp"description="Uninstall Application ${app}">
<wsUninstallApp
wasHome="${was.root}"
application="${appname}"
conntype="${conntype}"
host="${host}"
port="${port}"
user="${username}"
password="${password}"
failonerror="false"/>
</target>
<!-- 安裝應用-->
<target name="wsInstallApp"depends="wsUninstallApp" description="Install Application${appname}">
<wsInstallApp
wasHome="${was.root}"
ear="${earfile}"
options="-appname${appname} -contextroot ${appname} -usedefaultbindings"
conntype="${conntype}"
host="${host}"
port="${port}"
user="${username}"
password="${password}"
failonerror="true"/>
</target>
<span style="color:#ff0000;"><!-- 設定模組類載入策略-->
<targetname="wsSetWarLoadPolicy" description="set war load policy${app.war.loadpolicy}">
<echo>change WAR ClassloaderPolicy {SINGLE=Application, MULTIPLE=Module} to${app.war.loadpolicy}</echo>
<wsAdmin
user="${username}"
command="${setDeployments};${setDeploymentsObject};${modifyWarClassLoaderPolicy}"
password="${password}"
host="${host}"
conntype="${conntype}"
port="${port}"
wasHome="${was.root}"/>
</target>
<!-- 設定模組類載入順序-->
<targetname="wsSetClassLoaderMode" description="set classloader mode to${app.class.load.mode}">
<echo>change class load moode to${app.class.load.mode}</echo>
<wsAdmin
user="${username}"
command="${setDeployments};${setDeploymentsObject};${setClassLoaderMode};${modifyClassLoaderMode}"
password="${password}"
host="${host}"
conntype="${conntype}"
port="${port}"
wasHome="${was.root}"/>
</target> </span>
<!-- 啟動應用-->
<target name="wsStartApp"description="StartApp Application ${appname}">
<wsStartApp
wasHome="${was.root}"
application="${appname}"
conntype="${conntype}"
host="${host}"
port="${port}"
user="${username}"
password="${password}"
failonerror="true"/>
</target>
<!-- 實際的任務組合 -->
<target name="InstallAndStart"description="Install and Start ${appname}">
<antcalltarget="wsInstallApp"/>
<antcall target="wsStartApp"/>
<antcalltarget="wsSetWarLoadPolicy" />
<antcalltarget="wsSetClassLoaderMode"/>
</target>
</project>
2.在命令列或ant實現安裝的時候新增引數實現,對web模組載入順序的修改-----父親優先(PARENT_FIRST)或者父親最後(PARENT_LAST);
方案一:was命令列
set appid[$AdminConfig getid /Deployment:pa/]
set deployedApp[$AdminConfig showAttribute $appid deployedObject]
set modules[$AdminConfig showAttribute $deployedApp modules]
set module [stringtrim $modules ?{}?]
set classldr[$AdminConfig showAttribute $module classloader]
$AdminConfig show$classldr
$AdminConfig modify$classldr {{mode PARENT_LAST}}
$AdminConfig save
其輸出Log如下:
wsadmin>set appid[$AdminConfig getid /Deployment:pa/]
pa(cells/PASDEVap0Node01Cell/applications/pa.ear/deployments/pa|deployment.xml#Deployment_1413429878953)
wsadmin>setdeployedApp [$AdminConfig showAttribute $appid deployedObject]
(cells/PASDEVap0Node01Cell/applications/pa.ear/deployments/pa|deployment.xml#ApplicationDeployment_1413429878953)
wsadmin>setmodules [$AdminConfig showAttribute $deployedApp modules]
{(cells/PASDEVap0Node01Cell/applications/pa.ear/deployments/pa|deployment.xml#WebModuleDeployment_1413429878953)}
wsadmin>setclassldr [$AdminConfig showAttribute(cells/PASDEVap0Node01Cell/applications/pa.ear/deployments/pa|deployment.xml#WebModuleDeployment_1413429878953)classloader]
(cells/PASDEVap0Node01Cell/applications/pa.ear/deployments/pa|deployment.xml#Classloader_1413429878954)
wsadmin>$AdminConfigshow $classldr
{libraries {}}
{mode PARENT_FIRST}
方案二:ant實現
增加如下程式碼:
<propertyname="setDeployments"
value="set deployments[$AdminConfig getid /Deployment:${appname}/]"/>
<property name="setDeploymentsObject"
value="setdeploymentObject [$AdminConfig showAttribute $deploymentsdeployedObject]"/>
<propertyname="setModules"
value="set modules[$AdminConfig showAttribute $deploymentObject modules]"/>
<propertyname="setModule"
value="set module [stringtrim $modules ?{}?]"/>
<property name="setClassLoaderMode"
value="set classloader[$AdminConfig showAttribute $module classloader]" />
<property name="modifyClassLoaderMode"
value="$AdminConfig modify$classloader {{mode ${app.class.load.mode}}}"/>
<!-- 設定WEB模組類載入順序-->
<targetname="wsSetClassLoaderMode" description="set classloader mode to${app.class.load.mode}">
<echo>change class load moode to${app.class.load.mode}</echo>
<wsAdmin
user="${username}"
command="${setDeployments};${setDeploymentsObject};${setModules};${setModule};${setClassLoaderMode};${modifyClassLoaderMode}"
password="${password}"
host="${host}"
conntype="${conntype}"
port="${port}"
wasHome="${was.root}" />
</target>
3.對應用程式做更新操作-----第一次需手動部署;
命令列實現:
./wsadmin.sh -host10.8.24.29 -port 8880 -user wasadmin -password ****** -c '$AdminApp updatecap app {-operation update -contents/root/myweb-1.0-SNAPSHOT.war -usedefaultbindings}' //需要注意的是當更新的不是同一名字的war包時類裝載器會恢復預設設定。