使用 XML 文件擴展 wsadmin 工具與 Jython 腳本
簡介:wsadmin 是 Websphere Application Server 提供的腳本工具,它支持開發人員通過腳本對服 務器進行管理和配置。本文首先對 wsadmin 以及腳本語言 Jython 進行介紹,之後,本文將介紹一種通 過 XML 配置文件擴展 wsadmin 以及腳本的方法,該方法允許部署人員通過 XML 文件定義服務器的配置 步驟和應用部署過程,從而提高 wsadmin 以及腳本的可用性。
在發布一個運行於 WebSphere Application Server 的 J2EE 應用之前,對服務器進行配置和部署應 用是必不可少的一個過程,這個過程是非常復雜的。WAS 為用戶提供了可視化的管理控制台(Web Admin Console)來完成這一任務。即便如此,開發或部署人員仍需要接受培訓,並花費一定的時間和精力來完 成這些配置和部署工作。對於一個開發團隊來說,如果每個團隊成員都要手工的完成環境配置和應用部署 ,其代價是比較高的。
本文介紹使用 wsadmin 工具配合 Jython 腳本來完成服務器的環境配置和應用部署。配置和部署腳本 一經編寫,就可以多次重復使用。以自動化的腳本代替手工操作,是提高工作效率的重要一環。在此基礎 上,本文介紹一種使用 XML 文件對 wsadmin 命令行工具和 Jython 腳本進行擴展,從而實現服務器的環 境配置和應用部署的方法。我們為該方法提供了 Jython 實現,相關的腳本已經在 WAS 6.0 和 7.0 版本 上驗證通過。在文章中,我們將詳細闡述這種方法並簡要描述 XML 文件格式。此外,本文將說明 XML 文 件解析與運行模塊的實現原理,以便讀者能夠添加所需的功能模塊。
Wsadmin 工具與腳本簡介
wsadmin 工具簡介
wsadmin 腳本工具引入於 IBM WebSphere Application Server V5。它是一個接受腳本語言輸入的非 圖形化管理工具,用戶可以使用 wsadmin 工具執行那些可以用管理控制台執行的相同任務。
wsadmin 目前只支持 Jython 和 Jacl 兩種腳本語言。本文選取 Jython 腳本作為示例代碼,對使用 自動化腳本進行服務器配置、管理進行說明。我們將會應用部署為例編寫 Jython 腳本,即便是第一次接 觸 Jython 腳本的開發人員也能很快的了解並使用它們。
啟動 wsadmin 工具
開發人員可以通過 wsadmin.bat(windows)或 wsadmin.sh(Linux 或 AIX)來啟動 wsadmin 工具。 這兩類文件既可以在 WAS 概要文件的 bin 目錄(${profile_root}/bin)中找到,也可以 WAS 的 bin 目錄(${app_server_root}/bin)中找到。在 WAS 的 bin 目錄下的啟動命令在運行時需要指定 - profileName 參數,而在特定概要文件的 bin 目錄下的啟動命令則不用指定。
wsadmin 工具可以以交互式或批處理式兩種方式運行。以交互式運行時,開發人員可以在 wsadmin 工 具中運行單條命令。在 windows 系統中啟動交互式 wsadmin 工具的命令如下:
啟動支持 Jacl 命令的 wsadmin 工具:wsadmin.bat
啟動支持 Jython 命令的 wsadmin 工具:wsadmin.bat –lang jython
此外,開發人員還可以通過 wsamin 工具運行批處理腳本。批處理腳本需要通過 -profile 參數指定 :
運行 Jacl 腳本:wsadmin.bat –profile sample.jacl
運行 Jython 腳本:wsadmin.bat –lang jython –profile sample.py
Jython 語言介紹
Jython 語言是 wsadmin 目前所支持的兩種腳本語言之一。Jython 解釋器為腳本提供了控制流的支持 以及各種輔助命令,此外,通過對 wsadmin 工具提供的腳本對象的訪問,Jython 擴展了自身功能,從而 使開發人員可以利用編寫腳本來實現應用部署、服務器的管理和配置。
Jython 基本語法
Jython 語言是 Python 的一個 Java 實現,wsadmin 工具使用的是 Jython V2.1。Jython 是動態類 型語言,開發人員不用像 Java 那樣聲明變量類型,因為變量的類型是運行時決定的。
Jython 的基本數據類型包括數字類型、布爾類型和字符串類型。Jython 的數字類型包括整型和浮點 型:
wsadmin>a=1.33
wsadmin>print a
1.33
以上的語句將浮點數 1.33 賦給變量 a,並通過 print 命令在控制台輸出變量 a 的值。Jython 中的 字符串類型也與 Java 類似,不同的地方在於單引號和雙引號在 Jython 中的功能是相同的:"My String" 和 'My String' 在 Jython 中被認為是一樣的。Jython 為這些基本類型提供了各種運算符:布 爾類型的 or 和 and 運算符、數字類型的+、-、*、/ 和%運算符以及字符串類型的+運算符。
wsadmin>print 'My '+'String'
My String
以上的語句將兩個字符做連接並打印在控制台上。除了運算符,Jython 還提供了一系列字符串處理方 法,其中常用的有:
str1.find(str2):返回 str2 在 str1 中第一次出現的位置;
str1.lower():將 str1 中的字符變成小寫並返回;
str1.replace(str2, str3):將 str1 中的所有 str2 子串替換成 str3;
str1.split(str2):以 str2 為分隔符將 str1 分隔成列表;
len(str1):返回 str1 中包含的字符個數;
cmp(str1, str2):比較 str1 和 str2,如果相同則返回0。
在數字類型和字符串的基礎上,Jython 提供了列表類型,列表中的每個元素都可以是數字類型、布爾 類型、字符串或是一個子列表。開發人員可以通過中括號來創建列表:
wsadmin>list=['a','b',['c','d'],'e']
wsadmin>print list[0]
a
wsadmin>print list[2][1]
d
以上的語句創建了兩個列表,其中一個包含['c','d']兩個元素,同時,以該列表為第3個元素(下標 為2)創建另一個列表並賦值給變量 list。Jython 也為列表類型提供了各種處理方法,其中常用的有:
len(list1):返回 list1 中包含的元素個數;
cmp(list1, list2):如果 list1 和 list2 中包含的元素相同,返回0;
max(list1):返回 list1 中值最大的元素;
min(list1):返回 list1 中值最小的元素。
除了提供基礎的數據類型,Jython 還對控制流提供支持。Jython 語言支持的控制流語句包括以下幾 類:
條件命令:if-else;
循環命令:while、for;
錯誤處理命令:try。
此外,開發人員還可以使用 break、continue 和 pass 語句來調整控制流。我們以 if-else 語句來 說明 Jython 控制流命令的使用:
if (len(list) == 0):
print 'The length of list is 0.'
else:
print 'The first element is '+list[0]
Jython 語言通過 try 語句來完成錯誤處理。Try 語句可以獲取語句執行時的錯誤,當錯誤被捕獲時 ,except 句將被執行,否則,else 句都會被執行:
idef testFunc():
div = 0
try:
result=10/div
except:
import sys
print 'root cause: ', sys.exc_type, sys.exc_value
else:
print 'no exception is thrown.'
在上例中,當 div 為 0 時,except 句會被執行,拋出異常。sys 是 Jython 的內置模塊,開發人員 可以通過 import 語句來導入內置模塊。導入 sys 模塊之後,開發人員就可以使用模塊中的 exc_type 和 exc_value 屬性顯示錯誤信息了。以上語句的執行結果為:
root cause: exceptions.ZeroDivisionError integer division or modulo
在 Jython 腳本中使用管理對象
wsadmin 工具通過使用下列 WebSphere 特定對象,對基本的腳本語言進行了擴展:
AdminControl:用於運行操作命令。
AdminConfig:運行配置 WAS 的命令,用來創建或者修改 WAS 的配置元素。
AdminApp:應用程序的命令,包括部署、卸載、啟動、停止等操作。
AdminTask:用於 WAS 的系統管理,創建服務器、集群等。
Help:用於獲得命令幫助信息。
這些對象都有可用來執行管理任務的方法。要使用腳本編制對象,需要指定腳本編制對象、方法和方 法參數。例如:
AdminConfig.attributes('ApplicationServer')
本文將在接下來的章節中詳細介紹這些管理對象的相關方法和參數的使用。
使用 Jython 腳本部署應用
在對 Jython 語言進行介紹之後,我們將對如何利用 Jython 腳本進行應用部署進行說明。一個典型 的企業級 J2EE 應用,開發人員在部署階段常做的事情有:(1)安裝或更新應用程序的 ear 包;(2) 設置應用的 classloader mode 和 classloader policy;(3)修改 war 包或 EJB 包的 classloader; (4)設置角色和用戶的映射。
安裝應用程序的 ear 包
如果部署人員是首次在 WAS 服務器上部署應用程序,我們應當安裝應用的 ear 包。Jython 語言允許 開發人員將相關的代碼封裝成方法。以下就是一個在 WAS 服務器上部署應用的 ear 包的方法 installApp,它的參數是應用名稱 appName、ear 文件路徑 earFile 和服務器名稱 server:
def installApp (server, appName, earFile):
# declare global variable
global AdminApp
# install ear file
server_attr = ['-server', server]
AdminApp.install(earFile, server_attr)
#endDef
在 WAS 服務器上部署應用程序,是通過調用 AdminApp 對象提供的 install 方法來完成的。在方法 體中,我們首先通過 global 關鍵字將 AdminApp 聲明為全局變量,從而使方法體的其它部分可以使用該 變量。之後再將服務器名稱和 ear 文件路徑作為參數傳給 AdminApp 對象的 install 方法,完稱 ear 包的部署。
假設部署人員需要在 server1 上部署應用 SampleApp,ear 包的路徑是 C:\SampleAppEAR.ear,那麼 該方法的調用語句就是:
installApp('server1', 'SampleApp', 'C:/SampleAppEAR.ear')
更新應用程序的 ear 包
如果部署人員因為應用程序的變化而對 ear 包進行更新,我們應當使用 AdminApp 對象的 update 方 法更新應用,所需的參數是應用名稱 appName 和 ear 文件路徑 earFile:
def updateEar(appName, earFile):
# declare global variable
global AdminApp
# update the existing application
AdminApp.update(appName, "app", "- operation update -contents "+earFile )
#end update()
如果應用 SamleApp 已經在 WAS 服務器上安裝過,那麼更新該應用 ear 包的語句就是:
updateEar('SampleApp', 'C:/SampleAppEAR.ear')
設置應用的 classloader mode 和 classloader policy
在安裝或是更新應用的 ear 包之後,部署人員可能需要修改應用的 classloader mode 和 classloader policy。應用在部署時默認的 classloader mode 是 PARENT_FIRST,如果所部署的應用采 用不同的 classloader mode,需要在部署時進行設定。Classloader policy 指的是應用部署時 war 包 的載入策略,可能的值為 Module 和 Application:
def changeClassLoader(appName, classloaderMode, classloaderPolicy):
# declare global variable
global AdminConfig
appid = AdminConfig.getid ("/Deployment:"+appName+"/" )
deployedApp = AdminConfig.showAttribute(appid, "deployedObject")
# update classloader policy
if(len(classloaderPolicy) > 0):
policy = AdminConfig.showAttribute(deployedApp, "warClassLoaderPolicy")
if(cmp(classloaderPolicy.strip(), "Module") == 0):
policy = "MULTIPLE"
elif(cmp(classloaderPolicy.strip(), "Application") == 0):
policy = "SINGLE"
#end if
AdminConfig.modify(deployedApp, [["warClassLoaderPolicy", policy]])
#end if
# update classloader mode
if(len(classloaderMode) > 0):
classLoader = AdminConfig.showAttribute (deployedApp, "classloader")
modeAttr = ["mode", classloaderMode]
AdminConfig.modify(classLoader, [modeAttr])
#end if
#end changeClassLoader()
在更新 classloader 配置時,我們首先通過 appName 獲取應用配置的 ID,並通過 ID 獲得對應的配 置信息對象 deployedApp。如果參數中的 classloaderMode 和 classloaderPolicy 非空,我們就通過 AdminConfig 對象的 modify 方法修改相應的配置。
如果我們需要配置 classloader mode 和 policy 分別為 PARENT_LAST和Application,我們可以使用 以下語句:
changeClassLoader('SampleApp', 'PARENT_LAST', 'Application')
修改 war 包或 EJB 包的 classloader mode
使用 wsadmin 工具除了可以指定應用的 classloader mode,還可以為應用內的 war 包和 EJB 包設 置特定的 classloader mode,需要傳入的參數包括應用名稱、模塊名稱和指定的classloader mode:
def changeModuleClassloaderMode(appName, moduleName, classloaderMode):
# declare global variable
global AdminConfig
if len(classloaderMode) > 0:
appid = AdminConfig.getid("/Deployment:"+appName+"/" )
deployedApp = AdminConfig.showAttribute(appid, "deployedObject")
modules = AdminConfig.showAttribute(deployedApp, "modules")
moduleList = modules[1:len (modules)-1].split(" ")
for module in moduleList:
uri = AdminConfig.showAttribute(module, "uri")
if cmp(moduleName, uri) == 0:
cmode = AdminConfig.showAttribute(module, "classloaderMode")
if(cmp(cmode, classloaderMode) != 0):
print "Modifying classloader for module: " + uri
AdminConfig.modify(module, [["classloaderMode", classloaderMode]])
#end if
#end if
#end for
#end if
#end def
修改模塊的 classloader mode 與修改應用的很類似。假設 SampleAppEar.ear 中包含一個 web 模塊 SampleWeb,那麼我們可以用以下的語句修改它的 classloader mode:
changeModuleClassloaderMode('SampleApp', 'SampleWeb', 'PARENT_LAST')
設置角色與用戶的映射
一些應用需要對用戶權限進行控制,需要將特定的角色映射到用戶或用戶組上,我們可以通過 AdminApp 對象的 edit 方法修改 MapRolesToUsers 屬性來實現這一配置。需要傳入的參數為角色列表 roles 和用戶列表 users:
def mapRolesToUsers(roles, users):
# declare global variable
global AdminApp
if(len(roles) > 0):
roles_attr = []
for i in range (len(roles)):
role = roles[i]
user = users[i]
if(len(role) > 0):
print "Mapping role: " + role + " to user: " + user
role_attr = [role, "AppDeploymentOption.Yes",
"AppDeploymentOption.Yes", "", user]
roles_attr.append(role_attr)
#end if
#end for
mapRoles_attr = ["-MapRolesToUsers", roles_attr]
AdminApp.edit(self.app.name, mapRoles_attr )
#end if
#end def
如果我們需要將角色 role1, role2 映射至用戶 user1, user2,那麼我們可以調用以下語句:
mapRolesToUsers(['role1', 'role2'], ['user1', 'user2'])
更新應用的 ear 包、設置應用的 classloader mode 和 classloader policy、設置 war 包或 EJB 包的 classloader mode、設置角色與用戶的映射等等是部署一個 web 應用的典型步驟。通過對以上 Jython 代碼的分析,我們發現完成特定步驟的代碼只需要編寫一次,在部署不同應用時,我們只需要傳 入不同的參數即可。
為了分離腳本代碼和不同應用的特定配置,使用配置文件是不錯的選擇。Properties 文件是常用的配 置文件格式,然而面對較為復雜的、包含層次的應用部署配置(應用的配置,應用內的 war 包,EJB 包 的配置,應用的角色與用戶的映射等等),properties 文件相對簡單的結構無法完整的描述我們所需的 結構。XML 文件本身所具有的結構特性和對語義的描述能力使得它成為我們最好的選擇。接下來,本文將 介紹如何通過 XML 文件對 wsadmin 工具和 Jython 腳本進行擴展。
使用 XML 文件擴展 wsamin 工具與 Jython 腳本
通過以上對應用部署腳本的分析,我們發現進行同一步驟配置的腳本都非常相似,所不同的僅僅是配 置所需的參數(例如應用的名稱和 ear 文件的路徑)。如果能將某一類型的配置參數抽取出來,對已有 的腳本程序進行抽象,通過 XML 文件來配置管理它們,那麼接下來的開發和部署人員將無需重復編寫雷 同的 Jacl 或 Jython 腳本,只需要按照預定義的XML配置文件來提供外部參數就可以重用已有的腳本, 完成 WAS 配置和應用部署的過程。
使用 XML 文件擴展 Jython 腳本
我們仍然以應用部署為例說明如何通過 XML 文件來配置應用部署的信息。我們首先創建一個 <app>節點,該節點擁有 name、ear、classloader、classloader-policy 以及 map-to 等屬性, 這些屬性是應用中不同的包所共有的屬性,因此我們將它們放在<app>節點中。<app>節點可 能擁有<war>、<ejb>、<rar>、<role-mapping>以及<conn-factory>等 子節點,這些子節點都具有各自不同的屬性以及屬性值。通過這些節點的屬性值,我們可以配置應用部署 的信息:
<app name="SampleApp" ear="C:\SampleAppEAR.ear"
classloader="PARENT_FIRST" classloader-policy="Module"
map- to="WebSphere:cell=myCell,node=myNode,server=myServer">
<war name="SampleWar"
classloader="PARENT_LAST"
file="Sample.war" />
<ejb name="SampleEJB"
file="SampleEJB.jar"
jndi- name="eis/SampleEJB"
auth-data-alias="jdbc/SAMPLE_DATA_SOURCE" />
<rar name="SampleRar"
file="SampleRar.rar"
conn-factory- name="sample conn factory"
jndi-name="jndi/SAMPLE_CONN_FACTORY" />
<role-mapping>
<map user="user1" role="role1" />
<map user="user2" role="role2" />
</role-mapping>
<conn-factory name="SampleAppConnectionFactory"
auth-data-alias="sample auth data">
<property-set>
<property name="ApplicationServerHost" value="127.0.0.1" />
<property name="Client" value="600" />
</property-set>
</conn-factory>
</app>
通過 XML 的結構特性,我們可以對應用部署不同層次的信息進行配置。通過讀取這些配置,我們可以 傳遞給 Jython 腳本正確的參數,從而完成 WAS 服務器上的應用部署。我們最後選用了 ANT 工具來完成 讀取 XML 文件並調用 Jython 腳本的過程,本文將在接下來的章節中進行詳細的介紹。
XML 配置文件格式
通過 wsadmin 完成服務器配置和應用部署,除了需要對應用部署的各種參數進行配置,還需要指定服 務器的單元 cell、節點 node 和服務器名稱、設置 WAS 環境變量、配置 J2C 認證數據和數據庫連接等 等,接下來,我們對目前所支持的配置一一進行說明:
服務器配置
在現實中,應用部署的目標常常是服務器或是服務器集群(cluster)。同一個應用的目標服務器通常 都具有相同的單元名稱,因此我們可以配置服務器目標如下:
<dest>
<cell name="myCell">
<cluster name="myCluster" />
<server name="myServer" node="myNode" />
</cell>
</dest>
WAS 環境變量配置
WAS 環境變量是一個鍵值對,假設我們需要對 DB2 JDBC driver 路徑進行設定,我們可以配置如下:
<env>
<var name="DB2_JDBC_DRIVER_PATH" value="C:\IBM\SQLLIB\java" />
</env>
WAS 安全性配置
目前,我們所支持的 WAS 安全配置是 J2C 認證數據。J2C 認證數據包含的屬性包括了名稱(alias) 、用戶名(user-id)、密碼(pw)和描述(desc)。如果需要定義一個 J2C 認證數據 sample auth data,我們可以配置如下:
<security>
<j2c-auth-data alias="sample auth data" user- id="myUser"
pw="myPassword" desc="sample auth data" />
</security>
WAS 資源配置
常用的 WAS 資源配置包括 JDBC Provider、JDBC 數據源、J2C 資源適配器、J2C 連接工廠、MQ 隊列 連接工廠和 MQ 隊列。我們以 JDBC Provider 為例說明 WAS 資源配置:JDBC Provider 所包含的屬性有 名稱(name)、實現類(implementation class)、類路徑(classpath)和描述(desc)。一個 JDBC Provider 配置示例如下:
<jdbc-provider name="DB2 Legacy CLI-based Type 2 JDBC Driver"
impl- class="COM.ibm.db2.jdbc.DB2ConnectionPoolDataSource"
classpath="${DB2_JDBC_DRIVER_PATH}/db2java.zip"
desc="DB2 Legacy CLI-based Type 2 JDBC Driver" />
在本文提供的源代碼中,您可以找到示例的配置文件和相關的 DTD。你可以通過 DTD 獲知不同的 WAS 資源配置所需的屬性值。
XML 文件解析與運行原理
為了能使讀者能夠方便的添加所需的功能模塊,我們接下來將說明 XML 配置文件解析與運行模塊的實 現原理。我們采用的 XML 配置文件解析和運行模塊也是用 Jython 腳本實現的(您可以在本文的附件中 找到源代碼),Jython 是 Python 的 Java 實現,Jython 的實現者們一直追求的目標就是能夠無縫的調 用強大的 Java 類庫。在 Java 類庫的支持下,我們得以在 Jython 腳本中輕松的對 XML 文件進行分析 和處理。
XML 解析模塊分析
XML 解析模塊采用 XML 的 DOM 方法對配置文件進行解析。通過 Java 類庫所提供的 DocumentBuilder,我們將 XML 文件 parse 成 Document 對象,通過對 Document 對象的分析,我們可 以得到服務器資源和應用部署的信息:
def loadConfig(filepath):
try:
factory = DocumentBuilderFactory.newInstance();
builder = factory.newDocumentBuilder()
fis = FileInputStream(filepath)
document = builder.parse(fis)
document.normalize()
node = document.getDocumentElement()
except:
print "Exception: ", sys.exc_type, sys.exc_value
print "Configuration file parsing failed."
sys.exit()
#end except
......#get config info from nodes
#end def
我們以應用部署為例介紹 XML 解析模塊:DeployConfig 是 XML 解析模塊中的核心類,根據 Node 接 口返回的節點名,DeployConfig 生成一個 Application 實例。Application 實例解析本節點所包含的子 元素,並根據子元素的節點名分別生成 War、Rar、EJB 和 RoleMapping 的實例。
圖 1. 解析模塊
XML 文件運行模塊分析
我們以應用部署為例對文件的運行模塊進行分析。DeployConfig 是運行模塊提供給外界的接口,當運 行模塊開始部署應用時,它將調用 Application 對象的 deploy 方法。如果該應用是首次在 WAS 服務器 上包的connection factory進行部署,那麼 Application 對象將調用自身的 installEAR 方法安裝 ear 包,否則將調用 updateEAR 方法更新 ear 包。在安裝或更新完 ear 包之後,deploy 方法調用 RoleMapping 對象的 mapRoles 方法完整映射。
圖 2. 運行模塊
應用的 ear 包所包含的模塊需要映射到對應的服務器 上,deploy 方法將調用自身的 mapModulesToServers 來完成這一步驟。之後,deploy 方法依次修改應 用和各個模塊的 classloader 配置。如果其中的 EJB 模塊需要調用某些服務器資源, mapResourcesToEJB 方法將被調用,此外,如果應用需要通過資源適配器訪問外部資源,那麼 deploy 將 配置資源適配器對應的 rar 包的 connection factory。這些常用步驟完成之後,我們在 WAS 服務器上 部署應用的過程就告一段落了。
使用 ANT 運行擴展腳本部署應用
通過 wsadmin 工具配置 WAS 服務器與部署應用,除了需要對服務器資源和應用信息進行配置,還需 要指定 wsadmin.bat(或wsadmin.sh)所在的目錄,deployment manager 所在的 host 以及連接 deployment manager 時所需的用戶名和密碼。
為了避免每次運行 Jython 腳本都需要在命令行中指定以上的參數,我們選擇 ANT 工具作為我們的運 行工具。我們將以上這些參數配置成 ANT 腳本的 property 元素,並在運行 Jython 腳本時作為參數傳 入:
<target name="init"> <!-- The path where wsadmin.sh(.bat) is in --> <property name="wsadmin.path" value="C:/SDP/pf/wps/bin/wsadmin.bat" /> <!-- Connect to which WAS server host to update target application --> <property name="wsadmin.host" value="127.0.0.1" /> <!-- The user name to run wsadmin on a secured server --> <property name="wsadmin.user" value="" /> <!-- The password to run wsadmin on a secured server --> <property name="wsadmin.pw" value="" /> <!-- Main script to run --> <property name="wsadmin.script" value="main.py" /> <!-- Configuration file path --> <property name="wsadmin.config" value="" /> </target>
在 build.xml 中,我們將 wsadmin.host、wsadmin.user 和 wsadmin.pw 作為 wsadmin.bat( 或wsadmin.sh)的參數,將配置文件的路徑作為 Jython 腳本的參數,運行 wsadmin 工具和 Jython 腳 本:
<target name="wsadmin"> <property name="args" value=" -host ${wsadmin.host} -user ${wsadmin.user} -password ${wsadmin.pw} -lang jython -f ${wsadmin.script} -config ${wsadmin.config} "/> <exec executable="${wsadmin.path}" failonerror="true"> <arg line="${args}"/> </exec> </target>
通過 ANT 腳本,我們可以靈活的運行 Jython 腳本,從而完成 WAS 服務器的配置和應用部署 。假定我們將腳本保存在 C:\wsadmin 目錄下,配置的 xml 文件為 sample.xml,那麼運行 wsadmin 腳 步的 Ant 命令將是:
ant -f C:/wsadmin/build.xml –Dwsadmin.config=C:/wsadmin/sample.xml
總結
本文對 wsadmin 工具和 Jython 腳本進行了介紹,並選取應用部署為例,對 wsadmin 工具使用和 Jython 腳本編寫進行了說明。wsadmin 是一個功能強大的工具,它支持開發人員通過腳本部署應用、管 理和配置服務器,從而使開發人員可以無需通過管理控制台(Web Admin Console)進行手工配置,節省 了開發或部署人員的時間和精力,同時也將人為操作引入錯誤的機會降至最低。
在此基礎上,本文還介紹了一種使用 XML 文件對 wsadmin 命令行工具和 Jython 腳本進行擴展,從 而實現服務器的環境配置和應用部署的方法,並簡要描述了配置文件的格式。通過這種方法,開發和部署 人員將無需重復編寫雷同的 Jacl 或 Jython 腳本,只需要按照預定義的 XML 配置文件來提供外部參數 就可以重用已有的腳本,完成 WAS 配置和應用部署的過程,提高了部署人員的工作效率。
值得注意的是,我們並不能保證本文所提出的服務器配置和應用部署方案可以完美地解決所有的問題 。如果讀者希望采用本方案,請參考 IBM WebSphere Application Server 信息中心以了解更多的信息。
隨文源碼:http://www.bianceng.net/other/201212/667.htm