一把老骨头 发表于 2006-1-3 14:10:00
|
摘要:在一个使用weblogic管理项目中,可能有众多的配置。每个人需要建立domain,需要发布程序,配置Connection Pool,Data Source,JMS等程序中需要的资源,我们不得不为大家准备一个文档,每个人按照文档操作自己的Weblogic,这样不仅繁琐,也容易出错,通过建立这些简单的ant任务,每个人就可以省去这样的步骤。另外,在程序上机发布的时候,我们通常不得不为客户说明配置的过程,而使用这样的Ant任务,我们可以建立简单的安装程序,将程序自动安装配置好,并且生成启动脚本。
读者背景:本文需要读者了解Ant的一些基本知识,可以自己安装Ant,需要了解WEBLOGIC JMX的使用,也要会配置一些windows的批处理文件和环境变量,本文全部使用windows环境,在其它环境下只需作小部分的修改。
目录:
0,环境介绍
1,建立准备的环境与初始化的Ant任务
2,使用wlserver任务建立Domain
3,配置Connection Pool和一个DataSource
4,发布程序
5,把这些整合起来
6,最佳实践
7,一些问题
8,参考文档
首先要介绍Weblogic的一些Ant任务,关于Weblogic配置,有wlserver和wlconfig两项任务。wlserver用来配置domain和server,启动server,此后可以使用wlconfig配置自己生成domain。
操作系统:Windows XP sp1
Weblogic:weblogic8.1 server sp3
我的BEA安装在D:/bea,Weblogic在D:/bea/weblogic81
所以:
beahome=D:/bea
wlhome=D:/bea/weblogic81
1.1 准备可以运行的环境
根据weblogic的admin_ref文档中说明,使用wlserver和wlconfig,必须首先运行WL_HOMEserver
bin下的setWLSEnv.cmd(UNIX下是setWLSEnv.sh),我开始以为并不必要的,但是经过验证发现wlserver可以指定classpathref参数,所以可以不必从系统环境变量中读取,但wlconfig却不可以使用classpathref参数,而只可以从环境变量中得到参数,所以在运行ant的命令之前确实需要用setWLSEnv.cmd处理一下环境变量,为此可以写了个最简单的脚本。
首先介绍一下目录结构:
│ build.properties
│ build.xml
│ projectcmd.bat
│ readme.txt
│
└─web
│ index.jsp
│ index.jsp.bak
│
└─WEB-INF
web.xml
build.properties存放一些需要更改的变量值,build.xml是Ant的build文件,web是我们需要发布的Web Application的目录,这里做的非常简单,只包括一个简单的jsp。为了能够从一个已经设定好环境变量的命令行窗口开始我们写下这个脚本,然后存放为projectcmd.bat,内容为:
start D:/bea/weblogic81/server/bin/setWLSEnv.cmd
这样的话,在Windows下直接点击projectcmd.bat就会弹出一个新窗口,然后我们得到一个准备好的命令行窗口,输出如下:
CLASSPATH=d:bea
JDK141~1
lib
tools.jar;d:
bea
WEBLOG~1
server
lib
weblogic_sp.j
ar;d:bea
WEBLOG~1
server
lib
weblogic.jar;d:
bea
WEBLOG~1
server
lib
ojdbc14.ja
r;D:tool
java
mysql
mysql-connector-java-3.0.12-production-bin.jar
PATH=d:bea
WEBLOG~1
server
bin;d:
bea
JDK141~1
jre
bin;d:
bea
JDK141~1
bin;C:
W
INDOWSsystem32;C:
WINDOWS;C:
WINDOWS
System32
Wbem;D:
Borland
JBuilder2005
thir
dpartyant
bin;d:
bea
WEBLOG~1
server
bin
oci920_8
Your environment has been set.
E:project
leon>
在这个窗口下就可以直接运行我们后面使用的Ant命令。
1.2 Ant的初始化任务
- <target name="init" description="建立需要的任务">
- <taskdef name="wlserver" classname="weblogic.ant.taskdefs.management.WLServer"/>
- <taskdef name="wlconfig" classname="weblogic.ant.taskdefs.management.WLConfig"/>
- <taskdef name="wldeploy" classname="weblogic.ant.taskdefs.management.WLDeploy"/>
- </target>
这三个任务,就是我们整个文章中需要的weblogic任务。
在运行ant init后,如果没有错误,说明三个任务,已经建立起来,注意我们没有指定classpathref,因为环境变量中已经有了。
1.3设置build.properties的基本配置
修改开头的两项参数为自己的机器安装的参数
beahome=D:/bea
wlhome=D:/bea/weblogic81
2,使用wlserver任务建立Domain和Server
为建立自己的运行环境,首先必须建立自己的Domain及相应的Server,wlserver任务为我们提供机会可以自动化这个过程。
- <target name="new-server" depends="init" description="初始化Domain和Server">
- <delete dir="${server.dir}"/>
- <mkdir dir="${server.dir}"/>
- <wlserver host="${server.host}"
- port="${server.port}"
- username="${server.username}"
- password="${server.password}"
- dir="${server.dir}"
- action="start"
- beahome="${beahome}"
- weblogichome="${wlhome}"
- generateConfig="true"
- servername="${server.name}"
- domainname="${domain.name}"
- />
- </target>
里面所有的变量定义在build.properties
domain.name=antdomain
server.host=localhost
server.port=7001
server.username=weblogic
server.password=weblogic
server.name=antserver
server.dir=./myserver
这些参数的意思显而易见,server.dir是将要建立的domain的目录,这里有一些语义上矛盾,我们注意些就可以了。username和password是将来要建立的admin server的管理员用户与密码,这里没有使用加密的方式,是因为简单的原因,后面再说加密的方式。
generateConfig="true"这样表示我们是建立一个新的domain。
action="start"表示是开始server。
还有一个参数是productionmodeenabled,也就是是否为生产模式,可以设为true或是false,默认识开发模式。
在以上参数下运行,在根目录生成myserver目录
├─antserver
│ ├─.internal
│ ├─.wlnotdelete
│ │ └─extract
│ │ ├─antserver_console_console
│ │ │ ├─jarfiles
│ │ │ └─public
│ │ ├─antserver_uddiexplorer_uddiexplorer
│ │ │ ├─jarfiles
│ │ │ └─public
│ │ ├─antserver_uddi_uddi
│ │ │ ├─jarfiles
│ │ │ │ └─WEB-INF
│ │ │ │ └─lib
│ │ │ └─public
│ │ ├─antserver_wl_management_internal1_wl_management_internal1
│ │ │ ├─jarfiles
│ │ │ └─public
│ │ └─antserver_wl_management_internal2_wl_management_internal2
│ │ ├─jarfiles
│ │ └─public
│ └─ldap
│ ├─backup
│ ├─conf
│ ├─ldapfiles
│ ├─log
│ └─replicadata
├─applications
│ └─.wlnotdelete
└─configArchive
这个目录非常像通过Configuration Wizard生成的domain目录,要简单一些,但对于开发已经足够了。我们可以使用myserver目录下生成的startantdomain.cmd来启动我们生成的domain,我们后面的一些操作也需要这个server启动中运行,有些操作则需要关掉这个server。
一个小问题,在我的环境下会出现以下这个错误:
[wlserver] java.io.IOException: CreateProcess: chmod +x startantdomain.sh error=2
这是个小Bug,这条语句必须在UNIX环境下才能运行,用来赋予startantdomain.sh执行权,在Windows环境下当然是错误,希望Bea在下个版本运行这个命令前判断一下系统环境。
3,配置Connection Pool和一个DataSource
3.1 基本配置
domain和server已经配置好了,我们需要配置一个Connection Pool和一个DataSource,所以我们建立一个新的任务--doconfig。
- <target name="doconfig" depends="init">
- <wlconfig url="t3://${server.host}:${server.port}" username="${server.username}" password="${server.password}">
- <query domain="${domain.name}" type="Server" name="${server.name}" property="fullservername"/>
- </wlconfig>
- <wlconfig url="t3://${server.host}:${server.port}" username="${server.username}" password="${server.password}">
- <create type="JDBCConnectionPool" name="${database.poolname}">
- <set attribute="CapacityIncrement" value="1"/>
- <set attribute="DriverName" value="/blog/${database.driver.name}"/>
- <set attribute="InitialCapacity" value="1"/>
- <set attribute="MaxCapacity" value="10"/>
- <set attribute="Password" value="/blog/${database.password}"/>
- <set attribute="Properties" value="user=root"/>
- <set attribute="RefreshMinutes" value="0"/>
- <set attribute="ShrinkPeriodMinutes" value="15"/>
- <set attribute="ShrinkingEnabled" value="true"/>
- <set attribute="TestConnectionsOnRelease" value="false"/>
- <set attribute="TestConnectionsOnReserve" value="false"/>
- <set attribute="URL" value="/blog/${database.driver.url}"/>
- <set attribute="Targets" value="${fullservername}"/>
- </create>
- <create type="JDBCTxDataSource" name="${datasource.name}">
- <set attribute="JNDIName" value="/blog/${datasource.jndiname}"/>
- <set attribute="PoolName" value="/blog/${database.poolname}"/>
- <set attribute="Targets" value="${fullservername}"/>
- </create>
- </wlconfig>
- <echo message="${fullservername}"/>
- </target>
对应的build.properties如下
database.poolname=pool
database.driver.name=com.mysql.jdbc.Driver
database.driver.url=jdbc:mysql://localhost:3306/opencms
database.username=root
database.password=
datasource.jndiname=leondatasource
datasource.name=leondatasource
通过运行Ant doconfig的后,就可以在程序中根据datasource.jndiname来访问datasource了。
但我们要注意一些问题,运行ant doconfig的时候,我们必须保证我们目标的Server已经启动,就是运行myserver下的startantdomain.cmd启动的server。对于wlconfig命令的参数,url没有什么问题,将配置读过来就行了(用户与密码可以不写,后面说明),wlconfig任务不支持classpathref参数,所以我们不得不在开始的时候使用setWLSEnv.cmd。
我们这里要使用mysql的JDBC类库,我们可以在环境变量加入这么一条:
CLASSPATH=D:tool
java
mysql
mysql-connector-java-3.0.12-production-bin.jar
也可以将类似的语句加到setWLSEnv.cmd,但这样还需要修改生成的启动脚本加入对应的CLASSPATH。这给我们的工作带来了些麻烦,希望以后BEA能够改进wlconfig任务。我们也要建立好database.driver.url注明的数据库,因为配置Connection Pool需要检测数据库的连通性。
wlconfig有许多子任务,有create,delete,set,get,query,可以访问或是修改Domain的信息。
这里还有个小技巧就是为什么要使用query子任务,这是因为下面两个create子任务的参数Targets需要一个完全的server名字。我们使用:
- <echo message="${fullservername}"/>
打印信息如下:
antdomain:Name=antserver,Type=Server
只有使用这个参数,我们才能确保我们的Connection Pool和一个DataSource能够绑定到我们的server上。
当运行结束后,如果没有错误,说明已经成功了,这时候到console下察看就会看到生成的Connection Pool和一个DataSource。
3.2 让配置可以重复执行
不过上面这部分也有些问题,因为只能执行一次,在执行第二次时就会出现错误,所以我们必须删除旧的,然后重新配置。这时需要使用Ant的逻辑判断能力。
更改后的build.xml相应部分如下:
- <target name="doconfig" depends="init">
- <wlconfig url="t3://${server.host}:${server.port}" username="${server.username}" password="${server.password}">
- <query domain="${domain.name}" type="Server" name="${server.name}" property="fullservername"/>
- <query domain="${domain.name}" type="JDBCConnectionPool" name="${database.poolname}" property="pool"/>
- <query domain="${domain.name}" type="JDBCTxDataSource" name="${datasource.name}" property="datasource"/>
- </wlconfig>
- <antcall target="cleardatasource"/>
- <antcall target="clearpool"/>
- <wlconfig url="t3://${server.host}:${server.port}" username="${server.username}" password="${server.password}">
- <create type="JDBCConnectionPool" name="${database.poolname}">
- <set attribute="CapacityIncrement" value="1"/>
- <set attribute="DriverName" value="/blog/${database.driver.name}"/>
- <set attribute="InitialCapacity" value="1"/>
- <set attribute="MaxCapacity" value="10"/>
- <set attribute="Password" value="/blog/${database.password}"/>
- <set attribute="Properties" value="user=root"/>
- <set attribute="RefreshMinutes" value="0"/>
- <set attribute="ShrinkPeriodMinutes" value="15"/>
- <set attribute="ShrinkingEnabled" value="true"/>
- <set attribute="TestConnectionsOnRelease" value="false"/>
- <set attribute="TestConnectionsOnReserve" value="false"/>
- <set attribute="URL" value="/blog/${database.driver.url}"/>
- <set attribute="Targets" value="${fullservername}"/>
- </create>
- <create type="JDBCTxDataSource" name="${datasource.name}">
- <set attribute="JNDIName" value="/blog/${datasource.jndiname}"/>
- <set attribute="PoolName" value="/blog/${database.poolname}"/>
- <set attribute="Targets" value="${fullservername}"/>
- </create>
- </wlconfig>
- <echo message="${fullservername}"/>
- </target>
- <target name="clearpool" if="pool">
- <wlconfig url="t3://${server.host}:${server.port}" username="${server.username}" password="${server.password}">
- <delete mbean="${pool}"/>
- </wlconfig>
- </target>
- <target name="cleardatasource" if="datasource">
- <wlconfig url="t3://${server.host}:${server.port}" username="${server.username}" password="${server.password}">
- <delete mbean="${datasource}"/>
- </wlconfig>
- </target>
我们增加了两个target,两个query和两个antcall。
我们首先使用query监测是否这两个对象已经建立,如果已经建立,则我们的pool或是datasource就可以被赋上值,否则这两项就会为空值,然后我们运行antcall来运行cleardatasource和clearpool任务,而这两个任务要执行,都有各自的条件,就是if后面的部分,只有条件被赋值也就是存在着两个对象时才执行清除工作。
现在已经配置好了需要的资源,我们可以直接发布我们的Web Application了。
我们建立一个新的target:
<target name="deploy">
<wldeploy action="deploy"
source="${webapp.source}"
name="${webapp.name}"
user="${server.username}"
password="${server.password}"
verbose="true"
adminurl="t3://${server.host}:${server.port}"
debug="true"
targets="${server.name}"/>
</target>
相应的build.properties
webapp.name=ant
webapp.source=web
所有的参数一目了然,webapp.source表示希望发布的目录或者是WAR或其他包,运行后我们就可以使用浏览器访问相应的url。这时候发布的程序是nostatge方式,也就是直接使用我们指定的目录,当然我们也可以使用参数nostage=false,将发布的程序拷贝到对应的stage。
action还有redeploy,undeploy,redeploy,stop,start,我们这里并不需要,这里不作介绍,但我们可以轻易的加入到我们的build文件中,但在开发情况下,并不十分需要,有兴趣的话可以自己尝试使用。
我们希望开发者在得到这个工作目录后能够最快的开始工作,我们可以修改new-server任务。
- <target name="new-server" depends="init" description="初始化Domain和Server">
- <delete dir="${server.dir}"/>
- <mkdir dir="${server.dir}"/>
- <wlserver host="${server.host}"
- port="${server.port}"
- username="${server.username}"
- password="${server.password}"
- dir="${server.dir}"
- action="start"
- beahome="${beahome}"
- weblogi