Apache Axis 是一个非常经典和著名的 Java WebService 框架,虽然现在 Spring Boot 与 CXF/JAX-RS 的组合更为流行,但 Axis(特别是 Axis2)仍然是学习 WebService 原理和进行企业级集成的强大工具。

本教程将分为以下几个部分:
- Apache Axis 简介:了解它是什么,以及它的两个主要版本(Axis1 和 Axis2)的区别。
- 环境准备:搭建开发环境。
- 使用 Axis1 发布第一个 WebService (简单方式):通过 Axis 提供的 AdminServlet 发布一个简单的 Java 类。
- 使用 Axis1 发布第一个 WebService (复杂方式):通过
server-config.wsdd文件进行更灵活的配置。 - 使用 Axis1 调用 WebService (客户端):生成客户端代码并调用服务。
- 使用 Axis2 发布 WebService:介绍 Axis2 的发布方式。
- 总结与学习路径。
Apache Axis 简介
什么是 Axis? Axis 是一个 SOAP (Simple Object Access Protocol) 引擎,它允许你通过标准的 Web 协议(如 HTTP)来创建、部署和调用 WebService。
Axis1 vs. Axis2
| 特性 | Axis 1.x | Axis 2.x |
|---|---|---|
| 架构 | 基于 XML 的 Handler 链模型,较为陈旧。 | 采用模块化和数据绑定架构,更现代、灵活。 |
| 数据绑定 | 主要使用 DIME 和 ATTACHMENTS 处理附件。 | 支持 AXIOM (AXIs Object Model),性能更好,内存占用更低。 |
| API | 提供了较为复杂的 API,但易于上手。 | 提供了两种 API: - AXIOM API (底层) - DataBinding API (高层,如 ADB, XMLBeans) |
| 性能 | 相对较慢。 | 性能显著提升,尤其是在处理大消息时。 |
| 工具 | 主要使用 wsdl2java 和 java2wsdl。 |
提供了功能更强大的 axis2 命令行工具,支持 Maven 插件。 |
| 推荐度 | 已过时,不推荐新项目使用,但可用于维护旧系统。 | 推荐,对于需要使用 Axis 的项目,应选择 Axis2。 |
本教程重点: 由于 Axis1 的概念更基础,更容易理解 WebService 的核心原理,我们将首先详细介绍 Axis1,之后会简要介绍 Axis2 的发布方式。

环境准备
- JDK: 安装 JDK 1.6 或更高版本。
- IDE: Eclipse 或 IntelliJ IDEA。
- Web 服务器: Apache Tomcat 7.x 或更高版本。
- Axis1 库: 下载 Axis1 的二进制包,可以从 Apache Axis 官网 下载
axis-bin-1_4.zip。 - Axis2 库: 下载 Axis2 的二进制包,可以从 Apache Axis2 官网 下载
axis2-war-<version>.zip。
使用 Axis1 发布第一个 WebService (简单方式)
这种方式非常简单,适合快速测试。
步骤 3.1:创建 Web 项目
- 在 Eclipse 中创建一个新的 Dynamic Web Project,命名为
Axis1Demo。 - 将下载的
axis-bin-1_4.zip解压,将lib目录下的所有 JAR 文件复制到你的项目的WEB-INF/lib目录下。 - 将
axis-bin-1_4/webapps/axis目录下的所有文件(除了WEB-INF)复制到你的项目的根目录下,这包括axis、`` 等文件。 - 将
axis-bin-1_4/webapps/axis/WEB-INF目录下的web.xml文件内容合并到你项目的WEB-INF/web.xml文件中。注意不要覆盖,而是添加,Axis 的web.xml定义了关键的Servlet。
步骤 3.2:编写服务端代码
创建一个简单的 Java 类,我们将把它暴露为 WebService。
// src/com/example/HelloWorld.java
package com.example;
public class HelloWorld {
public String sayHello(String name) {
return "Hello, " + name + "!";
}
}
步骤 3.3:部署服务
Axis1 提供了一个内置的 Admin 页面来部署服务。
- 启动你的 Tomcat 服务器。
- 在浏览器中访问
http://localhost:8080/Axis1Demo/axis/(你的项目名是Axis1Demo)。 - 点击页面上的 "Validate" 链接,确保 Axis 环境配置正确。
- 点击 "Administer" 链接进入管理页面。
- 在 "Deploy" 标签页下,选择 "Upload a file"。
- 点击 "Browse...",选择你编译好的
HelloWorld.class文件(在WEB-INF/classes/com/example/目录下)。 - 点击 "Deploy" 按钮。
如果成功,你会看到部署成功的消息。

步骤 3.4:测试服务
- 访问
http://localhost:8080/Axis1Demo/axis/servlet/AxisServlet。 - 在页面中,你应该能看到你刚刚部署的
HelloWorld服务。 - 点击
HelloWorld链接,进入该服务的 WSDL 页面,你会看到一个类似http://localhost:8080/Axis1Demo/axis/HelloWorld.jws?wsdl的地址,这就是服务的描述文件。 - Axis 还提供了一个测试页面
http://localhost:8080/Axis1Demo/axis/HappyJaxRpcDev.jsp,输入服务名和方法名,可以直接调用。
使用 Axis1 发布 WebService (复杂方式)
简单方式虽然方便,但缺乏灵活性,复杂方式通过 server-config.wsdd 文件进行配置,可以更好地控制服务的生命周期、参数、类型映射等。
步骤 4.1:修改 web.xml
确保 web.xml 中有 AxisServlet 的映射,并且有一个 request 映射指向 *.jws。
<!-- WEB-INF/web.xml -->
...
<servlet>
<servlet-name>AxisServlet</servlet-name>
<servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/servlet/AxisServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>*.jws</url-pattern>
</servlet-mapping>
...
步骤 4.2:创建 server-config.wsdd
在你的项目根目录下(与 WEB-INF 同级),创建一个名为 server-config.wsdd 的文件。
步骤 4.3:编写部署脚本
创建一个 Java 类来生成 wsdd 文件内容。
// src/com/example/Deployer.java
package com.example;
import org.apache.axis.client.AdminClient;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import org.apache.axis.message.SOAPBodyElement;
import org.apache.axis.utils.Options;
import javax.xml.namespace.QName;
import java.io.File;
import java.io.FileReader;
import java.io.Reader;
public class Deployer {
public static void main(String[] args) throws Exception {
// AxisServlet 的访问地址
String url = "http://localhost:8080/Axis1Demo/servlet/AxisServlet";
// wsdd 部署描述符的内容
String wsdd = "<deployment xmlns=\"http://xml.apache.org/axis/wsdd/\" " +
"xmlns:java=\"http://xml.apache.org/axis/wsdd/providers/java\">" +
"<service name=\"HelloWorldWS\" provider=\"java:RPC\">" +
"<parameter name=\"className\" value=\"com.example.HelloWorld\"/>" +
"<parameter name=\"allowedMethods\" value=\"*\"/>" +
"</service>" +
"</deployment>";
AdminClient client = new AdminClient();
Options opts = new Options(args);
opts.setTargetEndpointAddress(url);
// 部署服务
client.process(new File("")); // 传入空文件,使用字符串部署
client.deploy(opts, new StringReader(wsdd));
System.out.println("部署成功!");
}
}
