Ubuntu 22.04 安装 Apache Axis2 指南
在 Ubuntu 22.04 从零安装 Apache Axis2 2.0.1:apt 装 JDK 17、官方包 standalone 与 Tomcat 10.1 war 双方案部署、堆限制、systemd 托管、JDK 8 兼容实测与卸载。
Ubuntu 22.04 安装 Apache Axis2 指南
目标:在 Ubuntu 22.04 服务器上从零安装并运行 Apache Axis2 2.0.1,覆盖 apt 安装 JDK 17、多 JDK 共存切换、官方二进制发行包 standalone 部署与 Tomcat 10.1 war 部署、JVM 堆内存限制、systemd 托管与卸载清理,已在 Ubuntu 22.04.5 LTS(OpenJDK 17.0.20.1)实测通过。
一、环境信息
本篇所有命令与回显均在以下环境中实测采集,复现时请保持相近版本:
- 操作系统:Ubuntu 22.04.5 LTS,x86_64
- JDK:OpenJDK 17.0.20.1(
openjdk-17-jdk-headless,apt 官方仓库;另装 OpenJDK 1.8.0_504 用于兼容性对照) - 构建工具:Apache Maven 3.6.3(
maven,apt 仓库,快速入门示例使用) - 组件版本:Apache Axis2 2.0.1(downloads 站点当前最新版,2026-10 实测在架 1.8.0 / 1.8.2 / 2.0.0 / 2.0.1)
- Servlet 容器(方案 B):Apache Tomcat 10.1.61
- 服务端口:HTTP 8080(standalone / war 默认)
- 安装目录:
/opt/axis2(standalone)、/opt/tomcat10(war) - 执行用户:root
💡 说明:Axis2 2.0.1 的类文件版本为 61.0(Java 17 编译),实测在 OpenJDK 1.8.0_504 上启动直接报
UnsupportedClassVersionError,因此 Ubuntu 22.04 环境必须保证java命令解析到 17.x。老 JDK 8 项目请改用 Axis2 1.8.2(见"版本选型说明"与"常见问题")。
二、前置条件
本节完成软件源刷新、JDK 17 安装与基础工具准备。Ubuntu 22.04 的 apt 官方仓库自带 openjdk-17,无需第三方源。
2.1 安装 JDK 17 与基础工具
apt-get update -qq
DEBIAN_FRONTEND=noninteractive apt-get install -y openjdk-17-jdk-headless curl wget unzip
回显(实测,节选):
Setting up openjdk-17-jdk-headless:amd64 (17.0.20.1+1-1~22.04) ...
Processing triggers for ca-certificates (20240203) ...
Running hooks in /etc/ca-certificates/update.d...
done.
安装收尾无报错即成功。验证版本与工具:
java -version 2>&1 | head -1
javac -version
curl --version | head -1
回显(实测):
openjdk version "17.0.20.1" 2026-08-18
javac 17.0.20.1
curl 7.81.0 (x86_64-pc-linux-gnu) libcurl/7.81.0 OpenSSL/3.0.2 zlib/1.0.13
java/javac 输出 17、curl 可用,前置完成。Ubuntu 安装 openjdk-17 后 /usr/bin/java 默认即指向 17,无需手动切换;若系统同时装有多个 JDK,见 2.2。
2.2 多 JDK 共存与版本切换(可选)
如需保留旧版本 JDK(如 1.8)对照验证,一并安装并存切换:
DEBIAN_FRONTEND=noninteractive apt-get install -y openjdk-8-jdk-headless
update-alternatives --list java
回显(实测,本机另装有 openjdk-11):
/usr/lib/jvm/java-11-openjdk-amd64/bin/java
/usr/lib/jvm/java-17-openjdk-amd64/bin/java
/usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
切换系统默认并验证(切换后记得切回,Axis2 2.0.1 需要 17):
update-alternatives --set java /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
java -version 2>&1 | head -1
update-alternatives --set java /usr/lib/jvm/java-17-openjdk-amd64/bin/java
java -version 2>&1 | head -1
回显(实测):
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java to provide /usr/bin/java (java) in manual mode
openjdk version "1.8.0_504"
update-alternatives: using /usr/lib/jvm/java-17-openjdk-amd64/bin/java to provide /usr/bin/java (java) in manual mode
openjdk version "17.0.20.1" 2026-08-18
--set 即时生效,java -version 随切换变化。
💡 技术拓展:JDK 版本管理方式对比——
方式 原理 适用场景 update-alternatives --set 系统级符号链接切换 /usr/bin/java全机统一默认版本 JAVA_HOME 环境变量 仅对读取该变量的脚本生效 按应用隔离版本 systemd 单元 Environment 服务进程内注入变量 服务级隔离,互不影响 ⚠️ 注意:Axis2 启动脚本 axis2server.sh 实际执行的是 PATH 中的
java命令(实测确认),系统默认 java 版本决定 Axis2 实际运行时;JAVA_HOME 只用于脚本非空校验与工具类路径拼接。多 JDK 环境部署前先java -version确认。
三、版本选型说明
官方下载站 https://dlcdn.apache.org/axis/axis2/java/core/ 2026-10 实测在架版本与文件如下:
| 版本线 | 在架版本 | 发行包 | Java 要求(实测) | 说明 |
|---|---|---|---|---|
| 2.0.x | 2.0.0 / 2.0.1 | axis2-<ver>-bin.zip、axis2-<ver>-war.zip | Java 17+(类文件 61.0,JDK 8 实测报错) | 当前最新主线,jakarta.servlet |
| 1.8.x | 1.8.0 / 1.8.2 | axis2-<ver>-bin.zip | Java 8+(JDK 8/17 实测均可运行) | 维护线,需修一处发行包脚本 bug(见常见问题) |
关键差异:2.0.1 基于 jakarta.servlet 命名空间(war 方案必须 Tomcat 10.1+),1.8.2 基于 javax.servlet(Tomcat 9 可用)。新部署优先 2.0.1;需兼容 JDK 8 老环境选 1.8.2 并修脚本 bug。
本篇以 2.0.1 为主线。发行包形态:bin 为独立服务器发行包(自带启动脚本),war 为 Servlet 容器 Web 归档。
四、方案 A:官方二进制发行包部署(standalone)
standalone 方案使用 bin 包自带的 SimpleAxis2Server 直接监听 HTTP 端口,无需 Servlet 容器,是最快可用的部署路径。
4.1 下载与校验
mkdir -p /opt/software && cd /opt/software
wget https://dlcdn.apache.org/axis/axis2/java/core/2.0.1/axis2-2.0.1-bin.zip
wget https://dlcdn.apache.org/axis/axis2/java/core/2.0.1/axis2-2.0.1-bin.zip.sha512
ls -la
回显(实测):
-rw-r--r-- 1 root root 104726301 May 18 00:26 axis2-2.0.1-bin.zip
-rw-r--r-- 1 root root 128 May 18 00:26 axis2-2.0.1-bin.zip.sha512
官方 .sha512 是 128 位裸哈希(无换行、无文件名),sha512sum -c 会报格式错误,用比对法校验:
[ "$(sha512sum axis2-2.0.1-bin.zip | awk '{print $1}')" = "$(cat axis2-2.0.1-bin.zip.sha512)" ] && echo "sha512 OK"
回显(实测):
sha512 OK
4.2 解压安装到 /opt/axis2
unzip -q axis2-2.0.1-bin.zip
mv axis2-2.0.1 /opt/axis2
ls /opt/axis2
回显(实测):
LICENSE.txt NOTICE.txt README-std-bin.txt README.txt RELEASE-NOTE.txt
bin conf installation-std-bin.txt lib modules repository webapp
bin 启动与代码生成脚本;conf 全局配置;lib 运行时 jar;modules 模块包(.mar);repository 服务仓库;webapp war 打包素材。启动脚本清单:
ls /opt/axis2/bin
回显(实测):
axis2.bat axis2server.bat java2wsdl.bat setenv.sh wsdl2java.bat
axis2.sh axis2server.sh java2wsdl.sh wsdl2java.sh
4.3 限制 JVM 堆内存(256-512MB)
axis2server.sh 内部会把 JAVA_OPTS 置空重写(外部环境变量注入无效,实测确认),堆参数必须直接改脚本第 35 行:
sed -i 's/^JAVA_OPTS=""/JAVA_OPTS="-Xms256m -Xmx512m"/' /opt/axis2/bin/axis2server.sh
grep -n '^JAVA_OPTS=' /opt/axis2/bin/axis2server.sh | head -1
回显(实测):
35:JAVA_OPTS="-Xms256m -Xmx512m"
4.4 启动 standalone 服务
脚本要求 JAVA_HOME 必须非空(为空直接退出):
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
nohup /opt/axis2/bin/axis2server.sh > /var/log/axis2.log 2>&1 &
sleep 20
tail -3 /var/log/axis2.log
回显(实测):
08:53:04.620 [main] INFO org.apache.axis2.kernel.SimpleAxis2Server - [SimpleAxisServer] Starting
08:53:05.006 [HttpListener-8080-1] INFO org.apache.axis2.transport.http.server.DefaultConnectionListener - Listening on port 8080
08:53:05.012 [main] INFO org.apache.axis2.kernel.SimpleAxis2Server - [SimpleAxisServer] Started
出现 Listening on port 8080 与 [SimpleAxisServer] Started 即启动成功(前段日志会逐条打印 mex/jaxws/addressing/ping/mtompolicy 五个模块与内置 Version 服务的部署)。验证堆参数实际生效:
/usr/lib/jvm/java-17-openjdk-amd64/bin/jps -v | grep SimpleAxis2Server
回显(实测):
5135 SimpleAxis2Server -Xms256m -Xmx512m
4.5 验证服务可用
调用内置 Version 服务:
curl -s "http://localhost:8080/axis2/services/Version/getVersion"
回显(实测):
<ns:getVersionResponse xmlns:ns="http://axisversion.sample"><ns:return>Hi - the Axis2 version is 2.0.1</ns:return></ns:getVersionResponse>
查看服务列表页(standalone 由 ListingAgent 渲染,URL 必须带尾部斜杠):
curl -s "http://localhost:8080/axis2/services/"
回显(实测,未部署其他服务时):
<html><head><title>Axis2: Services</title></head><body><h2>Deployed services</h2><h3><a href="Version?wsdl">Version</a></h3>Available operations <ul><li>getVersion</li></ul></body></html>
⚠️ 注意:standalone 的服务列表地址是
/axis2/services/(带斜杠);访问/axis2/services/ListServices返回 501 Not Implemented、不带斜杠的/axis2/services返回空响应,均属正常行为差异,不是服务故障。
4.6 systemd 托管
创建服务单元 /etc/systemd/system/axis2.service(systemd 服务不继承 shell 环境,JAVA_HOME 必须显式声明,路径以 update-alternatives --list java 查到的为准):
cat > /etc/systemd/system/axis2.service << 'EOF'
[Unit]
Description=Apache Axis2 Standalone Server
After=network.target
[Service]
Type=simple
User=root
Environment=JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
Environment=AXIS2_HOME=/opt/axis2
ExecStart=/opt/axis2/bin/axis2server.sh
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
先停掉手工启动的进程,再注册并启动:
kill $(jps | grep SimpleAxis2Server | awk '{print $1}')
systemctl daemon-reload
systemctl enable axis2
systemctl start axis2
sleep 16
systemctl is-active axis2
回显(实测):
Created symlink /etc/systemd/system/multi-user.target.wants/axis2.service → /etc/systemd/system/axis2.service.
active
业务面复验与停止:
curl -s "http://localhost:8080/axis2/services/Version/getVersion"
jps -v | grep SimpleAxis2Server
systemctl stop axis2
systemctl is-active axis2
回显(实测):
<ns:getVersionResponse xmlns:ns="http://axisversion.sample"><ns:return>Hi - the Axis2 version is 2.0.1</ns:return></ns:getVersionResponse>
8922 SimpleAxis2Server -Xms256m -Xmx512m
inactive
托管下服务可调用、堆参数仍生效,stop 后 inactive,启停闭环完成。
五、方案 B:axis2.war + Tomcat 10.1 部署
war 方案把 Axis2 部署进 Servlet 容器,适合与既有 Java Web 应用共存、需要 axis2-web 管理页面的场景。Axis2 2.0.1 使用 jakarta.servlet 命名空间,实测 Tomcat 9 会报 ClassNotFoundException: jakarta.servlet.http.HttpServlet,必须 Tomcat 10.1+。
5.1 下载并安装 Tomcat 10.1
cd /opt/software
wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.61/bin/apache-tomcat-10.1.61.tar.gz
tar xzf apache-tomcat-10.1.61.tar.gz
mv apache-tomcat-10.1.61 /opt/tomcat10
/opt/tomcat10/bin/version.sh | grep -E "Server version|JVM"
回显(实测):
Server version: Apache Tomcat/10.1.61
JVM Version: 17.0.20.1+1-1-22.04-Ubuntu
5.2 下载并部署 axis2.war
cd /opt/software
wget https://dlcdn.apache.org/axis/axis2/java/core/2.0.1/axis2-2.0.1-war.zip
unzip -q -o axis2-2.0.1-war.zip
ls -la axis2.war
回显(实测):
-rw-r--r-- 1 root root 37418722 May 17 23:08 axis2.war
放入 Tomcat 并启动:
cp axis2.war /opt/tomcat10/webapps/
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
/opt/tomcat10/bin/startup.sh
sleep 20
grep -E "Deploying web application archive|BindException" /opt/tomcat10/logs/catalina.out | tail -2
回显(实测):
Deploying web application archive [/opt/tomcat10/webapps/axis2.war]
⚠️ 注意:若与方案 A 并存,两者默认都监听 8080,Tomcat 启动会报
java.net.BindException: Address already in use(catalina.out 实测可见),此后请求全由先占端口的进程应答,极易误判。并存时先停用其一或错开端口。
5.3 验证 war 部署
war 模式的服务列表页是 axis2-web 的 listServices 页面(与 standalone 的 /axis2/services/ 不同):
curl -s -o /dev/null -w "%{http_code}\n" "http://localhost:8080/axis2/services/listServices"
curl -s "http://localhost:8080/axis2/services/Version?getVersion"
回显(实测):
200
<ns:getVersionResponse xmlns:ns="http://axisversion.sample"><ns:return>Hi - the Axis2 version is 2.0.1</ns:return></ns:getVersionResponse>
5.4 自定义服务仓库路径
war 默认使用应用内部 WEB-INF/services 目录(初始仅含 version 服务)。热部署外部服务需在 /opt/tomcat10/webapps/axis2/WEB-INF/web.xml 的 AxisServlet <servlet> 段内加入 init-param:
<init-param>
<param-name>axis2.repository.path</param-name>
<param-value>/opt/axis2-repo</param-value>
</init-param>
准备外部仓库并重启 Tomcat:
mkdir -p /opt/axis2-repo/services /opt/axis2-repo/modules
cp /opt/axis2/repository/modules/*.mar /opt/axis2-repo/modules/
/opt/tomcat10/bin/shutdown.sh
sleep 5
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
/opt/tomcat10/bin/startup.sh
sleep 20
curl -s "http://localhost:8080/axis2/services/listServices" | grep -oE "services/[A-Za-z]+\?wsdl" | sort -u
回显(实测,向 /opt/axis2-repo/services 放入服务包后):
services/HelloService?wsdl
services/Version?wsdl
外部仓库服务被 war 正常加载,仓库指向生效。
六、方案对比与选择建议
| 维度 | 方案 A:bin standalone | 方案 B:war + Tomcat 10.1 |
|---|---|---|
| 版本 | 2.0.1 | 2.0.1 |
| 是否需联网 | 下载时需要 | 下载时需要 |
| 依赖 | 仅 JDK 17+ | JDK 17+ 与 Tomcat 10.1+ |
| 服务管理 | 自带 systemd 单元 | Tomcat 生命周期托管 |
| 监听端口 | 8080(axis2.xml 可改) | 8080(server.xml 可改) |
| 管理页面 | 无(仅 /axis2/services/ 列表) | 有 axis2-web(listServices、HappyAxis) |
| 优点 | 轻、启动快、零额外组件 | 与 Web 应用共存、仓库路径灵活 |
| 缺点 | 无管理 UI | 多一层容器、需规划端口 |
选择建议:快速验证与单机轻量部署选方案 A;生产环境与 Web 应用共容器、需要管理页面选方案 B。两者服务仓库格式一致,可随时迁移。
七、配置说明
两方案共用的关键配置项与位置:
| 配置项 | 位置 | 说明 |
|---|---|---|
| JVM 堆 | /opt/axis2/bin/axis2server.sh 第 35 行 JAVA_OPTS | 实测改为 -Xms256m -Xmx512m 后 jps -v 可见生效 |
| HTTP 监听端口 | /opt/axis2/conf/axis2.xml transportReceiver http 的 port 参数 | 默认 8080,改动后重启生效 |
| 全局参数 | /opt/axis2/conf/axis2.xml | 热部署、MTOM、REST 等开关 |
| 日志级别 | /opt/axis2/conf/log4j2.xml | root level 默认 INFO |
| JAVA_HOME | systemd 单元 Environment= 或 shell 环境 | 脚本强校验,缺失即退出 |
systemd 托管下修改 JVM 参数后需 systemctl daemon-reload(若改了单元文件)并 systemctl restart axis2,再用 jps -v 复核实际生效值。
八、常见问题(FAQ)
Q1:启动报 UnsupportedClassVersionError,如何解决? 报错原文(实测):
Exception in thread "main" java.lang.UnsupportedClassVersionError: org/apache/axis2/kernel/SimpleAxis2Server has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 52.0
原因:Axis2 2.0.1 类文件是 Java 17 编译(61.0),实际运行的 java 是 1.8(52.0)。解决:update-alternatives --set java /usr/lib/jvm/java-17-openjdk-amd64/bin/java 后重启(实测恢复),或改用 Axis2 1.8.2。
Q2:1.8.2 启动报 Could not find or load main class? 报错原文(实测,任何 JDK 下均复现):
Error: Could not find or load main class org.apache.axis2.transport.SimpleAxis2Server
Caused by: java.lang.ClassNotFoundException: org.apache.axis2.transport.SimpleAxis2Server
原因:1.8.2 发行包 axis2server.sh 第 64 行写错主类包名(transport),实际类在 lib/axis2-kernel-1.8.2.jar 的 org/apache/axis2/kernel/SimpleAxis2Server。解决:
sed -i 's/org.apache.axis2.transport.SimpleAxis2Server/org.apache.axis2.kernel.SimpleAxis2Server/' /opt/axis2/bin/axis2server.sh
修复后 1.8.2 在 JDK 8 与 JDK 17 上实测均正常返回 Hi - the Axis2 version is 1.8.2。
Q3:Tomcat 9 部署 axis2.war 后请求全部 404/资源未找到? 实测 Tomcat 日志(logs/localhost.<date>.log):
SEVERE [main] org.apache.catalina.core.StandardContext.loadOnStartup Servlet [AxisServlet] in web application [/axis2] threw load() exception
java.lang.ClassNotFoundException: jakarta.servlet.http.HttpServlet
原因:Axis2 2.0.1 基于 jakarta.servlet,Tomcat 9 只提供 javax.servlet。解决:换 Tomcat 10.1+(本篇实测 10.1.61 正常)。
Q4:Ubuntu 下运行 bin 目录脚本时刷屏 "[: not found" 或 "[[: not found"? 实测运行 wsdl2java.sh / java2wsdl.sh 时控制台出现:
/opt/axis2/bin/axis2.sh: 49: [[: not found
原因:Ubuntu 的 /bin/sh 指向 dash,不支持 bash 的 [[ 语法,axis2.sh 第 49 行触发。实测该告警不影响工具执行结果(WSDL 照常生成);如需消除,可用 bash /opt/axis2/bin/wsdl2java.sh ... 方式调用。CentOS 的 /bin/sh 指向 bash,无此告警。
Q5:8080 端口被占用导致 Tomcat 或 standalone 启动异常?
现象:Tomcat catalina.out 报 java.net.BindException: Address already in use,或 standalone 日志出现连接监听器反复重试。排查与处理(最小化安装的系统若缺 ss 命令,先 apt-get install -y iproute2):
ss -tlnp | grep 8080
回显(实测):
LISTEN 0 50 *:8080 *:* users:(("java",pid=9441,fd=133))
找到占用进程(pid=9441 的 java 进程)后停用其一,或修改 axis2.xml 的 http 端口 / Tomcat server.xml 的 Connector 端口后重启。
九、卸载与清理
完整卸载两方案的全部产物:
systemctl stop axis2
systemctl disable axis2
rm -f /etc/systemd/system/axis2.service
systemctl daemon-reload
/opt/tomcat10/bin/shutdown.sh
rm -rf /opt/axis2 /opt/tomcat10 /opt/axis2-repo /opt/software/axis2-2.0.1* /opt/software/apache-tomcat-10.1.61.tar.gz
回显(实测):
Removed /etc/systemd/system/multi-user.target.wants/axis2.service.
验证清理结果:
jps | grep SimpleAxis2Server; ls /opt/axis2 2>&1
回显(实测):
ls: cannot access '/opt/axis2': No such file or directory
jps 无输出、目录不存在即卸载干净。apt 安装的 JDK 如需一并移除:apt-get purge -y openjdk-17-jdk-headless openjdk-8-jdk-headless(确认无其他 Java 应用依赖后再执行)。
十、参考链接
- Apache Axis2 官网:https://axis.apache.org/axis2/java/core/
- 官方下载目录(版本与校验文件):https://dlcdn.apache.org/axis/axis2/java/core/
- 二进制发行包安装说明:https://axis.apache.org/axis2/java/core/installationguide.html
- Axis2 配置参考:https://axis.apache.org/axis2/java/core/docs/axis2config.html
- Tomcat 10.1 下载:https://dlcdn.apache.org/tomcat/tomcat-10/