商業應用伺服器 WebLogic 功能強大但授權昂貴。開源 JBoss (WildFly) 提供完整 Java EE 認證,是遷移首選。本文以「Catalog 實體 EJB + Oracle → MySQL」為例,詳細演示**僅修改部署描述檔、資料源配置、登入模組**即可完成遷移,EJB 業務邏輯代碼**零修改**。
<?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> <!-- 對應 standardjbosscmp-jdbc.xml 型別映射 -->
</metadata>
</local-tx-datasource>
</datasources>
放置於 `
<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>
InitialContext ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("java:/MySqlDS");
Connection conn = ds.getConnection(); // 成功即配置正確
| WebLogic 檔案 | JBoss 對應檔案 | 轉換重點 |
|---|---|---|
| `ejb-jar.xml` | `ejb-jar.xml` | **標準檔,僅 `multiplicity` 值需大寫** (`One`/`Many` 而非 `one`/`many`) |
| `weblogic-ejb-jar.xml` | `jboss.xml` | 廠商專屬:JNDI 名稱、資料源映射、快取/鎖定政策、安全身份 |
| `weblogic-cmp-rdbms-jar.xml` | `jbosscmp-jdbc.xml` | CMP 欄位-欄位映射、表建立/移除政策、查詢優化、關係映射 |
編寫 `jboss.xslt` 將 `weblogic-ejb-jar.xml` → `jboss.xml`,`jbosscmp.xslt` 將 `weblogic-cmp-rdbms-jar.xml` → `jbosscmp-jdbc.xml`。核心模板規則:
| 問題 | 原因 | 解決方案 |
|---|---|---|
| 建表失敗:主鍵長度超過 500 位元組 | MySQL 預設索引長度限制 (InnoDB 767 bytes / 3072 bytes 視版本) | 在 `standardjbosscmp-jdbc.xml` 的 `mySQL` 映射中,將 `java.lang.String` 對應的 SQL 型別從 `VARCHAR(255)` 縮減為 `VARCHAR(100)` 或適當長度 |
| 欄位名稱衝突 MySQL 保留字 | 如 `order`、`group`、`key` 等作為欄位名 | 修改 `jbosscmp-jdbc.xml` 中 ` |
| CMP 關係映射外鍵約束失敗 | MySQL 儲存引擎不支援 (MyISAM) 或語法差異 | 確保表為 InnoDB;檢查 `jbosscmp-jdbc.xml` ` |
META-INF/
ejb-jar.xml (標準,已調整 multiplicity)
jboss.xml (轉換自 weblogic-ejb-jar.xml)
jbosscmp-jdbc.xml (轉換自 weblogic-cmp-rdbms-jar.xml)
CatalogBean.class
Catalog.class (Remote Interface)
CatalogHome.class (Home Interface)
「標準化業務邏輯 + 廠商隔離部署描述檔」是 Java EE 移植性的核心承諾。善用 XSLT 自動化轉換,配合標準化資料源與安全抽象,WebLogic → JBoss 遷移可控、可重複、低風險。