把WebLogic EJB程序迁移到JBoss上
weblogic服务器是一款*的商业应用程序服务器。但是对于小规模的开发者来说,开发源代码的、基于标准的应用程序服务器jboss是可以用来替换类似weblogic或websphere等商业应用程序服务器的。不幸的是,在weblogic中开发的应用程序不能在jboss中部署。jboss迁移服务为我们提供了把应用程序迁移到jboss上的支持。作为代替,通过把厂商特定的部署文件信息迁移到jboss上,是可能把应用程序迁移到jboss上的。为了演示如何把应用程序迁移到jboss的过程,我们将把一个在weblogic中开发的带有oracle数据库的ejb应用程序迁移到带有mysql数据库的jboss应用程序服务器上。
预安装软件
为了配置mysql数据库的jdbc连接,需要下载mysql数据库驱动程序类。
1.下载mysql jdbc驱动程序.jar文件
2.下载和安装mysql数据库服务器
3.下载和安装jboss 4.0应用程序服务器
开发一个java应用程序,我们将使用它和xslt把weblogic部署文件转换为jboss部署文件。该部署文件也可以使用xslt工具进行转换。
概述
在不进行修改的时候,weblogic中开发的应用程序是不能部署在jboss中的。jboss应用程序的部署文件与weblogic的部署文件不同。在本文中,我们将把一个在weblogic中开发的实体(entity)ejb应用程序示例迁移到jboss中,迁移的方法是把weblogic部署文件转换为jboss部署文件。
示例应用程序包含一个catalog实体ejb。该ejb的bean类(catalogbean.java)、远程接口(catalog.java)、和home接口(cataloghome.java)都在本文下载链接的weblogic-jboss-resources.zip示例文件中。我们将使用mysql开放源代码数据库来配置jboss应用程序。把weblogic ejb应用程序部署到jboss中并不需要修改实体ejb类,只需要修改该ejb的部署文件。
配置jboss和mysql
mysql是一个开放源代码的数据库,它适合于开放源代码的项目和小型组织。为了配置jboss和mysql数据库需要进行下面一些修改。
配置jboss类路径
为了使用jboss 4.0和mysql,我们首先要把驱动程序类.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元素中指定数据源的jndi名称。
· 指定连接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配置文件作一些修改。
如果"建立表"选项被选中(通过把jbosscmp-jdbc.xml中的create-table元素设置为true)用于部署cmp实体ejb,并且mysql表的主键(或唯一键)的长度超过了500字节,应用程序的部署过程会在mysql数据库中生成一个sql语法错误。对于java.lang.string类型的cmp字段,我们可以通过在standardjbosscmp-jdbc.xml部署文件的mysql类型映射中把用于java类型java.lang.string的sql类型设置为较低的varchar值来减小主键(或唯一键)的长度。另一个可能出现的问题是jbosscmp-jdbc.xml部署文件中的column-name元素。如果某个mysql表的列名与mysql保留字相同,在jboss中部署j2ee应用程序的时候会产生一个错误。解决这个问题的方法是使列名与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)和home接口(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。这些文件之间的转换如下所示。
ejb-jar.xml部署文件对于weblogic和jboss来说都是一样的,除了multiplicity元素之外。jboss服务器的ejb-jar.xml中的multiplicity元素需要大写,例如one或many,而不是one或many。
示例实体ejb的ejb-jar.xml部署文件包含在示例代码中。示例ejb-jar.xml定义了一个叫做"catalog"的实体ejb。这个示例ejb拥有cmp字段catalogid、journal和publisher。其主键字段是catalogid。
把weblogic-ejb-jar.xml转换为jboss.xml
weblogic-ejb-jar.xml和jboss.xml部署文件都是ejb厂商的特定部署文件。为了把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">
我们通过一个自定义的xslt样式表jboss.xslt(包含在示例代码中)把部署文件weblogic-ejb-jar.xml转换为jboss.xml。该样式表建立jboss.xml,它是与weblogic的weblogic-ejb-jar.xml部署文件相当的jboss文件。使用jboss.xslt样式表所生成的jboss.xml文件也包含在示例代码中。
把weblogic-cmp-rdbms-jar.xml转换为jbosscmp-jdbc.xml
weblogic-cmp-rdbms-jar.xml部署文件指定了cmp实体ejb的数据库持续信息。weblogic-cmp-rdbms-jar.xml文件包含实体ejb的表名称、连接到数据库的数据源和与该实体ejb cmp字段对应的列。示例实体ejb的weblogic-cmp-rdbms-jar.xml部署文件包含在可以下载的.zip文件中。指定cmp视图ejb持续信息的jboss部署文件是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'
'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样式表jbosscmp-jdbc.xslt(包含在示例代码中)把部署文件weblogic-cmp-rdbms-jar.xml转换为jbosscmp-jdbc.xml。该样式表建立jbosscmp-jdbc.xml,它是与weblogic的weblogic-cmp-rdbms-jar.xml部署文件功能相当的jboss文件。jbosscmp-jdbc.xml也包含下载在.zip文件中。
weblogic部署文件的dtd与jboss部署文件的不同。使用自定义的xslt的时候,如果部署文件中还出现了一些额外的元素,可能还需要做进一步的修改,可以把weblogic部署文件转换为jboss部署文件。在下面的部分中,我们将在jboss服务器上部署这个ejb应用程序。
在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安装的目录)中。当服务器启动的时候,该ejb应用程序就在jboss服务器上面部署好了。jboss应用程序服务器中的部署(deploy)目录与weblogic应用程序服务器中的应用程序(applications)目录对应。
结论
通过转换部署文件可以把weblogic中部署的实体ejb应用程序迁移到jboss应用程序服务器上。使用相似的步骤,通过把weblogic.xml 部署文件转换为jboss-web.xml ,也可以把weblogic j2ee web应用程序迁移到jboss上。