Metro 是 Sun 開源的 Web 服務堆疊,整合 JAXB 2.x、JAX-WS 2.x 參考實現與 WS-* 擴展。可獨立部署於 Tomcat 等 Servlet 容器,亦內建於 Glassfish。本文對比 Metro 與 Axis2 架構差異,並以圖書館服務示範從 WSDL 生成代碼到 WAR 部署的完整流程。
| 維度 | Metro | Axis2 |
|---|---|---|
| 核心基礎 | JAXB 2.x + JAX-WS 2.x(唯一支援) | 模組化,支援多種資料綁定 |
| 處理器架構 | 整合於引擎,非可拔插模組 | 模組化處理器鏈,高度可配置 |
| WSDL 角色 | 運行時必需,動態構建服務模型 | 主要用於代碼生成,運行時可選 |
| 部署單元 | 每服務一個 WAR,含 sun-jaxws.xml | 單一 Axis2 WAR 托管多服務(AAR) |
| 管理工具 | 無內建,依賴外部監控 | Web 控制台支援部署/監控 |
四個操作:getBook、getBooksByType、getTypes、addBook。WSDL 與 Axis2 版本相同,僅服務名與端點不同。
<listener>
<listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
</listener>
<servlet>
<servlet-name>MetroLibraryPort</servlet-name>
<servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>MetroLibraryPort</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<endpoints version="2.0" xmlns="https://java.sun.com/xml/ns/jax-ws/ri/runtime">
<endpoint name="MetroLibraryPort"
implementation="com.example.MetroLibraryImpl"
url-pattern="/"
wsdl-location="WEB-INF/wsdl/library.wsdl"/>
</endpoints>
若省略 wsdl-location,Metro 會自動生成 WSDL;使用 WSIT 時必須提供包含策略擴展的 WSDL。
Java SE 6+ 內建 JAX-WS API,若 Metro 版本較新會發生類載入衝突。解決方案:
java.endorsed.dirs 指向 Metro webservices-api.jar(Tomcat 可用 JAVA_ENDORSED_DIRS 環境變數)JRE/lib/endorsed/ 放入 webservices-api.jar採用方案 2/3 時,WAR 無需打包該 JAR。
build.properties 的 metro-homeant:調用 wsimport 生成代碼、編譯、打包 metro-library.warCATALINA_OPTS=-Dcom.sun.xml.ws.fault.SOAPFaultBuilder.disableCaptureStackTrace=false 避免預設發送堆疊追蹤導致客戶端 NPEant run 執行客戶端測試與 Axis2/JAX-WS 版本相同:wsimport 生成服務介面,客戶端透過注入 WebServiceRef 或手動建立 Service 呼叫操作。
Metro 採用嵌入式部署模型,配置簡潔(web.xml + sun-jaxws.xml),適合「一服務一 WAR」的微服務風格。下一篇將深入 WS-Security 配置與互操作性。