Ubuntu 22.04 安装 Apache Tobago 指南

在 Ubuntu 22.04 上从零安装 Apache Tobago 5.15.2 的完整运行环境,覆盖 JDK 17 与 Tomcat 9 的 apt/官方包安装、Maven 构建 Tobago WAR、部署启动与浏览器级回显验证,命令与回显均实测通过。

Apache TobagoApache Tobago2026/10/15

Ubuntu 22.04 安装 Apache Tobago 指南

目标:在 Ubuntu 22.04 上从零搭好 Apache Tobago 5.15.2 的开发与运行环境(OpenJDK 17 + Maven 3.9 + Tomcat 9 + MyFaces 2.3),构建出第一个 Tobago WAR 并部署到 Tomcat 完成页面渲染与表单回显验证;本文全部命令与回显均已在 Ubuntu 22.04 实测通过。

Apache Tobago 是 Apache MyFaces 项目下的 JSF 组件框架,以「页面即组件树」的方式提供主题化 UI(页面、输入框、按钮、表格等),最终产物是标准的 Java Web 应用(WAR)。因此「安装 Tobago」的本质是:装好 JDK 与构建工具 → 用 Maven 把 Tobago 组件打成 WAR → 把 WAR 部署到 Servlet 应用服务器(Tomcat)→ 浏览器或 curl 验证页面渲染。本文按此链路给出完整落地步骤。

一、环境信息

本节先固定可复现的基线环境,后续所有命令均在此环境执行。

  • 操作系统:Ubuntu 22.04 LTS(x86_64)
  • JDK:OpenJDK 17.0.20.1(apt 包 openjdk-17-jdk-headless)
  • 构建工具:Apache Maven 3.9(maven:3.9 发行包,任一 ≥3.6.3 的 Maven 均可)
  • 应用服务器:Apache Tomcat 9.0.58(apt 包 tomcat9)
  • 组件版本:Apache Tobago 5.15.2(org.apache.myfaces.tobago:tobago-core:5.15.2)
  • JSF 实现:Apache MyFaces 2.3.12(org.apache.myfaces.core:myfaces-impl:2.3.12)
  • 实测工程目录:/opt/tobago-demo

系统与版本确认(实时回显):

cat /etc/os-release | head -2
PRETTY_NAME="Ubuntu 22.04 LTS"
NAME="Ubuntu"
java -version 2>&1 | head -1
openjdk version "17.0.20.1" 2026-08-18

⚠️ 重要:Tobago 5.15.2 走的是 javax.faces(JSF 2.3)技术栈而不是 Jakarta 命名空间,因此必须配 Tomcat 9(javax 技术栈),不能部署到 Tomcat 10.1。同时 Tobago 官方包内含少量 Java 17 字节码,运行时要求 JDK 17+,不要用 JDK 8 跑 5.x。若必须用 JDK 8,请选 Tobago 4.6.0(纯 Java 8 字节码),见第 2 篇《CentOS 8 安装 Apache Tobago 指南》的版本选型说明。

二、前置条件

  1. 具有 root 或 sudo 权限的 Ubuntu 22.04 系统。
  2. 可正常访问 Ubuntu 官方软件源(apt update 成功)。
  3. 可访问 Maven 中央仓库 repo1.maven.org(构建时拉取 Tobago 依赖)。
  4. 至少 2 GB 可用磁盘空间(JDK + Maven + Tomcat + 依赖合计约 600 MB)。

源与网络确认(实时回显):

curl -sI --max-time 20 https://repo1.maven.org/maven2/ | head -1
HTTP/2 200

三、版本选型说明

本节给出 Tobago 的版本谱系与配套要求,帮助读者一次选对版本。以下结论均来自 Maven Central 元数据与字节码实测。

Tobago 版本线最新版本JSF 命名空间运行 JDK配套应用服务器JSF 实现
4.x4.6.0javax.faces(JSF 2.3)JDK 8+Tomcat 8.5/9MyFaces 2.3
5.x5.15.2javax.faces(JSF 2.3)JDK 17+(字节码实测)Tomcat 9MyFaces 2.3
6.x6.12.2jakarta.faces(Faces 4.0)JDK 17+Tomcat 10.1MyFaces 4.0

💡 技术拓展:网上常见说法「Tobago 5.x 需要 Jakarta EE 9+」与实测不符。对 tobago-core-5.15.2.jar 反编译统计:全部 889 个类中 777 个是 Java 8 字节码(major 52)、112 个是 Java 17 字节码(major 61),且 META-INF/faces-config.xml 声明的是 JSF 2.3 规范、类内引用 javax/faces 351 处、jakarta/faces 0 处——即 5.x 是「Java EE 命名空间 + 高版本 JDK」的组合,Jakarta 迁移在 6.x 才完成。本文按实测选 Tobago 5.15.2 + Tomcat 9 + MyFaces 2.3.12。

5.15.2 的 Maven 坐标确认(实时回显):

curl -s https://repo1.maven.org/maven2/org/apache/myfaces/tobago/tobago-core/maven-metadata.xml | grep -E "<version>5\.15\.2|<release>"
      <version>5.15.2</version>
  <release>6.12.2</release>

