原因是WebLogic Server的部署描述符與JBoss的部署描述符不同。將應用程序遷移到WebLogic上的方法是把特定于供應商的部署描述符轉換為WebLogic部署描述符。在本文中,我們將把一個(gè)在JBoss中開(kāi)發(fā)的EJB應用程序遷移到WebLogic應用服務(wù)器上,其中使用的數據庫是MySQL。
初步安裝
下載和安裝BEA WebLogic Server(www.bea.com/framework.jsp?CNT=overview.htm &FP=/content/products/weblogic/server)。創(chuàng )建一個(gè)服務(wù)器域。下載MySQL JDBC驅動(dòng)程序jar文件(www.mysql.com/products/connector/j/)和MySQL數據庫服務(wù)器(www.mysql.com/products/mysql/)。開(kāi)發(fā)一個(gè)Java應用程序或獲取一個(gè)XSLT實(shí)用工具,使用XSLT把JBoss部署描述符轉換為WebLogic部署描述符。
在部署描述符轉換前,在JBoss中開(kāi)發(fā)的應用程序不能在WebLogic中部署。在本文中,我們將通過(guò)轉換部署描述符的方法,把一個(gè)在JBoss中開(kāi)發(fā)的實(shí)體EJB應用程序示例遷移到WebLogic應用服務(wù)器上。
示例應用程序包含一個(gè)Catalog實(shí)體EJB。清單1中顯示的是該EJB的bean類(lèi)(CatalogBean.java)。遠程接口(Catalog.java)和home接口(CatalogHome.java)顯示在清單2和清單3中。把JBoss EJB應用程序部署到WebLogic中并不需要修改實(shí)體EJB類(lèi),只需要修改該EJB的部署描述符。
清單1:CatalogBean.java
import javax.ejb.*;
abstract public class CatalogBean implements EntityBean {
private EntityContext ctx;
public CatalogBean() {};
public void setEntityContext(EntityContext ctx) {
this.ctx = ctx;
}
public void unsetEntityContext() {
this.ctx = null;
}
abstract public String getCatalogId();
abstract public void setCatalogId(String catalogId);
abstract public String getJournal();
abstract public void setJournal(String journal);
abstract public String getPublisher();
abstract public void setPublisher(String publisher);
public void ejbActivate() {
}
public void ejbPassivate() {
}
public void ejbLoad() {
}
public void ejbStore() {
}
public void ejbRemove()
throws RemoveException
{
}
public String ejbCreate(String catalogId)
throws CreateException
{
setCatalogId(catalogId);
return null;
}
public void ejbPostCreate(String catalogId)
{
}
}
清單2:Catalog.java
import java.rmi.RemoteException;
import javax.ejb.*;
public interface Catalog extends EJBObject {
public String getCatalogId()
throws RemoteException;
public String getJournal()
throws RemoteException;
public String getPublisher()
throws RemoteException;
public void setJournal(String journal)
throws RemoteException;
public void setPublisher(String publisher)
throws RemoteException;
}
清單3:CatalogHome.java
import javax.ejb.CreateException;
import javax.ejb.EJBHome;
import javax.ejb.FinderException;
import java.rmi.RemoteException;
public interface CatalogHome extends EJBHome {
public Catalog create(String catalogId)
throws CreateException, RemoteException;
public Catalog findByPrimaryKey(String catalogId)
throws FinderException, RemoteException;
}
配置WebLogic JDBC
本小節描述在WebLogic Server上配置JDBC連接和MySQL數據庫的方法。首先配置一個(gè)JDBC連接池,接下來(lái)配置用于訪(fǎng)問(wèn)JDBC連接池的JNDI數據源,然后把MySQL數據庫驅動(dòng)程序jar文件(mysql-connector-java-3.0.16-ga-bin.jar)添加到示例服務(wù)器的CLASSPATH變量中。WebLogic Server的CLASSPATH變量是在<BEA>\user_projects\domains\mydomain\startWebLogic腳本文件中進(jìn)行設置的。雙擊該腳本文件,啟動(dòng)WebLogic示例服務(wù)器。服務(wù)器在端口7001啟動(dòng)。通過(guò)URL http://localhost:7001/console來(lái)登錄WebLogic管理控制臺(Administration Console)。在顯示出來(lái)的管理控制臺登錄頁(yè)面上輸入用戶(hù)名和口令,就可以登錄到管理控制臺。
在管理控制臺中選擇Services>JDBC節點(diǎn)。要配置JDBC連接池,右擊Connection Pools節點(diǎn),選擇Configure a new JDBCConnectionPool。在Choose database frame displayed中選擇MySQL作為Database Type(數據庫類(lèi)型),選擇MySQL‘s Driver (Type 4)作為Database Driver(數據庫驅動(dòng)程序)。單擊Continue按鈕。接著(zhù)指定JDBC連接的連接屬性。在Database Name欄指定示例MySQL數據庫的名字test,在Host Name欄指定localhost,在Database User Name欄指定root。用root用戶(hù)名登錄MySQL數據庫不需要口令,但WebLogic Server需要為用戶(hù)名指定一個(gè)口令。單擊Continue按鈕繼續。
在Test database connection框中的Driver Classname欄指定MySQL驅動(dòng)程序com.mysql.jdbc.Driver,該驅動(dòng)程序用于建立與MySQL數據庫的連接。在URL欄指定jdbc:mysql://localhost/test作為連接數據庫的URL。單擊Test Driver Configuration按鈕,測試JDBC到數據庫的連接。如果已建立連接,會(huì )顯示內容為“connection successful”的消息。在Create and deploy框中,選擇將要部署連接池的服務(wù)器。單擊Create and deploy按鈕,部署JDBC連接池到服務(wù)器上。配置好的連接會(huì )部署到示例服務(wù)器上,同時(shí)該連接池的節點(diǎn)被添加到JDBC>Connection Pools節點(diǎn)中。要修改連接池配置,選擇該連接池節點(diǎn),并修改各個(gè)選項卡上的設置:General、Target and Deploy、Monitoring、Control、Testing、Connections。
接下來(lái),要配置WebLogic Server上的數據源。右擊Services>JDBC節點(diǎn),選擇Configure a new JDBCTxDataSource,指定一個(gè)數據源名稱(chēng),在JNDI Name欄為數據源指定JNDI名稱(chēng),例如MySQLDS。單擊Continue按鈕繼續。在Connect to connection pool框中,從連接池列表中選擇前一節所配置的連接池,單擊Continue按鈕繼續。在Target the data source框中選擇一個(gè)服務(wù)器作為數據源的目標服務(wù)器,然后單擊Create按鈕。配置好的數據源會(huì )部署到示例服務(wù)器上,該數據源的節點(diǎn)被添加到數據源節點(diǎn)中。要修改數據源,選擇該數據源的節點(diǎn),并修改各個(gè)選項卡上的設置,包括Configuration、Target和Deploy。該數據源可以通過(guò)在數據源配置中所指定的JNDI名稱(chēng)MySQLDS來(lái)獲取。
轉換JBoss EJB應用程序
前一節已經(jīng)在WebLogic Server上配置了MySQL數據庫。下面我們將把JBoss EJB應用程序轉換成WebLogic EJB應用程序,這涉及到部署描述符的轉換。JBoss實(shí)體EJB應用程序由以下部分組成;EJB部署描述符(ejb-jar.xml、jboss.xml和jbosscmp-jdbc.xml)、bean類(lèi)(CatalogBean.java)、遠程接口(Catalog.java)和home接口(CatalogHome.java)。
要在JBoss服務(wù)器上部署實(shí)體EJB,應該創(chuàng )建一個(gè)EJB JAR文件。該文件結構如下:
META-INF/ ejb-jar.xml jboss.xml jbosscmp-jdbc.xml CatalogBean.class Catalog.class CatalogHome.class
部署描述符中指定了EJB的結構化信息和應用程序匯編信息。結構化信息中包含將這個(gè)EJB指定為會(huì )話(huà)EJB還是實(shí)體EJB。ejb-jar.xml部署描述符中的應用程序匯編信息是在assembly-descriptor元素中指定的。JBoss中實(shí)體EJB的部署描述符為ejb-jar.xml、jboss.xml和jbosscmp-jdbc.xml,而WebLogic中對應的部署描述符依次是ejb-jar.xml、weblogic-ejb-jar.xml和weblogic-cmp-rdbms-jar.xml。下面我們將介紹這些文件間的轉換。
ejb-jar.xml部署描述符對于WebLogic和JBoss是相同的,清單4顯示了示例實(shí)體EJB的該部署描述符,其中定義了一個(gè)名為Catalog的實(shí)體EJB,它包含3個(gè)CMP字段:catalogId、journal和publisher,主鍵字段是catalogId。
清單4:ejb-jar.xml
<?xml version="1.0"?> <!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise
JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd"> <ejb-jar> <enterprise-beans> <entity> <ejb-name>Catalog</ejb-name> <home>com.ejb.CatalogHome</home> <remote>com.ejb.Catalog</remote> <ejb-class>com.ejb.CatalogBean</ejb-class> <persistence-type>Container</persistence-type> <prim-key-class>java.lang.String</prim-key-class> <reentrant>False</reentrant> <cmp-version>2.x</cmp-version> <abstract-schema-name>CatalogBean
</abstract-schema-name> <cmp-field> <field-name>catalogId</field-name> </cmp-field> <cmp-field> <field-name>journal</field-name> </cmp-field> <cmp-field> <field-name>publisher</field-name> </cmp-field> <primkey-field>catalogId</primkey-field> </entity> </enterprise-beans> </ejb-jar>
從weblogic-ejb-jar.xml到j(luò )boss.xml的轉換
weblogic-ejb-jar.xml和jboss.xml是特定于供應商的EJB部署描述符。為了在WebLogic應用服務(wù)器上部署JBoss EJB應用程序,要將jboss.xml轉換成weblogic-ejb-jar.xml。jboss.xml中的根元素是jboss,weblogic-ejb-jar.xml中的根元素是weblogic-ejb-jar。對于jboss.xml和weblogic-ejb-jar.xml,都可以在jndi-name或local-jndi-name元素中指定EJB的JNDI名稱(chēng)。清單5顯示的是示例實(shí)體EJB的jboss.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">
清單5:jboss.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE jboss PUBLIC "-//JBoss//DTD JBOSS 4.0//EN" "http://www.jboss.org/j2ee/dtd/jboss_4_0.dtd"> <jboss> <enterprise-beans> <entity> <ejb-name>Catalog</ejb-name> <jndi-name>com.ejb.CatalogHome</jndi-name> </entity> </enterprise-beans> </jboss>
使用定制的XSLT樣式表,即weblogic-ejb-jar.xslt(參見(jiàn)清單6),將ejb-jar.xml部署描述符轉換為weblogic-ejb-jar.xml部署描述符。該樣式表創(chuàng )建了weblogic-ejb-jar.xml,它是JBoss上的jboss.xml文件在WebLogic上的等效。清單7中顯示的是weblogic-ejb-jar.xslt樣式表所生成的weblogic-ejb-jar.xml文件。
清單6:weblogic-ejb-jar.xslt
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl=
"http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" doctype-public=
"-//BEA Systems, Inc.//DTD WebLogic 8.1.0 EJB//EN" doctype-system=
"http://www.bea.com/servers/wls810/dtd/weblogic-ejb-jar.dtd"/> <xsl:template match="/jboss"> <weblogic-ejb-jar> <xsl:apply-templates select="enterprise-beans/entity"/> </weblogic-ejb-jar> </xsl:template> <xsl:template match="entity"> <weblogic-enterprise-bean> <ejb-name><xsl:value-of select="ejb-name"/></ejb-name> <entity-descriptor> <persistence> <persistence-use> <type-identifier>WebLogic_CMP_RDBMS</type-identifier> <type-version>7.0</type-version> <type-storage>META-INF/
weblogic-cmp-rdbms-jar.xml</type-storage> </persistence-use> </persistence> </entity-descriptor> <jndi-name><xsl:value-of select="jndi-name"/></jndi-name> </weblogic-enterprise-bean> </xsl:template> </xsl:stylesheet>
清單7:weblogic-ejb-jar.xml
<?xml version="1.0"?> <!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" > <weblogic-ejb-jar> <weblogic-enterprise-bean> <ejb-name>Catalog</ejb-name> <entity-descriptor> <persistence> <persistence-use> <type-identifier>WebLogic_CMP_RDBMS</type-identifier> <type-version>7.0</type-version> <type-storage>META-INF/weblogic-cmp
-rdbms-jar.xml</type-storage> </persistence-use> </persistence> </entity-descriptor> <jndi-name>com.ejb.CatalogHome</jndi-name> </weblogic-enterprise-bean> </weblogic-ejb-jar>
從jbosscmp-jdbc.xml到weblogic-cmp-rdbms-jar.xml的轉換
weblogic-cmp-rdbms-jar.xml中指定了CMP實(shí)體EJB的數據庫持久性信息。該文件包含實(shí)體EJB的表格名稱(chēng)、連接數據庫的數據源和與該EJB CMP字段相對應的列。用于指定CMP實(shí)體EJB持久性信息的JBoss部署描述符是jbosscmp-jdbc.xml,清單8顯示了示例EJB的jbosscmp-jdbc.xml。
清單8:jbosscmp-jdbc.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE jbosscmp-jdbc PUBLIC
"-//JBoss//DTD JBOSSCMP-JDBC 4.0//EN" "http://www.jboss.org/j2ee/dtd/jbosscmp-jdbc_4_0.dtd"> <jbosscmp-jdbc> <defaults> <datasource>java:/MySqlDS</datasource> <datasource-mapping>mySQL</datasource-mapping> </defaults> <enterprise-beans> <entity> <ejb-name>Catalog</ejb-name> <create-table>true</create-table> <table-name>Catalog</table-name> <cmp-field> <field-name>catalogId</field-name> <column-name>catalogId</column-name> </cmp-field> <cmp-field> <field-name>journal</field-name> <column-name>journal</column-name> </cmp-field> <cmp-field> <field-name>publisher</field-name> <column-name>publisher</column-name> </cmp-field> </entity> </enterprise-beans> </jbosscmp-jdbc>
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文件中的field-map元素指定了實(shí)體EJB CMP字段與數據庫中表的列之間的映射關(guān)系,它等效于jbosscmp-jdbc.xml部署描述符中的cmp-field元素。weblogic-cmp-rdbms-jar.xml文件中dbms-column元素指定了一個(gè)列的名稱(chēng),它等效于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‘ ‘http://www.bea.com/servers/wls810/dtd
/weblogic-rdbms20-persistence-810.dtd‘>
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">
使用定制的XSLT樣式表(weblogic-cmp-rdbms-jar.xslt)(參見(jiàn)清單9)進(jìn)行jbosscmp-jdbc.xml到weblogic-cmp-rdbms-jar.xml的轉換。該樣式表創(chuàng )建了weblogic-cmp-rdbms-jar.xml,它是JBoss上的jbosscmp-jdbc.xml文件在WebLogic上的等效。清單10中顯示的是weblogic-cmp-rdbms-jar.xml。
清單9:weblogic-cmp-rdbms-jar.xslt
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" doctype-public=
"-//BEA Systems, Inc.//DTD WebLogic 8.1.0 EJB RDBMS Persistence//EN" doctype-system="http://www.bea.com/servers
/wls810/dtd/weblogic-rdbms20-persistence-810.dtd"/> <xsl:template match="/jbosscmp-jdbc"> <weblogic-rdbms-jar> <xsl:apply-templates select="enterprise-beans/entity"/> <create-default-dbms-tables>
AlterOrCreate</create-default-dbms-tables> </weblogic-rdbms-jar> </xsl:template> <xsl:template match="entity"> <weblogic-rdbms-bean> <ejb-name><xsl:value-of select="ejb-name"/></ejb-name> <data-source-name><xsl:value-of
select="../../defaults/datasource"/></data-source-name> <table-map> <table-name><xsl:value-of select="table-name"/></table-name> <xsl:apply-templates select="cmp-field"/> </table-map> </weblogic-rdbms-bean> </xsl:template> <xsl:template match="cmp-field"> <field-map> <cmp-field><xsl:value-of select="field-name"/>
</cmp-field> <dbms-column><xsl:value-of select="column-name"/>
</dbms-column> </field-map> </xsl:template> </xsl:stylesheet>
清單10:weblogic-cmp-rdbms-jar.xml
<?xml version="1.0"?> <!DOCTYPE weblogic-rdbms-jar PUBLIC ‘-//BEA Systems, Inc.//DTD WebLogic 8.1.0 EJB RDBMS
Persistence//EN‘ ‘http://www.bea.com/servers/wls810/dtd/
weblogic-rdbms20-persistence-810.dtd‘> <weblogic-rdbms-jar> <weblogic-rdbms-bean> <ejb-name>Catalog</ejb-name> <data-source-name>java:/MySqlDS</data-source-name> <table-map> <table-name>Catalog</table-name> <field-map> <cmp-field>catalogId</cmp-field> <dbms-column>catalogId</dbms-column> </field-map> <field-map> <cmp-field>journal</cmp-field> <dbms-column>journal</dbms-column> </field-map> <field-map> <cmp-field>publisher</cmp-field> <dbms-column>publisher</dbms-column> </field-map> </table-map> </weblogic-rdbms-bean> <create-default-dbms-tables>AlterOrCreate
</create-default-dbms-tables> </weblogic-rdbms-jar>
WebLogic部署描述符中的DTD與JBoss部署描述符中的DTD是不同的。借助于XSLT(如果要在部署描述符中表示附加的元素,可以修改定制的XSLT),可以實(shí)現從JBoss部署描述符到WebLogic部署描述符的轉換。接下來(lái)會(huì )將EJB應用程序部署到WebLogic Server上。
在WebLogic上部署EJB應用程序
完成從JBoss EJB部署描述符到WebLogic部署描述符的轉換后,在WebLogic Server上創(chuàng )建一個(gè)EJB JAR文件,該文件的結構如下:
META-INF/ ejb-jar.xml weblogic-ejb-jar.xml weblogic-cmp-rdbms-jar.xml CatalogBean.class Catalog.class CatalogHome.class
編譯示例EJB類(lèi)和接口。
java Catalog.java CatalogBean.java CatalogHome.java
將WebLogic部署描述符(ejb-jar.xml、weblogic-ejb-jar.xml和weblogic-cmp-rdbms-jar.xml)復制到META-INF目錄下。使用JAR工具(http://java.sun.com/j2se/1.4.2/docs/ tooldocs/windows/jar.html)從WebLogic部署描述符、類(lèi)和接口創(chuàng )建一個(gè)JAR文件。
jar cf CatalogEJB.jar CatalogBean.class
Catalog.class CatalogHome.class META-INF/*.xml
要部署WebLogic實(shí)體EJB應用程序,把JAR文件CatalogEJB.jar復制到<BEA>\user_projects\domains\mydomain\applications下,其中<BEA>是安裝WebLogic Server的目錄。當服務(wù)器啟動(dòng)后,EJB應用程序就部署到WebLogic Server上了。WebLogic Server上的應用程序目錄對應于Jboss應用服務(wù)器上的部署目錄。
結束語(yǔ)
通過(guò)轉換部署描述符,JBoss上的實(shí)體EJB應用程序可以遷移到WebLogic應用服務(wù)器上。使用類(lèi)似的過(guò)程,通過(guò)將jboss-web.xml部署描述符轉換成weblogic.xml,JBoss J2EE Web應用程序也可以遷移到WebLogic上。
原文出處
Migrating a JBoss EJB Application to WebLogic
聯(lián)系客服