隨著 W3C 核心規範更新與 JCP 整合,Web 服務技術日趨成熟。然而,當應用需跨多個 Web 容器(WebSphere、WebLogic、JBoss、Tomcat)部署時,缺乏統一的標準部署描述符(如 web.xml 之於 Servlet)成為主要痛點。本文詳細剖析 Java Web 服務在不同容器上的部署差異,展示各類部署描述符生成實踐,並闡述 JSR-181 如何通過註解簡化開發部署流程。
Web 服務提供者(伺服器端)若將實現(如 Axis)打包進 WAR,易引發類加載器衝突;最佳實踐是使用容器內建實現。但各容器部署描述符迥異:
webservices.xml、WSDL、JAX-RPC 映射文件、序列化類。deploy.wsdd,啟動後透過 Axis AdminService 部署,或預先生成 service-config.wsdd 打包入 WAR。jwsc Ant 任務生成標準構件。以開源工具集為例,目標:單一專案生成可跨容器部署的 WAR,僅修改描述符無需重編譯。
使用 JWSDP wscompile 處理服務端點介面(SEI),生成 WSDL、映射文件、存根/綁定代碼。配置文件指定服務名、命名空間、套件名、SEI 及實現類。
最終必須手工編寫 webservices.xml 綁定所有構件:
<webservices ...>
<webservice-description>
<webservice-description-name>StatsWS</...>
<wsdl-file>WEB-INF/wsdl/StatsWS.wsdl</...>
<jaxrpc-mapping-file>WEB-INF/mapping.xml</...>
<port-component>
<service-endpoint-interface>com.example.StatsService</...>
<service-impl-bean><servlet-link>StatsWS</...></...>
</port-component>
</webservice-description>
</webservices>
web.xml 中聲明 Servlet 綁定實現類:
<servlet>
<servlet-name>StatsWS</servlet-name>
<servlet-class>com.example.StatsServiceImpl</servlet-class>
</servlet>
兩步驟:
Java2WSDL Ant 任務從 SEI 生成 WSDL。WSDL2Java 生成部署描述符 deploy.wsdd(及伺服器端綁定代碼)。部署時需修改 web.xml 註冊 AxisServlet 及映射,啟動容器後執行 Axis AdminClient 部署 deploy.wsdd,或預先生成 service-config.wsdd 打包入 WAR 實現自動部署。
| 容器 | 關鍵步驟 |
|---|---|
| JBoss 4.0.4 | 編寫 webservices.xml + web.xml Servlet 綁定 → 打包 WAR 部署 |
| WebSphere | 專有工具從 SEI 生成 WSDL → 生成專有部署描述符 → 打包 WAR |
| Tomcat + Axis | web.xml 註冊 AxisServlet → 生成 deploy.wsdd → 啟動後 AdminClient 部署或預打包 service-config.wsdd |
| WebLogic 9.x | JSR-181 註解 SEI/實現類 → JDK 5.0 編譯 → jwsc Ant 任務生成構件 → 打包 WAR |
JSR-181 (Web Services Metadata) 引入 JDK 5.0 註解,目標:簡化開發模型、減少構件維護、定義構建部署標準、工具可操作語法。
| 註解 | 用途 | 位置 |
|---|---|---|
@WebService | 標記類/介面為 Web 服務,指定 name、targetNamespace、serviceName、endpointInterface | 類/介面 |
@SOAPBinding | 控制 SOAP 風格 (RPC/Document) 與編碼 | 類/介面 |
@WebMethod | 自定義操作名、SOAPAction、是否暴露 | 方法 |
@WebParam | 自定義參數名、模式 (IN/OUT/INOUT)、命名空間 | 參數 |
@WebResult | 自定義返回值名稱 | 方法 |
規範未限制處理器實現細節,僅要求產出可部署服務且 WSDL 一致。主要兩類:
jwsc、Apache Beehive):構建期生成容器專有描述符,允許進一步自定義。@WebService、@WebMethod 等註解。deploy 目錄啟動,JBossWS 自動部署。跨容器部署 Java Web 服務歷經從手工編寫多套描述符、到 Axis 統一運行時、再到 JSR-181 註解驅動的演進。JSR-181 將架構設計意圖(介面用途)與部署綁定,讓開發者聚焦業務邏輯,由平台負責轉譯為可部署方案。雖處理器實現各異,但「一次編寫,多處部署」的願景已基本實現。