WebLogic 作為商業應用服務器功能強大但授權成本高,JBoss (現 WildFly) 作為開源替代方案廣受中小團隊青睞。本文以 Oracle → MySQL、WebLogic → JBoss 4.0 為例,詳細演示 EJB 2.x 實體 Bean 遷移全流程,核心在於廠商專用部署描述符的等效轉換。
mysql-connector-java.jar)cp mysql-connector-java-3.0.9-stable-bin.jar $JBOSS_HOME/server/default/lib/
mysql-ds.xmlcp $JBOSS_HOME/docs/examples/jca/mysql-ds.xml $JBOSS_HOME/server/default/deploy/
修改關鍵屬性:
<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>
login-config.xml<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>
standardjbosscmp-jdbc.xml 中調整 VARCHAR 長度order, group)jbosscmp-jdbc.xml 中 create-table=true 僅開發環境使用EJB 2.x 標準描述符 ejb-jar.xml 通用,僅 multiplicity 元素需大寫 (One/Many 而非 one/many)。核心轉換在廠商描述符:
| 功能 | WebLogic | JBoss | 轉換工具 |
|---|---|---|---|
| EJB 容器配置 | weblogic-ejb-jar.xml | jboss.xml | XSLT: jboss.xslt |
| CMP 字段映射 | weblogic-cmp-rdbms-jar.xml | jbosscmp-jdbc.xml | XSLT: jbosscmp-jdbc.xslt |
WebLogic → JBoss
weblogic-ejb-jar (根) → jboss (根)
jndi-name / local-jndi-name → jndi-name / local-jndi-name
data-source-name → datasource
field-map → cmp-field
dbms-column → column-name
weblogic-rdbms-jar (根) → jbosscmp-jdbc (根)
<!-- jboss.xslt 片段 -->
<xsl:template match="weblogic-ejb-jar">
<jboss>
<xsl:apply-templates select="@*|node()"/>
</jboss>
</xsl:template>
<xsl:template match="jndi-name">
<jndi-name><xsl:value-of select="."/></jndi-name>
</xsl:template>
<xsl:template match="data-source-name">
<datasource><xsl:value-of select="."/></datasource>
</xsl:template>
完整 XSLT 文件隨源碼提供,執行 xsltproc jboss.xslt weblogic-ejb-jar.xml > jboss.xml 即可生成。
WebLogic EJB JAR: JBoss EJB JAR:
META-INF/ META-INF/
ejb-jar.xml ejb-jar.xml
weblogic-ejb-jar.xml jboss.xml
weblogic-cmp-rdbms-jar.xml jbosscmp-jdbc.xml
CatalogBean.class CatalogBean.class
Catalog.class Catalog.class
CatalogHome.class CatalogHome.class
# 編譯
javac -cp $JBOSS_HOME/client/jboss-client.jar *.java
# 打包
jar cf CatalogEJB.jar CatalogBean.class Catalog.class CatalogHome.class META-INF/*.xml
# 部署
cp CatalogEJB.jar $JBOSS_HOME/server/default/deploy/
WSVR0221I: Application startedProperties props = new Properties();
props.put("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
props.put("java.naming.provider.url", "jnp://localhost:1099"); // JBoss 默認 JNDI 端口
props.put("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
Context ctx = new InitialContext(props);
CatalogHome home = (CatalogHome) ctx.lookup("CatalogHome"); // jndi-name 值
Catalog catalog = home.create(new Integer(1), "Journal", "Publisher");
// 測試 CRUD 操作...
同理,Web 模塊遷移核心為 weblogic.xml → jboss-web.xml 轉換:
WebLogic: <context-root>/myapp</context-root>
JBoss: <context-root>/myapp</context-root>
WebLogic: <resource-description><res-ref-name>jdbc/MyDS</res-ref-name><jndi-name>OracleDS</jndi-name></resource-description>
JBoss: <resource-ref><res-ref-name>jdbc/MyDS</res-ref-name><jndi-name>java:/MySqlDS</jndi-name></resource-ref>
EJB 遷移本質是「標準 API 不變,廠商描述符重寫」。掌握 XSLT 自動化轉換可大幅降低工作量,關鍵難點在數據源類型映射、安全域集成、主鍵生成策略差異。建議遷移前完成全量自動化測試覆蓋,確保業務邏輯零回歸。