首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

JBoss 4.x 上構建第一個 EJB 2.x 專案:從原始碼到部署完整實錄

     編輯:Java 程式設計入門

專案背景與動機

雖然 EJB 3 / Jakarta EE 8+ 已以註解簡化開發,但維護舊系統或學習企業級元件模型演進時,仍需理解 EJB 2.x 的「介面 + 部署描述檔 + Home/Remote 介面」經典架構。本文在 JBoss 4.x 環境下,以 Ant 建構、EAR 封裝、Servlet 測試的完整流程示範無狀態 Session Bean HelloEJB。

專案目錄結構


HelloEJB/
├── build.xml                 # Ant 建構腳本
└── src/
    ├── META-INF/
    │   ├── application.xml   # EAR 組裝描述
    │   ├── ejb-jar.xml       # EJB 標準部署描述
    │   └── jboss.xml         # JBoss 專屬 JNDI 綁定
    ├── powerwind/            # EJB 模組原始碼
    │   ├── Hello.java        # Remote 介面
    │   ├── HelloHome.java    # Home 介面
    │   └── HelloBean.java    # Bean 實作類
    └── WEB-INF/              # Web 模組 (測試 Servlet)
        ├── web.xml
        └── jboss-web.xml

核心原始碼

1. Remote 介面 Hello.java


package powerwind;
import java.rmi.RemoteException;
import javax.ejb.EJBObject;

public interface Hello extends EJBObject {
    String sayHello() throws RemoteException;
}

2. Home 介面 HelloHome.java


package powerwind;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBHome;

public interface HelloHome extends EJBHome {
    Hello create() throws RemoteException, CreateException;
}

3. Bean 實作 HelloBean.java


package powerwind;
import javax.ejb.*;

public class HelloBean implements SessionBean {
    private SessionContext ctx;

    public void ejbCreate() throws CreateException, RemoteException {}
    public void ejbActivate()  throws RemoteException {}
    public void ejbPassivate() throws RemoteException {}
    public void ejbRemove()    throws RemoteException {}

    public void setSessionContext(SessionContext ctx) { this.ctx = ctx; }

    public String sayHello() { return "Hello from ejb"; }
}

4. 測試 Servlet ClientServlet.java


package powerwind;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;

public class ClientServlet extends HttpServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        resp.setContentType("text/html;charset=UTF-8");
        PrintWriter out = resp.getWriter();
        String msg = "ERROR";
        try {
            InitialContext ic = new InitialContext();
            Object ref = ic.lookup("HelloEJB"); // jboss.xml 綁定的 JNDI 名
            HelloHome home = (HelloHome) PortableRemoteObject.narrow(ref, HelloHome.class);
            Hello hello = home.create();
            msg = hello.sayHello();
        } catch (Exception e) {
            e.printStackTrace(out);
        }
        out.println(msg);
    }
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException { doGet(req, resp); }
}

部署描述檔

ejb-jar.xml (標準)





    HelloEJB
    
        
            HelloEJB
            powerwind.HelloHome
            powerwind.Hello
            powerwind.HelloBean
            Stateless
            Container
        
    

jboss.xml (JBoss 專屬 JNDI 名稱)




    
        
            HelloEJB
            HelloEJB
        
    

application.xml (EAR 組裝)




    HelloEJB J2EE Application
    
        
            HelloEJB.war
            /HelloEJB
        
    
    
        HelloEJB.jar
    

web.xml (Servlet 註冊與 EJB 參考)




    
        ClientServlet
        powerwind.ClientServlet
    
    
        ClientServlet
        /ClientServlet
    
    
        HelloEJB
        Session
        powerwind.HelloHome
        powerwind.Hello
    

jboss-web.xml (Web 模組 EJB 參考綁定)




    
        HelloEJB
        HelloEJB
    

Ant 建構腳本 build.xml 關鍵目標



    
    
    
    
    

    
        
            
            
        
    

    
        
        
        
            
                
                
            
        
    

    
        
            
        
    

    
        
            
                
                
            
            
        
    

    
        
            
        
    

    
        
            
            
        
    

    
        
    

建置與部署步驟

  1. 設定環境變數:export JBOSS_HOME=/path/to/jboss-4.2.3.GA
  2. 執行 ant deploy (依序編譯 → JAR → WAR → EAR → 複製至 $JBOSS_HOME/server/default/deploy)。
  3. 啟動 JBoss:$JBOSS_HOME/bin/run.sh -c default。
  4. 瀏覽器訪問 https://localhost:8080/HelloEJB/ClientServlet,顯示 Hello from ejb 即成功。

常見坑點與排查

結語

EJB 2.x 雖繁瑣,但其「介面隔離、容器管理服務、聲明式事務/安全」的設計哲學深刻影響了後續 Spring、EJB 3、Jakarta EE 的演進。親手跑通這個 HelloWorld,能幫助理解遠端介面、Home 工廠、JNDI 查找、EAR 封裝等核心概念,為維護舊系統或學習現代框架打下堅實基礎。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
現象原因解決
javax.naming.NameNotFoundException: HelloEJB not boundJNDI 名稱不匹配確認 jboss.xml jndi-name、jboss-web.xml、Servlet lookup 三者一致
ClassCastException on narrowStub 類別未正確產生確保 ejb-jar.xml home/remote 全限定名正確;重新部署清理暫存
NoClassDefFoundError: javax/ejb/EJBObject編譯/執行時缺少 jboss-j2ee.jarAnt classpath 包含 ${jboss.home}/client/jboss-j2ee.jar
Servlet 404context-root 或 url-pattern 錯誤驗證 application.xml context-root + web.xml url-pattern