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