Java EE 6 (JSR 316) 引入的 EJB 3.1 (JSR 318) 帶來里程碑式改進:**EJB 組件可直接打包在 WAR 的 `WEB-INF/classes` 或 `WEB-INF/lib/*.jar` 中**,無需獨立的 `ejb-jar.xml` 或 EAR 封裝。這意味著 Web 應用即可擁有事務、安全、並發、定時、異步等企業級服務,極大簡化了輕量級應用的部署與開發模型。本文通過 NetBeans 6.9 + GlassFish 3.0.1 實戰演示,展示如何創建、部署、測試內嵌 EJB 的 WebService。



在 `src/java/com/demo/ejb` 下創建 `CalculatorBean.java`:
package com.demo.ejb;
import javax.ejb.Stateless;
import javax.jws.WebService;
import javax.jws.WebMethod;
import javax.jws.WebParam;
@Stateless
@WebService(serviceName = "CalculatorService")
public class CalculatorBean {
@WebMethod(operationName = "add")
public int add(@WebParam(name = "a") int a, @WebParam(name = "b") int b) {
return a + b;
}
@WebMethod(operationName = "multiply")
public int multiply(@WebParam(name = "a") int a, @WebParam(name = "b") int b) {
return a * b;
}
}
關鍵點:
| 層級 | 傳統 EAR (Java EE 5) | Java EE 6 WAR 內嵌 |
|---|---|---|
| 部署單元 | `.ear` 包含 `.war` + `.jar` (EJB) | 單一 `.war` |
| EJB 位置 | `ejb-module.jar` 在 EAR 根目錄 | `WEB-INF/classes` 或 `WEB-INF/lib/*.jar` |
| 類加載隔離 | EAR 級 ClassLoader 隔離 | Web 應用單一 ClassLoader (簡化、但需注意依賴衝突) |
| 共享庫 | EAR `lib/` 目錄 | `WEB-INF/lib/` (同 WAR) |
| 部署描述符 | `application.xml` + `ejb-jar.xml` + `web.xml` | 可選 `web.xml`、`ejb-jar.xml` (註解優先) |
EJB 3.1 內嵌 WAR 是 Java EE 6 向「輕量級、規範驅動、零配置」邁出的關鍵一步。它讓 Web 開發者以極低成本獲得企業級服務,同時保持 WAR 部署的簡潔性。下篇將深入實戰:單例啟動緩存、異步報表生成、定時器清理過期數據、RESTful 整合 (JAX-RS),並展示如何在 Maven/Gradle 專案中實現相同結構。