Apache Axis 是基於 Java 的 SOAP 引擎,實現了 JAX-RPC 規範,支持將 Java 類快速暴露為 Web Service。雖已進入維護模式 (Axis 2.x 為主流),但大量存量系統仍在運行,理解其部署模型對維護遷移仍有價值。
CATALINA_HOME。webapps/axis 整個目錄複製到 $CATALINA_HOME/webapps/。axis/WEB-INF/lib/*.jar 加入系統 CLASSPATH,或依賴 Web 容器類加載機制 (推薦)。關鍵 Jar:axis.jar, commons-discovery.jar, commons-logging.jar, jaxrpc.jar, saaj.jar, log4j.jar, xercesImpl.jar, xml-apis.jar。啟動 Tomcat,訪問 https://localhost:8080/axis/happyaxis.jsp。頁面顯示綠色「All required libraries are present」及組件版本信息即成功。
.jws (如 Distance.jws) 放入 webapps/axis/。https://localhost:8080/axis/Distance.jws?wsdl 即可獲取 WSDL。// Distance.jws
public class Distance {
public double convertMile2Kilometre(double mile) {
return mile * 1.609;
}
}
特點:無需編譯、無需描述文件、熱部署、適合測試/演示;缺點:需源碼、無法配置事務/安全/處理器鏈、生產環境不推薦。
.class,放入 webapps/axis/包名/ (如 samples/capacity/Capacity.class)。deploy.wsdd:<deployment xmlns="https://xml.apache.org/axis/wsdd/"
xmlns:java="https://xml.apache.org/axis/wsdd/providers/java">
<service name="Capacity" provider="java:RPC">
<parameter name="className" value="samples.capacity.Capacity"/>
<parameter name="allowedMethods" value="*"/> <!-- 暴露所有公共方法 -->
<!-- 可配置 handler、faultFlow、security 等 -->
</service>
</deployment>
java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.wsdd
輸出 <Admin>Done processing</Admin> 即成功。訪問 https://localhost:8080/axis/services/Capacity?wsdl 驗證。
Axis 提供動態調用 API (Service/Call) 無需生成 Stub:
Service service = new Service();
Call call = (Call) service.createCall();
// 調用 JWS 服務
call.setTargetEndpointAddress("https://localhost:8080/axis/Distance.jws");
call.setOperationName("convertMile2Kilometre");
call.addParameter("op1", XMLType.XSD_DOUBLE, ParameterMode.IN);
call.setReturnType(XMLType.XSD_DOUBLE);
Double result = (Double) call.invoke(new Object[]{ 190.0 });
System.out.println("190 英里 = " + result + " 公里");
// 調用 WSDD 服務 (端點不同)
call = (Call) service.createCall();
call.setTargetEndpointAddress("https://localhost:8080/axis/services/Capacity");
call.setOperationName("convertGallon2Litre");
call.addParameter("op1", XMLType.XSD_DOUBLE, ParameterMode.IN);
call.setReturnType(XMLType.XSD_DOUBLE);
result = (Double) call.invoke(new Object[]{ 10.0 });
System.out.println("10 加侖 = " + result + " 升");
| 場景 | 配置要點 |
|---|---|
| 複雜類型傳遞 | WSDD 中添加 <typeMapping> 映射 Java Bean 到 XML Schema;或使用 BeanSerializerFactory。 |
| 處理器鏈 | 在 server-config.wsdd 定義 <handler> 和 <requestFlow>/<responseFlow> 實現日誌、驗證、加密等橫切關注點。 |
| 會話管理 | 服務端 MessageContext.getSession() 獲取 HTTP Session;客戶端 call.setMaintainSession(true) 保持 Cookie。 |
| 異常處理 | 拋出 java.rmi.RemoteException 或自定義異常 (需在 WSDD faultFlow 映射)。 |
| 性能調優 | 啟用 HTTP Keep-Alive、調整線程池、使用 AxisEngine 直接調用繞過 Servlet 層 (嵌入式場景)。 |
wsimport (JAX-WS) 或 wsdl2java (CXF) 重新生成客戶端/服務端代碼,業務邏輯盡量復用。