四、方案 A:Maven 构建 Tobago WAR 工程(推荐)

4.1 安装 JDK 17 与 Maven

apt-get update
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends openjdk-17-jdk-headless curl

回显(节选):

Setting up openjdk-17-jdk-headless:amd64 (17.0.20.1-1ubuntu1~22.04) ...

安装 Maven 3.9(解压官方二进制包到 /opt):

curl -sO https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.tar.gz
tar xzf apache-maven-3.9.9-bin.tar.gz -C /opt
ln -sf /opt/apache-maven-3.9.9/bin/mvn /usr/local/bin/mvn
mvn -v | head -3
Apache Maven 3.9.9 (bb087f8bfad3c4b8e83de295bd7c42e57a957860)
Maven home: /opt/apache-maven-3.9.9
Java version: 17.0.20.1, vendor: Ubuntu, runtime: /usr/lib/jvm/java-17-openjdk-amd64

4.2 建立最小 Tobago 工程

完整的工程结构与源码在《Apache Tobago 5.15.2 快速入门与集成示例》第三章逐步给出,这里直接复用该文工程。将工程放到 /opt/tobago-demo 后执行构建:

cd /opt/tobago-demo
mvn -B clean package 2>&1 | tail -4
[INFO] --- war:3.4.0:war (default-war) @ tobago-demo ---
[INFO] Packaging webapp
[INFO] Assembling webapp [tobago-demo] in [/opt/tobago-demo/target/tobago-demo]
[INFO] Processing war project
[INFO] Building war: /opt/tobago-demo/target/tobago-demo.war
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

产物确认:

ls -lh /opt/tobago-demo/target/tobago-demo.war | awk '{print $5, $9}'
8.8M /opt/tobago-demo/target/tobago-demo.war

💡 说明:WAR 内已打进 tobago-core、tobago-theme-scarborough、myfaces-api/impl、jaxb-api 等运行时依赖,属于自包含部署物;javax.servlet-api 声明为 provided 作用域,由 Tomcat 提供。

五、方案 B:直接部署官方示例 WAR

5.1 适用场景

不写代码、只想先看看 Tobago 页面长什么样时,可直接从 Maven Central 拉取官方示例 tobago-example-blank(与 core 同版本发布)部署。

5.2 下载与部署

curl -s -o /opt/blank.war https://repo1.maven.org/maven2/org/apache/myfaces/tobago/tobago-example-blank/5.15.2/tobago-example-blank-5.15.2.war
ls -lh /opt/blank.war | awk '{print $5, $9}'
8.4M /opt/blank.war

⚠️ 注意:官方示例 WAR 直接部署到纯 Tomcat 9 会启动失败,实测需补两处运行时依赖并改一处配置,全部为一次性操作:

  1. 补 JSTL:官方示例假定应用服务器提供 JSTL,纯 Tomcat 9 没有,需将 javax.servlet.jsp.jstl-api-1.2.1.jar 与 javax.servlet.jsp.jstl-1.2.5.jar 放入 WEB-INF/lib(缺失时报 JspViewDeclarationLanguage 相关 500)。
  2. 补 JAXB:JDK 9 起移除了 javax.xml.bind,需将 jaxb-api-2.3.1.jar 放入 WEB-INF/lib(缺失时页面 writeState 报 NullPointerException: Cannot invoke javax.xml.bind.DatatypeConverter.encodeHexBinary)。
  3. 安全注解:在示例的 WEB-INF/tobago-config.xml 中、</theme-config> 之后追加 <security-annotation>ignore</security-annotation>(注意该元素在 XSD 序列中位于最后,放在 name 之后会因 schema 校验失败导致整份配置被拒)。

修正后重新打包部署,页面返回 200 并正常渲染 <tobago-page>。自建工程在 pom 里显式引入 jaxb-api 并自带 tobago-config.xml(见第 3 篇),可从源头避开这三个坑。

六、方案对比

维度方案 A:Maven WAR 工程方案 B:官方示例 WAR
适用对象正式开发、长期维护快速预览、教学演示
依赖管理pom 显式声明,可控需手工补 jar
组件覆盖按需引入固定的 blank 页面
与 CI 集成原生支持需二次打包
上手成本中(需写最小工程)低

结论:生产与开发一律走方案 A;方案 B 仅用于一分钟内验证应用服务器就绪。

七、基础配置:安装并启动 Tomcat 9

7.1 apt 安装 tomcat9

Ubuntu 22.04 官方源内置 Tomcat 9.0.58(javax 技术栈,正好匹配 Tobago 5.x):

DEBIAN_FRONTEND=noninteractive apt-get install -y tomcat9
dpkg -l tomcat9 | tail -1
ii  tomcat9        9.0.58-1ubuntu0.2 all          Apache Tomcat 9 - Servlet and JSP engine

💡 技术拓展:Tomcat 9(javax.)与 Tomcat 10.1(jakarta.)不兼容。选型对照:Tobago 4.x/5.x → Tomcat 9 + MyFaces 2.3;Tobago 6.x → Tomcat 10.1 + MyFaces 4.0。把 5.x 的 WAR 部署到 Tomcat 10.1 会在启动期抛 ClassNotFoundException: javax.servlet.ServletContextListener。

