WebLogic服務器是一種領先的商業應用服務器。但對於小型企業的開發人員,基於標準的開源應用服務器JBoss可用於替代WebLogic和WebSphere等商業應用服務器。不幸的是,在WebLogic上開發的應用不能部署到JBoss上。JBoss遷移服務(Migration Services)對遷移應用至JBoss提供了支持。該方法,通過將特定廠商的部署描述符轉換成JBoss兼容的描述器,使應用遷移到JBoss上。爲了示範應用遷移的效果,我們把在WebLogic中對Oracle數據庫開發的EJB應用遷移到使用開源的MySQL數據庫的JBoss應用服務器。
本指南有如下幾個部分:
1. 初始設置
2. 概述
3. 根據MySQL配置JBoss
4. 轉換WebLogic的EJB應用
5. 在JBoss中部署EJB應用
初始設置
用MySQL數據庫驅動程序類配置MySQL數據庫的JDBC連接
1. 下載MySQL JDBC驅動程序.jar文件。
2. 下載並安裝MySQL數據庫服務器。
3. 下載並安裝JBoss 4.0應用服務器。
開發一個可用XSLT把WebLogic部署描述符轉換成JBoss部署描述符的Java應用程序。部署描述符同樣可用XSLT工具進行轉換。
概述
在不作任何改動的情況下,爲WebLogic開發的應用無法在JBoss中部署,因爲JBoss應用服務器的部署描述符有別於WebLogic的部署描述符。在本指南中,我們將通過把WebLogic部署描述符轉換成JBoss部署描述符,把一個在WebLogic中開發的實體EJB應用範例遷移到JBoss中。
該應用範例由一個Catalog實體EJB構成。本文後的Resources部分有一個weblogic-jboss-resources.zip範例文件,裏面存放有EJB的bean類(CatalogBean.java)、遠程接口(Catalog.java)和本地接口(CatalogHome.java)。配置JBoss要用到MySQL開源數據庫。要把WebLogic中的應用遷移到JBoss,不必改動實體EJB類,只需改動EJB部署描述符即可。
在JBoss中使用MySQL
MySQL是一個適合開源項目和小型企業的開源數據庫。用MySQL數據庫配置JBoss需要作如下改動:
配置JBoss的Classpath
根據MySQL配置JBoss 4.0,首先需要複製驅動程序類的.jar文件mysql-connector-java-3.0.9-stable-bin.jar到<JBoss>/server/default/lib目錄。這裏<JBoss>是你的JBoss應用服務器安裝目錄。lib目錄中的.jar和.zip文件存在於JBoss服務器的Classpath中。
配置MySQL數據源
要使用MySQL數據源,複製<JBoss>/docs/examples/jca/mysql-ds.xml到<JBoss>/server/default/deploy目錄。在JBoss服務器啓動時,存在於deploy目錄下的數據源配置文件將被部署。對mysql-ds.xml配置文件的改動如下:
•設置<driver-class/>爲com.mysql.jdbc.Driver,<connection-url/>爲jdbc:mysql://localhost/<database>,這裏的<database>指的是MySQL數據庫。<database>值可命名爲test——本文所創建的MySQL範例數據庫。
•在jndi-name元素中指明數據源JDDI名。
•設定連接MySQL的用戶名和密碼。默認情況下,對於root用戶名無需密碼。
•設定type-mapping元素爲mySQL。type-mapping元素指明瞭先前在standardjbosscmp-jdbc.xml部署描述符中定義的數據庫類型映射。對於MySQL數據庫,類型映射名爲mySQL。
改動後的mysql-ds.xml就像這樣:
<?xml version="1.0" encoding="UTF-8"?>
<datasources>
<local-tx-datasource>
<jndi-name>MySqlDS</jndi-name>
<connection-url>jdbc:mysql://localhost/test</connection-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<user-name>root</user-name>
<password></password>
<metadata>
<type-mapping>mySQL</type-mapping>
</metadata>
</local-tx-datasource>
</datasources>
通過數據源的JNDI名,我們可以從數據源獲得一條JDBC連接:
InitialContext initialContext = new InitialContext();
javax.sql.DataSource ds = (javax.sql.DataSource)
initialContext.lookup("java:/MySqlDS");
java.sql.Connection conn = ds.getConnection();
配置登陸
接下來,我們根據MySQL數據庫的設置改動login-config.xml配置文件。登陸MySQL數據庫須用到應用方案MySqlDbRealm。在login-config.xml中添加以下<application-policy/>元素:
<application-policy name = "MySqlDbRealm">
<authentication>
<login-module code =
"org.jboss.resource.security.ConfiguredIdentityLoginModule"
flag = "required">
<module-option name ="principal"></module-option>
<module-option name ="userName">root</module-option>
<module-option name ="password"></module-option>
<module-option name ="managedConnectionFactoryName">
jboss.jca:service=LocalTxCM,name=MySqlDS
</module-option>
</login-module>
</authentication>
</application-policy>
通過改動mysql-ds.xml和login-config.xml文件,JBoss 4.0服務器已經可以與MySQL數據庫協同工作。除上述設置外,可能還需爲JBoss部署描述符和JBoss JDBC配置文件作一些額外的改動。
部署CMP實體EJB時,若選擇了“create table”(在jbosscmp-jdbc.xml中把create-table元素改爲true),並且某個MySQL表的主鍵(唯一鍵)長度超過了500字節,應用的部署將在MySQL數據庫中產生一條SQL語法錯誤警告。對於java.lang.String類型的CMP字段,我們知道在standardjbosscmp-jdbc.xml部署描述符中有mySQL類型映射,所以我們可以設置sql-type爲java中的 java.lang.String類型,可減少VARCHAR值,從而減少了主鍵(唯一鍵)的長度。另一個可能出現的問題涉及部署描述符中的column-name元素。如果MySQL中某張表的某一字段與MySQL保留字相同,在把J2EE應用部署到JBoss後將產生錯誤,解決問題的辦法是,把該字段名換成非MySQL保留字。
轉換WebLogic的EJB應用
設置完MySQL和JBoss後,我們現在需要把WebLogic的EJB應用轉換爲JBoss的EJB應用。這一過程涉及改變部署描述符。WebLogic的實體EJB應用由EJB部署描述符(ejb-jar.xml、weblogic-ejb-jar.xml和weblogic-cmp-rdbms-jar.xml)、bean類(CatalogBean.java)、遠程接口(Catalog.java)和本地接口(CatalogHome.java)構成。在WebLogic服務器中部署實體EJB時,創建了一個EJB的.jar文件;這個EJB的.jar文件有如下結構:
META-INF/
ejb-jar.xml
weblogic-ejb-jar.xml
weblogic-cmp-rdbms-jar.xml
CatalogBean.class
Catalog.class
CatalogHome.class
部署描述符中指明瞭EJB結構信息和應用組合信息。結構信息包括指出EJB是一個會話EJB還是實體EJB。ejb-jar.xml部署描述符的assembly-descriptor元素指明瞭應用組合信息。WebLogic的實體EJB部署描述符有ejb-jar.xml、weblogic-ejb-jar.xml和weblogic-cmp-rdbms-jar.xml,相應的JBoss部署描述符是ejb-jar.xml、jboss.xml和jbosscmp-jdbc.xml。下面將介紹兩者間的轉換。
除了multiplicity元素,WebLogic和JBoss的ejb-jar.xml部署描述符內容是相同的。JBoss服務器ejb-jar.xml中的multiplicity元素需要首字母大寫;例如,one要寫成One,many要寫成Many。
在樣例代碼中,有實體EJB範例的ejb-jar.xml部署描述符。ejb-jar.xml範例定義了一個EJB名爲“Catalog.”的實體EJB。EJB範例的CMP字段有catalogId、journal和publisher,其主鍵字段是catalogId。
把weblogic-ejb-jar.xml轉換成jboss.xml
對EJB來說,weblogic-ejb-jar.xml和jboss.xml部署描述符是特定廠商的部署描述符。想把WebLogic EJB應用部署到JBoss應用服務器上,就要把weblogic-ejb-jar.xml部署描述符轉換成jboss.xml。
weblogic-ejb-jar.xml中的根元素是weblogic-ejb-jar。jboss.xml中的根元素是jboss。在jboss.xml 和weblogic-ejb-jar.xml部署描述符中的EJB JNDI名分別爲jndi-name元素和local-jndi-name元素。在樣本代碼中有實體EJB範例的weblogic-ejb-jar.xml部署描述符。weblogic-ejb-jar.xml部署描述符的DOCTYPE元素是:
< !DOCTYPE weblogic-ejb-jar PUBLIC
"-//BEA Systems, Inc.//DTD WebLogic 8.1.0 EJB//EN"
"http://www.bea.com/servers/wls810/dtd/weblogic-ejb-jar.dtd" >
jboss.xml部署描述符的DOCTYPE元素是:
< !DOCTYPE jboss PUBLIC "-//JBoss//DTD JBOSS 4.0//EN"
"http://www.jboss.org/j2ee/dtd/jboss_4_0.dtd">
源碼的.zip文件中存有轉換部署描述符weblogic-ejb-jar.xml到jboss.xml的定製XSLT樣式表jboss.xslt。欲瞭解更多關於XSLT轉換的詳情,請參閱Sun公司的XSLT指南。樣式表在JBoss中創建的jboss.xml,等同於WebLogic的weblogic-ejb-jar.xml部署描述符。jboss.xslt樣式表產生的jboss.xml存放在範例代碼中。
把weblogic-cmp-rdbms-jar.xml轉換成jbosscmp-jdbc.xml
weblogic-cmp-rdbms-jar.xml部署爲一個CMP實體EJB指明瞭數據庫持久化信息。weblogic-ejb-jar.xml文件包括某實體EJB對應的表名、連接數據庫的數據源和數據庫中對應實體EJB字段的列。實體EJB範例的weblogic-cmp-rdbms-jar.xml部署描述符存放在.zip文件中。在JBoss中,指明CMP實體EJB持久化信息的部署描述符是jbosscmp-jdbc.xml。
weblogic-cmp-rdbms-jar.xml的根元素是weblogic-rdbms-jar。jbosscmp-jdbc.xml的根元素是jbosscmp-jdbc。在weblogic-cmp-rdbms-jar.xml文件中,用於指明連接數據庫數據源的data-source-name元素,等同於jbosscmp-jdbc.xml部署描述符的datasource元素。在weblogic-cmp-rdbms-jar.xml中用於指明實體EJB CMP字段到數據庫表中對應列映射的field-map元素,等同於jbosscmp-jdbc.xml中的cmp-field元素。在weblogic-cmp-rdbms-jar.xml中用於指明字段名的dbms-column元素,等同於jbosscmp-jdbc.xml中的column-name元素。對應weblogic-cmp-rdbms-jar.xml部署描述符的DOCTYPE是:
< !DOCTYPE weblogic-rdbms-jar PUBLIC
'-//BEA Systems, Inc.//DTD WebLogic 8.1.0 EJB RDBMS Persistence//EN'
對應jbosscmp-jdbc.xml的DOCTYPE是:
< !DOCTYPE jbosscmp-jdbc PUBLIC "-//JBoss//DTD JBOSSCMP-JDBC 4.0//EN"
"http://www.jboss.org/j2ee/dtd/jbosscmp-jdbc_4_0.dtd">
把部署描述符weblogic-cmp-rdbms-jar.xml轉換成jbosscmp-jdbc.xml的定製XSLT樣式表jbosscmp-jdbc.xslt存放在範例代碼中。JBoss中的樣式表創建了jbosscmp-jdbc.xml,它等同於WebLogic中的weblogic-cmp-rdbms-jar.xml部署描述符。jbosscmp-jdbc.xml存放在.zip文件中。
WebLogic部署描述符的DTD不同於JBoss部署描述符。通過定製XSLT(爲部署描述符添加新元素時,需對XSLT作一些改動),WebLogic的部署描述符可轉換成JBoss部署描述符。接下來的部分,EJB應用將部署到JBoss服務器上。
在JBoss中部署EJB應用
在把WebLogic的EJB部署描述符轉換成JBoss部署描述符之後,你需要創建一個EJB .jar文件,把部署描述符部署在JBoss服務器上。JBoss .jar文件的結構是:
META-INF/
ejb-jar.xml
jboss.xml
jbosscmp-jdbc.xml
CatalogBean.class
Catalog.class
CatalogHome.class
編譯範例EJB類和接口。
java Catalog.java CatalogBean.java CatalogHome.java
複製JBoss部署描述符ejb-jar.xml、jboss.xml和jbosscmp-jdbc.xml到目錄META-INF下。用jar工具從JBoss部署描述符、類和接口創建一個.jar文件。
jar cf CatalogEJB.jar CatalogBean.class
Catalog.class CatalogHome.class META-INF/*.xml
要部署JBoss實體EJB應用,需複製.jar文件EntityEJB.jar到<JBoss>/server/default/deploy目錄下,這裏的<JBoss>是JBoss的安裝目錄。當JBoss服務器啓動時,上面的EJB應用將被部署。JBoss應用服務器的deploy目錄對應於WebLogic應用服務器的applications目錄。
結論
通過轉換部署描述符,部署在WebLogic上的實體EJB應用可被遷移至JBoss應用服務器。採用類似的方法,把weblogic.xml部署描述符轉換成jboss-web.xml,可使WebLogic J2EE web應用遷移至JBoss。
本文代碼:
http://www.onjava.com/onjava/2005/03/09/examples/weblogic-jboss-resources.zip