UML软件工程组织

 

 

WAS下利用ant实现自动构建、部署
 
2008-03-12 作者: 孙展 出处:IBM
 
本文内容包括:
1.ant的简单介绍
2.WAS下命令行工具的简单介绍
3.实例脚本分析
4.利用任务计划实现每晚构建、部署
参考资料
本文讲述了如何利用ant和WAS的相关命令行工具,实现程序的自动构建、部署。这样,我们只需要一个简单的命令调用,就可以实现最新代码的重布署工作,无须任何人工干预。

本文讲述了如何利用ant和WAS的相关命令行工具,实现程序的自动构建、部署。这样,我们只需要一个简单的命令调用,就可以实现最新代码的重布署工作,无须任何人工干预。

1.ant的简单介绍

1.1 安装和配置

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。

1.2 建立build.xml

用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。

1.3 运行ant

使用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

1.4 ant的目标依赖

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):用来进行配置和管理工作,例如对节点的添加,对应用服务器的启动,对当前布署程序情况的查看等。

2.1 XMLConfig的使用语法:

语法表达式如下:

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

2.2 WSCP的使用方法

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/
              

2.3 如何获得wscp的帮助

获得对一个对象的所有的操作:<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,具体设置运行的时间和开始的日期等参数。

图一:任务计划属性设置
图一:任务计划属性设置
 

接下来就要对这个计划任务输入用户名和密码,你可以选择特定的用户身份来运行这个任务。最后点击完成,我们就可以在任务计划中看到我们新创建的这个任务了。这个任务会按照我们设置的时间每天自动调用运行,从而实现了每晚的自动构建和部署。

参考资料

ant的使用手册

WAS4的InfoCenter-Administer applications

 

组织简介 | 联系我们 |   Copyright 2002 ®  UML软件工程组织 京ICP备10020922号

京公海网安备110108001071号