提供以下几种方式:
方式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}"
failοnerrοr="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}"
failοnerrοr="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}"
failοnerrοr="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}"
failοnerrοr="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}"
failοnerrοr="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}"
failοnerrοr="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包时类装载器会恢复默认设置。