Apache Struts 安装指南

Ubuntu 22.04 安装 Struts 6.12.0 指南:JDK 17/Maven/Tomcat 9 环境准备,6.x 与 7.x 版本选型,archetype 生成工程与引入依赖两方案,JVM 堆配置与卸载,全程实测。

Apache StrutsApache Struts2026/10/12

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.0javax.servletTomcat 9 及以下Tomcat 9 环境选用
7.x(Jakarta 线)7.4.0jakarta.servletTomcat 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

九、参考链接