`
cenyf
  • 浏览: 43204 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

[转]使用Ant管理配置Weblogic

阅读更多
摘要:在一个使用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。


0,环境介绍

操作系统:Windows XP sp1
Weblogic:weblogic8.1 server sp3
我的BEA安装在D:/bea,Weblogic在D:/bea/weblogic81
所以:
beahome=D:/bea
wlhome=D:/bea/weblogic81


1,建立准备的环境与初始化的Ant任务

1.1 准备可以运行的环境
根据weblogic的admin_ref文档中说明,使用wlserver和wlconfig,必须首先运行WL_HOMEserverbin下的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:beaJDK141~1libtools.jar;d:beaWEBLOG~1serverlibweblogic_sp.j
ar;d:beaWEBLOG~1serverlibweblogic.jar;d:beaWEBLOG~1serverlibojdbc14.ja
r;D:tooljavamysqlmysql-connector-java-3.0.12-production-bin.jar

PATH=d:beaWEBLOG~1serverbin;d:beaJDK141~1jrebin;d:beaJDK141~1bin;C:W
INDOWSsystem32;C:WINDOWS;C:WINDOWSSystem32Wbem;D:BorlandJBuilder2005thir
dpartyantbin;d:beaWEBLOG~1serverbinoci920_8

Your environment has been set.
E:projectleon>

在这个窗口下就可以直接运行我们后面使用的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任务为我们提供机会可以自动化这个过程。

xml 代码
<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。

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"/>    
</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:tooljavamysqlmysql-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名字。我们使用:

xml 代码
<echo message="${fullservername}"/>  


打印信息如下:

antdomain:Name=antserver,Type=Server

只有使用这个参数,我们才能确保我们的Connection Pool和一个DataSource能够绑定到我们的server上。

当运行结束后,如果没有错误,说明已经成功了,这时候到console下察看就会看到生成的Connection Pool和一个DataSource。


3.2 让配置可以重复执行
不过上面这部分也有些问题,因为只能执行一次,在执行第二次时就会出现错误,所以我们必须删除旧的,然后重新配置。这时需要使用Ant的逻辑判断能力。

更改后的build.xml相应部分如下:

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后面的部分,只有条件被赋值也就是存在着两个对象时才执行清除工作。

4,发布程序

现在已经配置好了需要的资源,我们可以直接发布我们的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文件中,但在开发情况下,并不十分需要,有兴趣的话可以自己尝试使用。

5,把这些整合起来

我们希望开发者在得到这个工作目录后能够最快的开始工作,我们可以修改new-server任务。


xml 代码
<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

leon.zip (2.8 KB)
下载次数: 79
12:59 浏览 (2247) 评论 (2) 分类: j2EE 收藏 相关推荐 评论
2 楼 wubo19842008 2008-11-25   引用
在启动domain 的时候 报如下错误:
java.io.IOException: Cannot bind to URL [weblogic.management.mbeanservers.runtime]: javax.naming.NamingException: PROVIDER_URL not set

请问是什么错误?
1 楼 laorer 2007-09-17   引用
5,把这些整合起来

我们希望开发者在得到这个工作目录后能够最快的开始工作,我们可以修改new-server任务。Java代码
<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}" 
/>  
<antcall target="doconfig"/>  
<antcall target="deploy"/>  
</target> 

<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}"
/>
<antcall target="doconfig"/>
<antcall target="deploy"/>
</target>

我们添加了两个antcall,让server在建立好后,把环境和程序也发布完成,这样我们在得到我们的工作目录后,只需要配置一下,beahome和weblogichome,然后配置一下jdbc,然后运行ant new-server,我们的工作环境已经建立好了,可以马上开始自己的工作。

6,最佳实践

6.1 开发模式

在使用这样的Ant配置后,我们的开发就是这样开始的:

1)软件配置人员做好项目的基本内容,分配好目录,配置build.properties文件中的公用部分。
2)软件配置人员把项目提交到CVS或是其他版本控制工具。
3)开发程序员从版本控制工具得到项目文件。
4)程序员修改build.properties,然后运行ant new-server,就可以开始程序的开发了。

6.2 产品模式

在项目发布到产品环境下我们的工作目标有所改变,通常我们有许多的性能参数需要调整,繁琐的修改会很麻烦,也不适合长久的保存。

1)实施人员配置好build.properties文件中的资源和性能参数。
2)然后在需要实施的机器上运行执行
3)产品直接可以使用了

在集群环境下,以上繁琐的配置会显的更重要。

7,总结和一些问题

wlserver和wldeploy任务是不需要指定username和password的,但这需要相应的domain目录下有boot.properties文件,所以我们实际使用的时候,在生成domain和server后,为了保密,我们就可以把build.perperties中的username和password去掉,这样别人就无法知道密码。

希望Bea能够加强这几个任务,现在还有些不方便的地方,尤其是关于CLASSPATH部分,我们还不太容易做到完全的自动化。

附带的源代码在配置好beahome和wlshome就可以用了,但关于数据库的部分请自己调整,否则这部分可能失败。


8,参考文档

1)weblogic admin_ref文档:包括wlserver和wlconfig的介绍说明。
2)weblogic deployment文档:包括wldeploy的说明。
3)weblogic JMX文档:从这里查询所有的MBean名称,类型。
4)Manning - Java Development with Ant:查询Ant任务以及一些其他特性。
5)Administration Console Online Help:关于boot.properties的使用。

下载源代码:leon.zip

关于作者:

sdj21(dev2dev ID),软件工程师,email:sdj21@sina.com,sundaijun@126.com
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics