EJB 不直接執行,而是透過部署工具打包配置,生成含部署描述符的 JAR/EAR,再部署至應用伺服器。各廠商提供專屬工具 (Sun deploytool、WebLogic Console、JBoss CLI 等),流程大同小異。
HelloWorld.ear)HelloWorldSession.class、HelloWorldSessionHome.class、HelloWorldSessionImpl.class| 角色 | 類別 |
|---|---|
| Enterprise Bean Class | HelloWorldSessionImpl |
| Home Interface | HelloWorldSessionHome |
| Remote Interface | HelloWorldSession |
helloClient.jar),含 Stub/Tie 類別HelloWorld (客戶端查找鍵值)
// 方式 1:預設環境 (需 JVM 參數指定 factory)
Context ctx = new InitialContext();
// 方式 2:程式化指定 Properties (WebLogic 範例)
Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
props.put(Context.PROVIDER_URL, "t3://localhost:7001");
Context ctx = new InitialContext(props);
// 必須使用 PortableRemoteObject.narrow,不可直接 (HomeInterface) ctx.lookup()
HelloWorldSessionHome home = (HelloWorldSessionHome)
PortableRemoteObject.narrow(ctx.lookup("HelloWorld"), HelloWorldSessionHome.class);
原因:EJB 使用 RMI-IIOP,遠端物件參考需經 CORBA 窄化轉換,標準 Java 強制轉換無效。
HelloWorldSession session = (HelloWorldSession) home.create();
// 或帶參數建立 (若 Home 定義多載 create)
HelloWorldSession session2 = (HelloWorldSession) home.create("Guten Tag!");
System.out.println(session.getGreeting());
session.setGreeting("Howdy!");
System.out.println(session.getGreeting());
session.remove(); // 釋放 Bean
package usingj2ee.hello;
import java.util.*;
import javax.naming.*;
import javax.rmi.*;
public class TestHello {
public static void main(String[] args) {
try {
Context ctx = new InitialContext();
HelloWorldSessionHome home = (HelloWorldSessionHome)
PortableRemoteObject.narrow(ctx.lookup("HelloWorld"), HelloWorldSessionHome.class);
HelloWorldSession session = (HelloWorldSession) home.create();
System.out.println("預設問候: " + session.getGreeting());
session.setGreeting("Howdy!");
System.out.println("修改後: " + session.getGreeting());
session.remove();
// 重新建立帶參數會話
session = (HelloWorldSession) home.create("Guten Tag!");
System.out.println("新會話: " + session.getGreeting());
session.remove();
} catch (Exception e) { e.printStackTrace(); }
}
}
| 項目 | Sun J2EE SDK | BEA WebLogic | JBoss |
|---|---|---|---|
| 部署工具 | deploytool (GUI) | Console / Ant Task / WLDeploy | Management Console / CLI / Maven |
| Client JAR | 需明確生成 | 動態生成,通常不需額外 JAR | 需生成 (client.jar) |
| JNDI Factory | com.sun.jndi.cosnaming.CNCtxFactory | weblogic.jndi.WLInitialContextFactory | org.jnp.interfaces.NamingContextFactory |
| DataSource 配置 | deploytool 資源參考 | config.xml / Console 設定 | *-ds.xml / 管理主控台 |
jndi.properties 檔案或資源檔,避免硬編碼 Factory 類別EJB 部署與客戶端開發的核心在於:部署工具生成正確描述符、JNDI 邏輯名稱正確綁定、客戶端正確使用 PortableRemoteObject.narrow。掌握 deploytool 操作流程、理解 RMI-IIOP 窄化機制、熟悉跨廠商差異,是 EJB 開發者必備的工程化技能。