7.2 启动方式

Ubuntu 的 tomcat9 包按 systemd 服务设计(tomcat9.service + socket 激活),常规服务器直接:

systemctl enable --now tomcat9
systemctl status tomcat9 | head -3

在无 systemd 的最小环境中(如精简镜像、手工运维场景),可用包内脚本手动拉起,注意必须同时给出 CATALINA_BASE 与 CATALINA_HOME:

CATALINA_BASE=/var/lib/tomcat9 CATALINA_HOME=/usr/share/tomcat9 JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 /usr/share/tomcat9/bin/startup.sh
Tomcat started.

端口监听确认:

ss -ltn | grep 8080
LISTEN 0      100          *:8080            *:*      users:(("java",pid=2713,fd=38))

7.3 部署 WAR

cp /opt/tobago-demo/target/tobago-demo.war /var/lib/tomcat9/webapps/
chown tomcat:tomcat /var/lib/tomcat9/webapps/tobago-demo.war
sleep 12

Tomcat 热部署完成即可访问,无需重启服务。

八、验证清单

以下 4 项全部通过即认为安装成功(均为实测回显)。

  1. 应用服务器就绪:
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8080/tobago-demo/
200
  1. Tobago 页面渲染(自定义标签已转成 HTML + Web Component):
curl -s http://127.0.0.1:8080/tobago-demo/ | sed 's/></>\n</g' | grep -E "scarborough.*css|<title>|tobago-page" | head -3
<title>Tobago Demo</title>
<link rel='stylesheet' href='/tobago-demo/tobago/scarborough/5.15.2/css/tobago.css' type='text/css'>
<tobago-page locale='en_US' class='container-fluid' id='page' focus-on-error='true' wait-overlay-delay-full='1000' wait-overlay-delay-ajax='1000'>
  1. 组件树完整:页面中应能看到 tobago-in(输入框)、tobago-button(按钮)、tobago-out(输出)以及随请求生成的 javax.faces.ViewState 与 org.apache.myfaces.tobago.webapp.Secret 隐藏域。

  2. 表单回显交互:浏览器打开 http://<服务器IP>:8080/tobago-demo/,在姓名框输入 q1w2e3r4 点击「提交」,页面出现「你好, q1w2e3r4! (来自 Tobago 回显)」即完整闭环。等价的命令行验证(先 GET 取 ViewState 与 Secret,再按 JSF Ajax 协议 POST)实测结果:

POST HTTP 200
--- 回显检查 ---
你好, q1w2e3r4! (来自 Tobago 回显)
input type='text' name='page:name' id='page:name::field' value='q1w2e3r4' class='form-control' required='required'/

九、FAQ

Q1:部署后访问 500,日志出现 Cannot invoke "javax.xml.bind.DatatypeConverter.encodeHexBinary"? JDK 9+ 移除了 JAXB,而 MyFaces 的 view-state 生成依赖它。在 pom 中加入 javax.xml.bind:jaxb-api:2.3.1 重新打包部署即可(本文工程已内置)。

Q2:页面返回 500,日志有 NullPointerException ... authorizationHelper is null? Tobago 5 默认 security-annotation 为 disable,会走 CDI 授权检查,而 Tomcat 9 没有 CDI 实现。在应用 WEB-INF/tobago-config.xml 中配置 <security-annotation>ignore</security-annotation>(XSD 顺序上必须位于文件末尾的元素区)。

Q3:把 WAR 部署到 Tomcat 10.1 启动失败,报找不到 javax.servlet.ServletContextListener? Tobago 5.x 是 javax 技术栈,必须用 Tomcat 9;Tomcat 10.1 请改配 Tobago 6.x + MyFaces 4.x。

Q4:apt install tomcat9 后 service tomcat9 start 提示 unrecognized service? Ubuntu 的 tomcat9 由 systemd 管理,先 systemctl enable --now tomcat9;无 systemd 环境按 7.2 节手动拉起,并注意指定 CATALINA_BASE、CATALINA_HOME、JAVA_HOME 三个变量。

Q5:构建报 release version 17 not supported? 编译机的 JDK 低于 17。Tobago 5.15.2 含 Java 17 字节码,编译与运行都要求 JDK 17+。

十、卸载与清理

# 停服务并卸载 tomcat9(apt 安装方式)
systemctl disable --now tomcat9 2>/dev/null
DEBIAN_FRONTEND=noninteractive apt-get purge -y tomcat9 tomcat9-common
rm -rf /var/lib/tomcat9 /etc/tomcat9
# 移除工程与产物
rm -rf /opt/tobago-demo /opt/blank.war /opt/apache-maven-3.9.9 /usr/local/bin/mvn
# 移除 JDK(可选,谨慎确认无其他业务依赖)
apt-get purge -y openjdk-17-jdk-headless

执行后确认无残留监听:

ss -ltn | grep 8080 || echo "port 8080 free"
port 8080 free

十一、参考链接