Ubuntu 22.04 安装 Apache Axis2 指南

在 Ubuntu 22.04 从零安装 Apache Axis2 2.0.1:apt 装 JDK 17、官方包 standalone 与 Tomcat 10.1 war 双方案部署、堆限制、systemd 托管、JDK 8 兼容实测与卸载。

Apache Axis2Axis22026/10/13

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.x2.0.0 / 2.0.1axis2-<ver>-bin.zip、axis2-<ver>-war.zipJava 17+(类文件 61.0,JDK 8 实测报错)当前最新主线,jakarta.servlet
1.8.x1.8.0 / 1.8.2axis2-<ver>-bin.zipJava 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.12.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.xmlroot level 默认 INFO
JAVA_HOMEsystemd 单元 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 应用依赖后再执行)。

十、参考链接