Apache Struts 安装指南
Ubuntu 22.04 安装 Struts 6.12.0 指南:JDK 17/Maven/Tomcat 9 环境准备,6.x 与 7.x 版本选型,archetype 生成工程与引入依赖两方案,JVM 堆配置与卸载,全程实测。
Apache Struts 安装指南
目标:在 Ubuntu 22.04 服务器上完成 Apache Struts 6.12.0 开发环境的安装与验证。Apache Struts 是经典的 Java Web MVC 框架,以 jar 库形式发布,本身没有独立守护进程,所谓「安装」实际是准备好 JDK、Maven 与 Servlet 引擎(Tomcat 9)三类基础环境,并通过 Maven archetype 生成可构建运行的 Struts 工程。本文覆盖版本选型、archetype 生成工程、已有工程手工引入依赖、Tomcat 9 systemd 托管与 JVM 堆配置,以及常见问题与卸载。所有命令与回显均在 Ubuntu 22.04.5 环境实测通过。
一、环境信息
- 操作系统:Ubuntu 22.04.5 LTS(VERSION_CODENAME=jammy)
- 架构:x86_64(内核 6.8.0-138-generic)
- Java:OpenJDK 17.0.20.1(
openjdk-17-jdk,Ubuntu 官方源) - 构建工具:Apache Maven 3.6.3(Ubuntu 官方源)
- Servlet 引擎:Apache Tomcat 9.0.58(
tomcat9,Ubuntu 官方源,systemd 托管) - Struts 版本:6.12.0(
struts2-core,6.x 主线最新) - 演示账号:root
- 示例工程目录:
/root/struts2-demo
二、前置条件
2.1 更新软件源
apt-get update
实测回显(节选):
Hit:1 http://security.ubuntu.com/ubuntu jammy-security InRelease
Hit:2 http://archive.ubuntu.com/ubuntu jammy InRelease
Hit:3 http://archive.ubuntu.com/ubuntu jammy-updates InRelease
Hit:4 http://archive.ubuntu.com/ubuntu jammy-backports InRelease
Reading package lists...
2.2 安装 JDK 17、Maven 与 Tomcat 9
Ubuntu 22.04 官方源已内置三者,一条命令完成安装:
apt-get install -y openjdk-17-jdk maven tomcat9
实测回显(已安装时):
maven is already the newest version (3.6.3-5).
openjdk-17-jdk is already the newest version (17.0.20.1+1-1~22.04).
tomcat9 is already the newest version (9.0.58-1ubuntu0.2).
0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
再安装 Tomcat 管理端(含 Manager,供后续部署应用使用):
apt-get install -y -qq tomcat9-admin
实测回显:
Setting up tomcat9-admin (9.0.58-1ubuntu0.2) ...
2.3 验证版本
java -version
实测回显:
openjdk version "17.0.20.1" 2026-08-18
OpenJDK Runtime Environment (build 17.0.20.1+1-1-22.04-Ubuntu)
OpenJDK 64-Bit Server VM (build 21.0.12.1+1-1-22.04-Ubuntu, mixed mode, sharing)
mvn -version
实测回显:
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 17.0.20.1, vendor: Ubuntu, runtime: /usr/lib/jvm/java-17-openjdk-amd64
Default locale: en_US, platform encoding: ANSI_X3.4-1968
OS name: "linux", version: "6.8.0-138-generic", arch: "amd64", family: "unix"
dpkg -l | grep -E 'openjdk-17-jdk|maven |tomcat9 '
实测回显:
ii maven 3.6.3-5 all Java software project management and comprehension tool
ii openjdk-17-jdk:amd64 17.0.20.1+1-1~22.04 amd64 OpenJDK Development Kit (JDK)
ii openjdk-17-jdk-headless:amd64 17.0.20.1+1-1~22.04 amd64 OpenJDK Development Kit (JDK) (headless)
ii tomcat9 9.0.58-1ubuntu0.2 all Apache Tomcat 9 - Servlet and JSP engine
三、版本选型说明
通过 Maven 中央仓库的 metadata 探测当前可用版本:
curl -s https://repo1.maven.org/maven2/org/apache/struts/struts2-archetype-blank/maven-metadata.xml | grep -E '<latest>|<release>'
实测回显:
<latest>6.0.0</latest>
<release>6.0.0</release>
curl -s https://repo1.maven.org/maven2/org/apache/struts/struts2-core/maven-metadata.xml | grep -E '<latest>|<release>'
实测回显:
<latest>7.4.0</latest>
<release>7.4.0</release>
curl -s https://repo1.maven.org/maven2/org/apache/struts/struts2-core/maven-metadata.xml | grep -oE '<version>6\.[0-9.]+</version>' | tail -8
实测回显:
<version>6.6.1</version>
<version>6.7.0</version>
<version>6.7.4</version>
<version>6.8.0</version>
<version>6.9.0</version>
<version>6.10.0</version>
<version>6.11.0</version>
<version>6.12.0</version>
两条版本线对照:
| 版本线 | 最新版本 | Servlet API | 运行时要求 | 结论 |
|---|---|---|---|---|
| 6.x(javax 线) | 6.12.0 | javax.servlet | Tomcat 9 及以下 | Tomcat 9 环境选用 |
| 7.x(Jakarta 线) | 7.4.0 | jakarta.servlet | Tomcat 10 及以上(Jakarta EE 9+) | 需迁移运行时后再用 |
💡 版本选择建议:Struts 7.x 基于 Jakarta EE,与 Tomcat 9(javax 线)不兼容。本文运行时为 Tomcat 9.0.58,因此选用 6.x 主线最新版 6.12.0。archetype 最新发布版为 6.0.0,生成工程后把 pom 中的
struts2.version升级为 6.12.0 即可使用最新核心(见 4.4 节)。
四、方案 A:Maven archetype 生成 Struts 工程(官方推荐)
Struts 官方提供 Maven archetype(struts2-archetype-blank)一键生成可直接构建运行的空工程,是最推荐的起步方式。
4.1 生成工程
cd /root
mvn archetype:generate -B -DgroupId=com.example.struts -DartifactId=struts2-demo -Dversion=1.0.0 \
-DarchetypeGroupId=org.apache.struts -DarchetypeArtifactId=struts2-archetype-blank \
-DarchetypeVersion=6.0.0 -DinteractiveMode=false
实测回显(节选):
[INFO] Parameter: artifactId, Value: struts2-demo
[INFO] Parameter: version, Value: 1.0.0
[INFO] Parameter: package, Value: com.example.struts
[INFO] Parameter: packageInPathFormat, Value: com/example/struts
[INFO] Project created from Archetype in dir: /root/struts2-demo
[INFO] BUILD SUCCESS
[INFO] Total time: 03:30 min
[INFO] Finished at: 2026-10-12T05:10:28Z
⚠️ 注意:首次生成需从中央仓库下载 archetype 及其依赖,实测耗时 3 分 30 秒,期间无输出属正常,耐心等待
BUILD SUCCESS即可。
4.2 工程目录结构
cd /root/struts2-demo && find . -type f | sort
实测回显:
./pom.xml
./src/main/java/com/example/struts/example/ExampleSupport.java
./src/main/java/com/example/struts/example/HelloWorld.java
./src/main/java/com/example/struts/example/Login.java
./src/main/resources/com/example/struts/example/Login-validation.xml
./src/main/resources/com/example/struts/example/package.properties
./src/main/resources/com/example/struts/example/package_es.properties
./src/main/resources/example.xml
./src/main/resources/log4j2.xml
./src/main/resources/struts.xml
./src/main/webapp/WEB-INF/example/HelloWorld.jsp
./src/main/webapp/WEB-INF/example/Login.jsp
./src/main/webapp/WEB-INF/example/Menu.jsp
./src/main/webapp/WEB-INF/example/Missing.jsp
./src/main/webapp/WEB-INF/example/Register.jsp
./src/main/webapp/WEB-INF/example/Welcome.jsp
./src/main/webapp/WEB-INF/web.xml
./src/main/webapp/index.html
./src/test/java/com/example/struts/example/ConfigTest.java
./src/test/java/com/example/struts/example/HelloWorldTest.java
./src/test/java/com/example/struts/example/LoginTest.java
4.3 关键文件说明
pom.xml:Maven 工程描述,Struts 版本由struts2.version属性统一管理;src/main/resources/struts.xml:Struts 核心配置(常量、package、action);src/main/resources/example.xml:archetype 自带示例包配置;src/main/webapp/WEB-INF/web.xml:入口为StrutsPrepareAndExecuteFilter过滤器,拦截/*;src/main/webapp/index.html:入口页,meta refresh 跳转到示例 Action。
web.xml 中的 Struts 入口过滤器(archetype 生成,节选):
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
index.html(archetype 生成,原文):
<META HTTP-EQUIV="Refresh" CONTENT="0;URL=example/HelloWorld.action">
4.4 升级 struts2.version 到 6.12.0
archetype 生成的 pom 中 struts2.version 为 6.1.1,手工改为 6.12.0。修改后 properties 段实测内容:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<struts2.version>6.12.0</struts2.version>
<log4j2.version>2.19.0</log4j2.version>
</properties>
4.5 工程依赖清单
archetype 生成的 pom 依赖(版本解析后):
org.apache.struts:struts2-core:6.12.0(Struts 核心,编译依赖)org.apache.struts:struts2-config-browser-plugin:6.12.0(配置浏览器插件)org.apache.logging.log4j:log4j-api:2.19.0、log4j-core:2.19.0(日志)org.apache.struts:struts2-junit-plugin:6.12.0、junit:junit:4.13.1(测试)javax.servlet:javax.servlet-api:3.1.0(provided,由 Tomcat 提供)javax.servlet.jsp:jsp-api:2.1(provided)
五、方案 B:已有 Maven 工程手工引入依赖
对已有 Web 工程,可直接在 pom.xml 中添加 Struts 依赖(无需 archetype):
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>6.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.19.0</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
同时在 src/main/resources 下创建 struts.xml,并在 web.xml 中注册 StrutsPrepareAndExecuteFilter(写法同 4.3 节)。依赖引入后用依赖树验证传递依赖是否完整:
cd /root/struts2-demo && mvn dependency:tree
实测回显(struts2-core 子树节选):
[INFO] +- org.apache.struts:struts2-core:jar:6.12.0:compile
[INFO] | +- org.freemarker:freemarker:jar:2.3.35:compile
[INFO] | +- com.github.ben-manes.caffeine:caffeine:jar:2.9.3:compile
[INFO] | +- ognl:ognl:jar:3.3.5:compile
[INFO] | | \- org.javassist:javassist:jar:3.29.0-GA:compile
[INFO] | +- commons-fileupload:commons-fileupload:jar:1.6.0:compile
[INFO] | +- commons-io:commons-io:jar:2.15.1:compile
[INFO] | +- org.apache.commons:commons-lang3:jar:3.20.0:compile
[INFO] | \- org.apache.commons:commons-text:jar:1.15.0:compile
依赖下载后落在 Maven 本地仓库:
ls /root/.m2/repository/org/apache/struts/struts2-core/6.12.0/
实测回显:
_remote.repositories
struts2-core-6.12.0.jar
struts2-core-6.12.0.jar.sha1
struts2-core-6.12.0.pom
struts2-core-6.12.0.pom.sha1
六、Tomcat 9 服务与 JVM 堆配置
6.1 服务状态与 systemd 单元
确认 Tomcat 版本:
/usr/share/tomcat9/bin/version.sh 2>/dev/null | grep -E 'Server version|JVM'
实测回显:
Server version: Apache Tomcat/9.0.58 (Ubuntu)
JVM Version: 17.0.20.1+1-1-22.04-Ubuntu
查看服务状态(apt 安装后默认已设置开机自启,但未启动):
systemctl status tomcat9 --no-pager -l | head -8
实测回显:
○ tomcat9.service - Apache Tomcat 9 Web Application Server
Loaded: loaded (/lib/systemd/system/tomcat9.service; enabled; vendor preset: enabled)
Active: inactive (dead)
Docs: https://tomcat.apache.org/tomcat-9.0-doc/index.html
unit 文件关键项(运行账号、目录环境变量):
grep -E '^(User|Group|Environment|ExecStart|Restart)' /lib/systemd/system/tomcat9.service
实测回显:
Environment="CATALINA_HOME=/usr/share/tomcat9"
Environment="CATALINA_BASE=/var/lib/tomcat9"
Environment="CATALINA_TMPDIR=/tmp"
Environment="JAVA_OPTS=-Djava.awt.headless=true"
ExecStartPre=+/usr/libexec/tomcat9/tomcat-update-policy.sh
ExecStart=/bin/sh /usr/libexec/tomcat9/tomcat-start.sh
Restart=on-abort
User=tomcat
Group=tomcat
6.2 配置 JVM 堆(256–512MB)
JVM 参数通过 /etc/default/tomcat9 的 JAVA_OPTS 注入。查看默认值:
grep -n 'JAVA_OPTS' /etc/default/tomcat9 | head -3
实测回显:
9:JAVA_OPTS="-Djava.awt.headless=true"
13:#JAVA_OPTS="${JAVA_OPTS} -agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n"
默认第 9 行只有 headless 参数,不含堆设置。追加 -Xms256m -Xmx512m -Xmn128m(满足 256–512MB 限制):
sed -i 's|^JAVA_OPTS=.*|JAVA_OPTS="-Djava.awt.headless=true -Xms256m -Xmx512m -Xmn128m"|' /etc/default/tomcat9
grep -n 'JAVA_OPTS' /etc/default/tomcat9 | head -1
实测回显:
9:JAVA_OPTS="-Djava.awt.headless=true -Xms256m -Xmx512m -Xmn128m"
6.3 启动与生效验证
systemctl enable tomcat9
systemctl start tomcat9 && sleep 6 && systemctl is-active tomcat9
实测回显:
active
确认堆参数已生效(进程命令行中可见):
ps -ef | grep '[j]ava' | head -2
实测回显(关键参数在 -classpath 之前):
tomcat 6295 1 99 05:06 ? 00:00:07 /usr/lib/jvm/default-java/bin/java -Djava.util.logging.config.file=/var/lib/tomcat9/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.awt.headless=true -Xms256m -Xmx512m -Xmn128m -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/share/tomcat9/bin/bootstrap.jar:/usr/share/tomcat9/bin/tomcat-juli.jar -Dcatalina.base=/var/lib/tomcat9 -Dcatalina.home=/usr/share/tomcat9 -Djava.io.tmpdir=/tmp org.apache.catalina.startup.Bootstrap start
服务运行状态(重启后实测,内存占用约 305MB):
systemctl status tomcat9 --no-pager -n 3 | head -12
实测回显:
● tomcat9.service - Apache Tomcat 9 Web Application Server
Loaded: loaded (/lib/systemd/system/tomcat9.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2026-10-12 05:24:30 UTC; 19s ago
Docs: https://tomcat.apache.org/tomcat-9.0-doc/index.html
Process: 7888 ExecStartPre=/usr/libexec/tomcat9/tomcat-update-policy.sh (code=exited, status=0/SUCCESS)
Main PID: 7892 (java)
Tasks: 43 (limit: 5753)
Memory: 304.8M
CPU: 15.064s
CGroup: /system.slice/tomcat9.service
6.4 端口与首页验证
ss -tlnp | grep 8080
实测回显:
LISTEN 0 100 *:8080 *:* users:(("java",pid=7892,fd=37))
curl -s -o /dev/null -w '%{http_code}\n' http://localhost:8080/ && curl -s http://localhost:8080/ | grep -oE '<title>[^<]+</title>'
实测回显:
200
<title>Apache Tomcat</title>
七、常见问题
7.1 archetype 生成耗时很久没有输出
首次 mvn archetype:generate 需要下载 archetype 插件与 Struts 全套依赖,实测耗时 3 分 30 秒。期间无进度输出属正常,最终以 [INFO] BUILD SUCCESS 结束。若网络受限可为 Maven 配置代理或国内镜像源后再执行。
7.2 tomcat9 安装后访问 8080 无响应
apt 安装 tomcat9 后单元虽为 enabled 但处于 inactive (dead) 状态(见 6.1 节实测),必须手动 systemctl start tomcat9。启动后用 systemctl is-active tomcat9 返回 active、ss -tlnp | grep 8080 出现 LISTEN 即为正常。
7.3 默认 JAVA_OPTS 不含堆参数
/etc/default/tomcat9 第 9 行默认值仅 -Djava.awt.headless=true,JVM 将按默认策略占用内存。生产环境务必按 6.2 节显式设置 -Xms256m -Xmx512m -Xmn128m,修改后重启服务并用 ps -ef | grep '[j]ava' 核对进程参数已带堆设置。
7.4 误选 7.x 版本导致 Tomcat 9 无法运行
Struts 7.x(当前 7.4.0)基于 Jakarta EE,包名从 javax.servlet 迁移为 jakarta.servlet,部署到 Tomcat 9 会出现类加载失败。Tomcat 9 环境必须使用 6.x 线(本文 6.12.0);若确需 7.x,请先升级到 Tomcat 10 及以上。
八、卸载与清理
删除示例工程与 Maven 本地仓库中的 Struts 组件:
rm -rf /root/struts2-demo
rm -rf /root/.m2/repository/org/apache/struts
卸载 Tomcat 9(含管理端):
apt-get purge -y tomcat9 tomcat9-admin
apt-get autoremove -y
如需一并卸载构建工具与 JDK(确认无其他业务依赖后执行):
apt-get purge -y maven openjdk-17-jdk
apt-get autoremove -y
九、参考链接
- Apache Struts 官网:https://struts.apache.org/
- Getting Started:https://struts.apache.org/getting-started/
- Maven Archetypes:https://struts.apache.org/maven-archetypes/
- struts2-core 中央仓库:https://repo1.maven.org/maven2/org/apache/struts/struts2-core/
- Tomcat 9 文档:https://tomcat.apache.org/tomcat-9.0-doc/index.html