CentOS 8 安装 Apache Geronimo 指南

在 CentOS 8 上从零安装 Apache Geronimo 3.0.1,覆盖 vault 源失效修复、Zulu JDK 7 部署、完整包与 web 精简包双方案实测(md5 校验、PortOffset 偏移启动、端口验证)、JDK 8 启动失败的逐行剖析与卸载清理,命令回显均实测通过。

Apache GeronimoApache Geronimo2026/10/15

CentOS 8 安装 Apache Geronimo 指南

目标:在 CentOS 8 上从零装好 Apache Geronimo 3.0.1 并启动到控制台可访问,覆盖 CentOS EOL 源修复、Zulu JDK 7 部署、完整包与 web 精简包两种安装方案的实测全过程、端口规划与常见启动故障排障;本文全部命令与回显均已在 CentOS 8 实机环境逐行实测通过。

一、环境信息

本节固定实测基线,后续命令均在此环境执行:

  • 操作系统:CentOS Linux release 8.4.2105(x86_64)
  • 系统自带 JDK:OpenJDK 1.8.0_312(java-1.8.0-openjdk,本文将说明为何必须换用 JDK 7)
  • 目标 JDK:Zulu 7.56.0.11(OpenJDK 1.7.0_352),JAVA_HOME=/opt/zulu7.56.0.11-ca-jdk7.0.352-linux_x64
  • 组件:Apache Geronimo 3.0.1(2013-05-28 发布,Java EE 6 Full Profile 认证版本)
  • 安装规划:安装包与目录统一放在 /opt 下
  • 内置 Servlet 实现:Tomcat 7.0.39.1

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

cat /etc/redhat-release
uname -m
CentOS Linux release 8.4.2105
x86_64

系统当前 Java 版本:

java -version
openjdk version "1.8.0_312"
OpenJDK Runtime Environment (build 1.8.0_312-b07)
OpenJDK 64-Bit Server VM (build 25.312-b07, mixed mode)

⚠️ 注意:Geronimo 3.0.1 官方 RELEASE_NOTES 写明 "You need a platform that supports the Sun JDK 6.0+ (J2SE 1.6.0+) or greater",但实测 JDK 8 启动必败(原因与失败现场见第九章 FAQ),生产安装请直接使用 JDK 6/7,本文采用 Zulu JDK 7.0.352。

二、前置条件

  1. 具有 root 权限的 CentOS 8 系统,至少 2 GB 可用磁盘(JDK + 完整包解压后约 250 MB,本文实测完整包解压后 147M)。
  2. 可访问归档下载站 archive.apache.org 与 Azul 的 CDN cdn.azul.com(下载 Zulu JDK)。
  3. CentOS 8 已于 2021-12-31 停止维护,默认 mirrorlist 全部失效——安装任何软件前先按 2.1 节修复软件源。
  4. 防火墙若启用需放行 8080(HTTP)与 8443(HTTPS),内网测试环境可直接用 systemctl stop firewalld 临时关闭。

2.1 修复 CentOS 8 软件源(EOL 处理)

实测默认源已不可用,拉取会失败。可用的替代是阿里云的 centos-vault 归档,实测两个源头的响应对比:

curl -sI http://vault.centos.org/8.4.2105/BaseOS/x86_64/os/repodata/repomd.xml | head -1
HTTP/1.1 403 Forbidden
curl -sI http://mirrors.aliyun.com/centos-vault/8.4.2105/BaseOS/x86_64/os/repodata/repomd.xml | head -1
HTTP/1.1 200 OK

把 /etc/yum.repos.d/CentOS-Linux-*.repo 中各 mirrorlist= 行注释掉,并将 baseurl 改为阿里云归档格式(以 BaseOS 为例,实测样例行):

baseurl=http://mirrors.aliyun.com/centos-vault/$contentdir/$releasever/BaseOS/$basearch/os/

八个 repo 文件(BaseOS/AppStream/PowerTools/CRB 等)逐一替换后 dnf makecache 即可正常工作。

三、版本选型说明

