本文内容包括: |
1.ant的简单介绍 |
2.WAS下命令行工具的简单介绍 |
3.实例脚本分析 |
4.利用任务计划实现每晚构建、部署 |
参考资料 |
本文讲述了如何利用ant和WAS的相关命令行工具,实现程序的自动构建、部署。这样,我们只需要一个简单的命令调用,就可以实现最新代码的重布署工作,无须任何人工干预。
本文讲述了如何利用ant和WAS的相关命令行工具,实现程序的自动构建、部署。这样,我们只需要一个简单的命令调用,就可以实现最新代码的重布署工作,无须任何人工干预。
1.ant的简单介绍
ant是apache项目组的一个子项目,是一个基于java的构建工具。ant本身用java实现,要构建的工程的配置文件用xml格式描述,可以很方便的实现跨平台构建工作。
ant 可以从http://ant.apache.org下载,目前最新版本为1.5.4。下载完毕后直接解压缩到一个目录,例如D:\ant。
下一步我们需要设置如下的环境变量:
ANT_HOME:ant的安装目录,如果按上面方法解压缩了ant,那么这个值应该设为D:\ant
JAVA_HOME:jdk的安装目录
PATH:把%ANT_HOME%\bin目录加到path变量,以便于从命令行直接运行ant。
用ant编译规模较大的工程非常方便,每个工程都对应一个build.xml文件,这个文件包含与这个工程有关的路径信息和构建任务。
下面是一个最简单的build.xml文件:
<?xml version="1.0" encoding="ISO-8859-1"?> <project name="projectTemplate" default="init" basedir="."> <target name="init" > <property name="lib.dir" value="lib"/> <echo message="Hello ,lib.dir is set to ${lib.dir}" > </echo> </target> </project> |
每个build.xml有且仅有一个project,每个project下面可以包含多个target,每个target表示一个小的任务,每个任务负责执行一段脚本。ant有内置任务集可供使用,例如上面的echo就是在console上显示消息。
更详细的内置任务请参考 http://ant.apache.org/manual/coretasklist.html
${lib.dir}表示引用一个名字叫做lib.dir的属性值,这个属性的值就是lib。
使用ant.bat可以直接运行ant,如果不带任何参数,ant会在当前路径下搜索build.xml文件,如果找到了这个文件,就运行project的default属性指定的target.我们也可以带参数来运行ant,以便选择build.xml文件和要运行的target:
ant -buildfile c:\demo\build.xml init |
表示运行c:\demo\build.xml 中名字为init的target
target有一个属性depends,在其中可以指定一系列的target名字,表示在执行该target前,必须首先执行的一系列其它target。depends具有传递性,例如:targetA depends targetB,而targetB depends targetC和targetD,这样在执行targetA之前,首先执行C和D,然后执行B,最后才会执行A。
下面是个简单的例子,在执行编译的动作前,首先需要建立一个目标代码存放的目录,然后再执行编译。
<?xml version="1.0" encoding="ISO-8859-1"?> <project name="project" default="init" basedir="."> <target name="init" > <property name="dist" value="dist"/> <mkdir dir="${dist}" /> </target> <target name="build" depends="init"> <javac srcdir="SourceCode" destdir="${dist}"> </javac> </target> </project> |
2.WAS下命令行工具的简单介绍
除了GUI的管理控制台,WAS4还提供了几个命令行工具来对WAS进行管理。其中最主要的有:
XMLConfig:主要对WAS的对象进行配置,配置文件写在一个xml文件中,用这个命令行程序导入进行配置。
WSCP(WebSphere Control Program):用来进行配置和管理工作,例如对节点的添加,对应用服务器的启动,对当前布署程序情况的查看等。
语法表达式如下:
XMLConfig import||export xmldatafile -adminNodeName nodename [-generatePluginCfg true||false] |
-adminNodeName,是一个必须的参数,指明了我们的配置是在哪一个节点上进行的。
-generatePluginCfg:Regenerate the plug-in configuration if necessary.
export:把当前的配置输出到一个xml文件,我们可以利用这个命令备份当前系统的配置和状态。
import:把需要的系统配置写入一个xml中,然后用XMLConfig调用读入,来改变系统的配置。
关于配置文件的格式,我建议读者首先执行一次export命令,把当前系统的配置输出,然后参照原先的文档结构对xml文件里面的属性进行修改,对于不需要修改或者添加的部分,可以从xml文件中删除。
也可以从Example of a full export查看xml文件的格式。
进一步的信息请参考com.ibm.websphere.xmlconfig的Java Doc文件。
该文件位于:
WASInstallation_root\AppServer\web\apidocs\package_and_class_name
wscp是一个命令行管理工具,用来操纵WAS的对象。wscp可以执行以下的操作:
- 定义、配置、管理应用服务器以及它的各种资源。
- 布署应用程序
- 执行日常管理操作,如重启应用服务器,停止一个应用程序,添加一个节点等。
- 对特定的事件进行跟踪
下面,我们来快速浏览一下wscp支持的常见对象包括哪些:
ApplicationServer、DataSource、EnterpriseApp、JDBCDriver、JMSConnectionFactory、 JMSProvider MailSession、Node、ServerGroup、VirtualHost
更详细的说明请参见文档Supported object types
wscp可以用命令行交互方式执行。运行wscp.sh(.bat),将会出现提示符号
wscp> |
此后,就可以进行对象管理了。管理操作命令的语法是:
object_type operation object_name [ -option [value]|-attribute attribute_list] |
例如,我们要查看目前所有的应用服务器,输入以下命令即可:
wscp> ApplicationServer list |
如果我们要停止一个名字叫做test的应用程序,输入以下命令即可:
wscp> EnterpriseApps stop /EnterpriseApps:test/ |
获得对一个对象的所有的操作:<object_type> help
获得某个操作的所有选项: <object_type> help <operation>
获得一个对象的所有属性: <object_type> help attributes
3.实例脚本分析
在这一小节,将分析一个具体的build.xml实例,看看如何实现使用ant脚本来实现下面的操作:
从VSS上取得最新的程序->编译->打成标准J2EE应用包->上传到应用服务器->布署应用程序->启动应用程序
在分析脚本前,我们先来做一些准备工作,以使得我们的脚本可以顺利运行。
1.安装source safe客户端。
2.映射网络驱动器,把包含srcsafe.ini的source safe服务器目录到本地的G盘。
3.从这个网址下载NetComponents,并且把NetComponents.jar放到ant的lib目录下。
4.在D盘创建目录D:/Project/Deploy。
5.把build.xml和XMLConfig需要使用的config.xml文件放在D:/Project/Deploy目录下。
下面我们来看一下一个完整的build.xml文件:
<project name="BuildEAR" basedir="." default="autodeploy"> <property name="build" value="D:/Project/Deploy"/> <!--------visual source safe 的可执行文件所在的目录-------------------------> <property name="vss.ssdir" value="C:/Program Files/Microsoft Visual Studio/Common/VSS/win32"/> <!--------上面步骤2映射的网络驱动器----------------------------------------> <property name="vss.svrdir" value="G:"/> <!--------要布署应用的服务器的IP地址---------------------------------------> <property name="deployserver" value="192.168.42.23" /> <target name="autodeploy"> <tstamp> <format property="TODAY" pattern="yyyy-MM-dd" /> </tstamp> <!-----从visual source safe上取得最新的代码到本地------------------------------> <echo message="Getting latest source codes from:" /> <echo message="${vss.svrdir}" /> <vssget vsspath="/TCT1.11/SourceCode" localpath="${build}/SourceCode" login="name,password" ssdir="${vss.ssdir}" serverPath="${vss.svrdir}" autoresponse="N" recursive="true" quiet="true" /> <vssget vsspath="/TCT1.11/Web" localpath="${build}/Web" login="name,password" ssdir="${vss.ssdir}" serverPath="${vss.svrdir}" autoresponse="N" recursive="true" quiet="true" /> <!---------------编译java代码,并把生成的class文件放到特定目录下----------------> <mkdir dir="${build}/Web/WEB-INF/classes" /> <javac srcdir="${build}/SourceCode" destdir="${build}/Web/WEB-INF/classes" failonerror="false"> <classpath> <fileset dir="${build}/Web/WEB-INF/lib"> <include name="**/*.jar"/> </fileset> </classpath> </javac> <!----------------把网页(html,jsp)和class文件打包-----------------------------> <jar jarfile="${build}/TCT1.1.war"> <fileset dir="${build}/Web" excludes="**/WEB-INF/lib/*.jar"/> <fileset dir="${build}/Web" includes="**/WEB-INF/lib/log4j.jar"/> <fileset dir="${build}/Web" includes="**/WEB-INF/lib/jakarta-oro-2.0.4.jar"/> </jar> <ear earfile="${build}/TCT1.1_${TODAY}/TCT.ear" appxml="${build}/META-INF/application.xml"> <fileset dir="${build}"> <include name="TCT1.1.war" /> </fileset> </ear> <!-----删除生成的中间文件TCT1.1.war-----> <delete file="${build}/TCT1.1.war" /> <!---------------上传EAR和config.xml文件-------------------------------------> <ftp server="${deployserver}" port="21" remotedir="/usr/WebSphere/AppServer/installableApps" userid="usename" password="password" > <fileset dir="${build}/TCT1.1_${TODAY}" > <include name="TCT.ear"/> </fileset> <fileset> <include name="config.xml" /> </fileset> </ftp> <!---------------部署安装应用程序,并启动它------------------------------------> <telnet userid="username" password="password" server="${deployserver}"> <read>#</read> <!-----进入WAS的执行程序所在目录-----><write>cd /usr/WebSphere/AppServer/bin</write> <read>#</read> <write>XMLConfig.sh -import ../installableApps/config.xml -adminNodeName tcttest -generatePluginCfg true</write> <read>#</read> <!-----进入wscp的命令行交互模式-----> <write>wscp.sh</write> <!-----60秒内,出现 wscp>,表示进入了交互模式-----> <read timeout="60">wscp></read> <!-----启动WAS下一个叫做TCTTest的应用程序-----> <write>EnterpriseApp start /EnterpriseApp:TCTTest/</write> <read>wscp></read> </telnet> </target> </project> |
vssget用来从vss服务器上取得最新的源文件,放到本地目录。build.xml文件中有2个vssget,一个用来获得jsp,html等页面文件放入Web目录下,另外一个用来获得.java文件放入SourceCode目录下。
javac用来编译.java文件,把SourceCode下的java文件编译成class文件后放入Web/WEB-INF/classes目录下。需要注意的是classpath的设置要正确,否则java编译器将会找不到相关的类。
war和ear命令用来打包,例子中的程序不包含EJB,所以没有了打EJB包的命令。我们只是把web应用打成war包,然后再继续把war包打成标准的企业应用程序ear包,以方便应用服务器上的布署。最后,我们把中间生成的临时war包文件删除。
ant的ftp命令需要NetComponents.jar的支持,我们在上面步骤3已经做了配置。我们把今天生成的ear文件和XMLConfig需要使用的config.xml文件上传到WAS的installableApps目录下。
然后我们利用ant的telnet命令,远程登陆服务器,执行操作。其中write是向telnet输出命令,read是读telnet的返回信息,只有读到了read指定的字符,下一条命令才会继续执行,timeout属性是标志多少秒后,如果还是接受不到想要的返回信息,就认为操作失败。
我们利用telnet主要执行了以下操作:在节点tcttest上创建一个企业应用程序,并且启动这个应用。关于config.xml文件,我把它作为附件,请从以下地址访问:config.xml
本文中使用的build.xml,请从以下地址访问:build.xml
4.利用任务计划实现每晚构建、部署
windows里面有"任务计划"的功能,利用"任务计划",可以将任何脚本、程序或文档安排在某个最方便的时间运行。利用这一特性,我们可以写一个简单的批处理程序,调用ant命令并且使用-buildfile参数指明build.xml文件的位置即可,然后在任务计划中安排这个批处理程序在每天晚间运行一次即可。
要打开"任务计划",单击"开始→设置→控制面板",然后双击"任务计划"图标。里面是"添加任务计划"图标,双击它。接着我们按照"任务计划向导"的提示,单击"下一步"按钮。这时候会出现很多软件,点击浏览,找到我们前面建立的批处理文件并选择它, 接下来选择每天执行任务,点击下一步,如图1,具体设置运行的时间和开始的日期等参数。
图一:任务计划属性设置接下来就要对这个计划任务输入用户名和密码,你可以选择特定的用户身份来运行这个任务。最后点击完成,我们就可以在任务计划中看到我们新创建的这个任务了。这个任务会按照我们设置的时间每天自动调用运行,从而实现了每晚的自动构建和部署。