Websphere Application Server 環境配置與應用部署最佳實踐

wdnmg發表於2011-02-19

使用 XML 檔案擴充套件 wsadmin 工具與 Jython 指令碼

鄭 閩睿 (zhengmr@cn.ibm.com), 軟體工程師, WSO2 Inc
陳 鋼 (cgang@cn.ibm.com), 軟體工程師, WSO2 Inc
黃 湘平 (xphuang@cn.ibm.com), 軟體工程師, WSO2 Inc

簡介: 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 檔案來配置應用部署的資訊。我們首先建立一個節點,該節點擁有 name、ear、classloader、classloader-policy 以及 map-to 等屬性,這些屬性是應用中不同的包所共有的屬性,因此我們將它們放在節點中。節點可能擁有以及等子節點,這些子節點都具有各自不同的屬性以及屬性值。通過這些節點的屬性值,我們可以配置應用部署的資訊:



	
	
	
	
		
		
	
	
		
			
			
		
	


通過 XML 的結構特性,我們可以對應用部署不同層次的資訊進行配置。通過讀取這些配置,我們可以傳遞給 Jython 指令碼正確的引數,從而完成 WAS 伺服器上的應用部署。我們最後選用了 ANT 工具來完成讀取 XML 檔案並呼叫 Jython 指令碼的過程,本文將在接下來的章節中進行詳細的介紹。


XML 配置檔案格式

通過 wsadmin 完成伺服器配置和應用部署,除了需要對應用部署的各種引數進行配置,還需要指定伺服器的單元 cell、節點 node 和伺服器名稱、設定 WAS 環境變數、配置 J2C 認證資料和資料庫連線等等,接下來,我們對目前所支援的配置一一進行說明:

  • 伺服器配置

在現實中,應用部署的目標常常是伺服器或是伺服器叢集(cluster)。同一個應用的目標伺服器通常都具有相同的單元名稱,因此我們可以配置伺服器目標如下:



	
		
		
	


  • WAS 環境變數配置

WAS 環境變數是一個鍵值對,假設我們需要對 DB2 JDBC driver 路徑進行設定,我們可以配置如下:



	


  • WAS 安全性配置

目前,我們所支援的 WAS 安全配置是 J2C 認證資料。J2C 認證資料包含的屬性包括了名稱(alias)、使用者名稱(user-id)、密碼(pw)和描述(desc)。如果需要定義一個 J2C 認證資料 sample auth data,我們可以配置如下:



	


  • WAS 資源配置

常用的 WAS 資源配置包括 JDBC Provider、JDBC 資料來源、J2C 資源介面卡、J2C 連線工廠、MQ 佇列連線工廠和 MQ 佇列。我們以 JDBC Provider 為例說明 WAS 資源配置:JDBC Provider 所包含的屬性有名稱(name)、實現類(implementation class)、類路徑(classpath)和描述(desc)。一個 JDBC Provider 配置示例如下:




在本文提供的原始碼中,您可以找到示例的配置檔案和相關的 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 指令碼時作為引數傳入:



	<!-- The path where wsadmin.sh(.bat) is in --&gt
	
	<!-- Connect to which WAS server host to update target application --&gt
	
	<!-- The user name to run wsadmin on a secured server --&gt
	
	<!-- The password to run wsadmin on a secured server --&gt
	
	<!-- Main script. to run --&gt
	
	<!-- Configuration file path --&gt
	


在 build.xml 中,我們將 wsadmin.host、wsadmin.user 和 wsadmin.pw 作為 wsadmin.bat(或wsadmin.sh)的引數,將配置檔案的路徑作為 Jython 指令碼的引數,執行 wsadmin 工具和 Jython 指令碼:



	
	
		
	


通過 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 資訊中心以瞭解更多的資訊。



下載

描述 名字 大小 下載方法
本文用到的 Jython 指令碼示例 sample_scripts.zip 15 KB HTTP

關於下載方法的資訊


參考資料

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70109/viewspace-687569/,如需轉載,請註明出處,否則將追究法律責任。

相關文章