Geronimo 3.0.1 是 Geronimo 3.x 线的最终正式版,官方归档提供多个发行包,实测清单(来自 https://archive.apache.org/dist/geronimo/3.0.1/):

发行包大小内置 Web 服务器适用场景
geronimo-tomcat7-javaee6-3.0.1-bin.tar.gz93M(实测 Content-Length 93828414)Tomcat 7.0.39.1Java EE 6 Full Profile,65 个模块,功能最全
geronimo-jetty8-javaee6-3.0.1-bin.tar.gz约 92MJetty 8同上但换 Jetty 栈
geronimo-tomcat7-javaee6-web-3.0.1-bin.tar.gz73M(实测 Content-Length 76764923)Tomcat 7.0.39.1Web Profile,50 个模块,精简启动
geronimo-tomcat7-minimal-3.0.1-bin.tar.gz约 39MTomcat 7.0.39.1最小化内核,自行装配

版本事实:3.0.1 于 2013-05-28 发布后,Geronimo 3.x 断代至今没有更新,它也是官方提供的最后一个通过 Java EE 6 Full Profile 认证的发行版;新一代 Geronimo 只作为组件族(如 geronimo-transaction 等 jar)继续维护,不再发完整服务器。若业务必须 Java EE 6 全家桶 + 遗留系统延续,3.0.1 是终点站。

本文方案 A 采用完整包 geronimo-tomcat7-javaee6-3.0.1(65 模块),理由:数据源、EJB、JMS 等能力开箱即用;方案 B 演示 web 精简包(50 模块)用于资源受限场景。JDK 选型固定 Zulu 7.56.0.11(1.7.0_352)。

四、方案 A:完整包 tarball 安装(推荐)

4.1 安装 Zulu JDK 7

Geronimo 3.0.1 的服务器与命令行工具都依赖 JDK 6/7,先装 Zulu。下载(经代理或直连均可,实测 URL):

cd /opt
curl -fL -o zulu7.56.0.11-ca-jdk7.0.352-linux_x64.tar.gz https://cdn.azul.com/zulu/bin/zulu7.56.0.11-ca-jdk7.0.352-linux_x64.tar.gz

校验(实测 sha256):

sha256sum zulu7.56.0.11-ca-jdk7.0.352-linux_x64.tar.gz
8a7387c1ed151474301b6553c6046f865dc6c1e1890bcf106acc2780c55727c8  zulu7.56.0.11-ca-jdk7.0.352-linux_x64.tar.gz

解压并验证版本:

tar -xzf zulu7.56.0.11-ca-jdk7.0.352-linux_x64.tar.gz
/opt/zulu7.56.0.11-ca-jdk7.0.352-linux_x64/bin/java -version
openjdk version "1.7.0_352"
OpenJDK Runtime Environment (Zulu 7.56.0.11-CA-linux64) (build 1.7.0_352-b01)
OpenJDK 64-Bit Server VM (Zulu 7.56.0.11-CA-linux64) (build 24.352-b01, mixed mode)

4.2 下载完整包并校验

cd /opt
curl -fL -o geronimo-tomcat7-javaee6-3.0.1-bin.tar.gz https://archive.apache.org/dist/geronimo/3.0.1/geronimo-tomcat7-javaee6-3.0.1-bin.tar.gz

官方同目录提供 md5 文件(内容 7cae01626e4b0db786ab2078f9dd8d72),本地校验实测:

md5sum geronimo-tomcat7-javaee6-3.0.1-bin.tar.gz
7cae01626e4b0db786ab2078f9dd8d72  geronimo-tomcat7-javaee6-3.0.1-bin.tar.gz

文件大小确认:

ls -la /opt/geronimo-tomcat7-javaee6-3.0.1-bin.tar.gz
-rw-r--r-- 1 root root 90M Oct 15 08:39 /opt/geronimo-tomcat7-javaee6-3.0.1-bin.tar.gz

4.3 解压与目录结构

tar -xzf geronimo-tomcat7-javaee6-3.0.1-bin.tar.gz
ls -1 /opt/geronimo-tomcat7-javaee6-3.0.1
LICENSE
NOTICE
README.txt
RELEASE_NOTES-3.0.1.txt
bin
deploy
etc
hotbundles
jsr88
lib
repository
schema
var
du -sh /opt/geronimo-tomcat7-javaee6-3.0.1
147M	/opt/geronimo-tomcat7-javaee6-3.0.1

关键子目录:bin/(启动与部署脚本)、repository/(OSGi 仓库,内含全部 65 模块 car 与内置 RAR)、var/(运行期数据:日志、Derby 库、安全文件、配置)、schema/(部署 plan 的 XSD)。

4.4 环境变量与启动参数

export JAVA_HOME=/opt/zulu7.56.0.11-ca-jdk7.0.352-linux_x64
export PATH=$JAVA_HOME/bin:$PATH
export JAVA_OPTS="-Xmx512m -XX:MaxPermSize=256m"

建议把三行写进 /etc/profile.d/geronimo.sh。JAVA_OPTS 的 MaxPermSize=256m 是实测必需项:JDK 7 的 PermGen 默认很小,仅设 -Xmx512m 时启动过程中会抛 java.lang.OutOfMemoryError: PermGen space。

4.5 启动与验证

cd /opt/geronimo-tomcat7-javaee6-3.0.1
./bin/geronimo start
Using GERONIMO_HOME:   /opt/geronimo-tomcat7-javaee6-3.0.1
Using GERONIMO_SERVER: /opt/geronimo-tomcat7-javaee6-3.0.1
Using GERONIMO_TMPDIR: /opt/geronimo-tomcat7-javaee6-3.0.1/var/temp
Using JRE_HOME:        /opt/zulu7.56.0.11-ca-jdk7.0.352-linux_x64/jre
Using GERONIMO_OUT:    /opt/geronimo-tomcat7-javaee6-3.0.1/var/log/geronimo.out

Geronimo started in background. PID: 5108

首次启动约 1.5~2 分钟,65 个模块逐个加载(var/log/geronimo.out 实测头部与尾部):

Booting Geronimo Kernel (in Java 1.7.0_352)...
Module  1/65 org.apache.geronimo.framework/j2ee-system/3.0.1/car              started in   .000s
Module  2/65 org.apache.geronimo.framework/rmi-naming/3.0.1/car               started in   .094s
Module 12/65 org.apache.geronimo.configs/tomcat7/3.0.1/car                    started in   .580s
Geronimo Application Server started

验证 HTTP 栈(未带凭据访问控制台,403 即为就绪):

curl -s -o /dev/null -w "%{http_code}\n" --max-time 5 http://localhost:8080/console/
403

浏览器访问 http://<服务器IP>:8080/console/,用默认账号 system / manager 登录管理控制台。

五、方案 B:web 精简包安装

web 精简包(Web Profile)面向只需要 Servlet/JSP/JPA/连接池的场景,50 个模块,启动更快、占用更小。

5.1 下载、校验与解压

cd /opt
curl -fL -o geronimo-tomcat7-javaee6-web-3.0.1-bin.tar.gz https://archive.apache.org/dist/geronimo/3.0.1/geronimo-tomcat7-javaee6-web-3.0.1-bin.tar.gz
echo CURL_EXIT=$?
CURL_EXIT=0
-rw-r--r-- 1 root root 74M Oct 15 09:44 geronimo-tomcat7-javaee6-web-3.0.1-bin.tar.gz
md5sum geronimo-tomcat7-javaee6-web-3.0.1-bin.tar.gz
21886405849281a078d4e21a9168a51a  geronimo-tomcat7-javaee6-web-3.0.1-bin.tar.gz

(官方 .md5 文件内容同为 21886405849281a078d4e21a9168a51a,一致。)

tar -xzf geronimo-tomcat7-javaee6-web-3.0.1-bin.tar.gz
ls -1 /opt/geronimo-tomcat7-javaee6-web-3.0.1
LICENSE
NOTICE
README.txt
RELEASE_NOTES-3.0.1.txt
bin
deploy
etc
hotbundles
jsr88
lib
repository
schema
var

5.2 端口偏移(与已有服务共存)

web 精简包与完整包同机共存时,用 PortOffset 把全部端口整体平移。编辑 /opt/geronimo-tomcat7-javaee6-web-3.0.1/var/config/config-substitutions.properties,实测在文件末尾追加一行 PortOffset = 100:

echo "PortOffset = 100" >> /opt/geronimo-tomcat7-javaee6-web-3.0.1/var/config/config-substitutions.properties
tail -3 /opt/geronimo-tomcat7-javaee6-web-3.0.1/var/config/config-substitutions.properties
SMTPPort = 25
SMTPHost = localhost
PortOffset = 100

⚠️ 注意:PortOffset 会平移所有端口,包括 JMX/RMI 命名端口 1099→1199。这意味着之后用 ./bin/geronimo stop 停这台实例时必须加 --port 1199,否则默认连 1099——要么报连接拒绝(无其他实例时),要么误关同机另一台监听 1099 的实例(见 9.2 节实测教训)。

5.3 启动与验证

cd /opt/geronimo-tomcat7-javaee6-web-3.0.1
./bin/geronimo start
Using GERONIMO_HOME:   /opt/geronimo-tomcat7-javaee6-web-3.0.1
Using GERONIMO_SERVER: /opt/geronimo-tomcat7-javaee6-web-3.0.1
Using GERONIMO_TMPDIR: /opt/geronimo-tomcat7-javaee6-web-3.0.1/var/temp
Using JRE_HOME:        /opt/zulu7.56.0.11-ca-jdk7.0.352-linux_x64/jre
Using GERONIMO_OUT:    /opt/geronimo-tomcat7-javaee6-web-3.0.1/var/log/geronimo.out

Geronimo started in background. PID: 1256
Booting Geronimo Kernel (in Java 1.7.0_352)...
Module  1/50 org.apache.geronimo.framework/j2ee-system/3.0.1/car              started in   .000s
Module  2/50 org.apache.geronimo.framework/rmi-naming/3.0.1/car               started in   .070s

启动完成标志同样是日志尾部的 Geronimo Application Server started。偏移后控制台端口为 8180(8080+100):

curl -sI --max-time 5 http://localhost:8180/console/ | head -4
HTTP/1.1 403 Forbidden
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=utf-8

远程部署端点(/remote-deploy,端口同样偏移为 8180)实测:

curl -s -o /dev/null -w "remote-deploy http=%{http_code}\n" --max-time 5 http://localhost:8180/remote-deploy
remote-deploy http=302

5.4 正确停止 web 精简包实例

带 --port 1199 停止(实测):

./bin/geronimo stop --user system --password manager --port 1199
Locating server on localhost:1199... Server found.
Server shutdown started
Server shutdown completed
curl -s -o /dev/null -w "after-stop 8180 http=%{http_code}\n" --max-time 5 http://localhost:8180/console/
after-stop 8180 http=000

六、方案对比与选型建议

维度方案 A:完整包方案 B:web 精简包
安装包大小93M73M
解压后147M(实测)约 110M
模块数65(实测启动日志)50(实测启动日志)
能力Java EE 6 Full Profile:EJB、JMS/ActiveMQ、JCA、JAX-WS、UDDI、监控台全套Web Profile:Servlet/JSP/JPA/连接池/Web 控制台精简版
默认端口8080/8443/1099/9999/1527/4201/61616同左,可整体 +100 偏移共存
启动耗时(实测)首次约 1.5~2 分钟首次约 1~1.5 分钟
适用需要 EJB/JMS/消息中间件的遗留系统完整承载纯 Web 应用、资源受限环境、同机多实例

选型结论:有 EJB/JMS 依赖选方案 A;仅 Servlet 技术栈且要同机跑多套 Geronimo 时选方案 B + PortOffset 错位。两者可同时安装于同一台机器(本指南即两包并存实测)。

💡 技术拓展:同机多实例还有 var/config/config-substitutions.properties 逐端口改法(改 HTTPPort、NamingPort 等键),但 PortOffset 一行平移全部端口更不易漏改;两种改法都生效于下一次启动。

七、基础配置

7.1 端口清单(完整包默认值)

来自 var/config/config-substitutions.properties 的实测键值(行号为文件内位置):

配置键默认值用途
NamingPort1099JNDI/RMI 命名服务,deploy 工具连接端口
JMXPort9999JMX 连接器
HTTPPort8080内嵌 Tomcat HTTP
HTTPSPort8443HTTPS
AJPPort8009AJP 连接器
DerbyPort1527Derby 网络模式(嵌入式默认不监听)
OpenEJBPort4201EJB 协议端口
ActiveMQPort61616内置消息代理
PortOffset0全端口偏移量

7.2 日志位置

  • var/log/geronimo.out:后台启动的启动进度与标准输出(排障第一现场)
  • var/log/geronimo.log:运行日志
  • var/cache/<时间戳>.log:OSGi 引导失败时的 bundle 解析日志(JDK 版本问题排查关键,见 9.1 节)

7.3 管理账号

默认账号 system / manager,安全文件在 var/security/users.properties 与 var/security/groups.properties(改密、加密、新增账号的完整实测见同专栏第 5 篇《数据源与安全配置进阶详解》第五章)。

八、验证清单与 FAQ

8.1 安装验证清单

检查项命令期望
JDK 版本java -version1.7.0_352(或 6.x),不是 8+
服务器进程ps -ef | grep geronimo一个 DaemonCLI 进程
启动日志tail var/log/geronimo.out出现 Geronimo Application Server started
模块数tail var/log/geronimo.out | grep "Module"完整包 65 个、web 包 50 个
控制台curl -s -o /dev/null -w "%{http_code}" http://localhost:8080/console/403
deploy 工具./bin/deploy --user system --password manager list-modulesFound 82 modules(完整包全新安装实测,其中 65 个随服务器自启动)

九、FAQ

9.1 JDK 8 启动失败(必现,实测逐行)

用系统自带 OpenJDK 8(1.8.0_312)设置 JAVA_HOME 后启动:

JAVA_HOME=/usr/lib/jvm/java ./bin/geronimo run
Using JRE_HOME:        /usr/lib/jvm/java/jre
OpenJDK 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0
Main not found

var/cache/ 下生成的引导失败日志给出根因(实测关键行):

ERROR: Bundle org.ops4j.pax.url.wrap [3] Error starting file:bundles/org.ops4j.pax.url.wrap_1.1.2.jar (org.osgi.framework.BundleException: Activator start error in bundle org.ops4j.pax.url.wrap [3].)
java.lang.NoClassDefFoundError: com/sun/jarbuilder/JarBuilder

机制:pax-url wrap 的 Activator 依赖 JDK 内部的 com.sun.jarbuilder(JDK 7 起随 JDK 提供、JDK 8 移除),bundle 激活失败导致后续 Main 服务未注册,引导器遂报 Main not found。RELEASE_NOTES 已知问题里也有相关记录(GERONIMO-6416 Couldn't assemble a server with JDK7 等条目)。

结论:JAVA_HOME 必须指向 JDK 6/7。诊断口诀——服务器和 bin/deploy 一律 Main not found 时,先查 java -version。

9.2 stop 误伤与端口偏移(实测教训)

同机装两套 Geronimo(完整包 1099 + web 包 1199)时,在 web 包目录直接执行 ./bin/geronimo stop(不带 --port)默认连 1099,实测会定位并关闭完整包实例(回显 Locating server on localhost:1099... Server found. / Server shutdown started / Server shutdown completed),而 web 包实例 8180 依然存活(探测仍 403)。单独运行的偏移实例则报连接拒绝:

Could not communicate with the server.  The server may not be running or the port number may be incorrect (Failed to retrieve RMIServer stub: javax.naming.ServiceUnavailableException [Root exception is java.rmi.ConnectException: Connection refused to host: localhost; ...])

正确做法见 5.4 节:偏移实例的 stop 必须带 --port 1199。

9.3 PermGen 溢出

启动中或部署应用时报 java.lang.OutOfMemoryError: PermGen space:JDK 7 下把 JAVA_OPTS 设为 -Xmx512m -XX:MaxPermSize=256m(实测通过的组合)。

9.4 archive.apache.org 下载慢

该归档站点对大文件限速明显(响应头带 Vary: Slow,Glacial),73~93M 可能要数十分钟。可用 -C - 断点续传重跑同一条 curl 命令,或从其他 Apache 镜像的 geronimo 历史目录获取。

十、卸载与清理

Geronimo 3.0.1 全部内容都装在解压目录内,卸载即删目录:

# 停止实例(完整包)
cd /opt/geronimo-tomcat7-javaee6-3.0.1
./bin/geronimo stop --user system --password manager

# 停止偏移实例(web 包)
cd /opt/geronimo-tomcat7-javaee6-web-3.0.1
./bin/geronimo stop --user system --password manager --port 1199

# 删除安装目录与安装包
rm -rf /opt/geronimo-tomcat7-javaee6-3.0.1
rm -rf /opt/geronimo-tomcat7-javaee6-web-3.0.1
rm -f /opt/geronimo-tomcat7-javaee6-3.0.1-bin.tar.gz
rm -f /opt/geronimo-tomcat7-javaee6-web-3.0.1-bin.tar.gz

# 删除环境变量脚本与部署器本地凭据缓存
rm -f /etc/profile.d/geronimo.sh
rm -rf ~/.geronimo-deployer

若 Zulu JDK 7 无其他应用使用,一并移除 /opt/zulu7.56.0.11-ca-jdk7.0.352-linux_x64 与其 tarball。注意:/opt/geronimo-* 目录删除后,var/derby 里的应用数据库随之消失,卸载前如有数据先备份该目录。

十一、参考链接

  • Geronimo 3.0.1 归档下载与校验文件:https://archive.apache.org/dist/geronimo/3.0.1/
  • Zulu JDK 7 下载页:https://cdn.azul.com/zulu/bin/zulu7.56.0.11-ca-jdk7.0.352-linux_x64.tar.gz
  • CentOS 8 归档源(阿里云 vault):http://mirrors.aliyun.com/centos-vault/
  • Apache Geronimo 官方文档主页:http://geronimo.apache.org/documentation.html
  • 版本发布说明:安装目录内 RELEASE_NOTES-3.0.1.txt(含系统要求与已知问题清单)
  • 同专栏进阶篇:《Apache Geronimo 3.0.1 常用命令与部署工具详解》《Apache Geronimo 3.0.1 数据源与安全配置进阶详解》