CentOS 8 安装 Apache Geronimo 指南
在 CentOS 8 上从零安装 Apache Geronimo 3.0.1,覆盖 vault 源失效修复、Zulu JDK 7 部署、完整包与 web 精简包双方案实测(md5 校验、PortOffset 偏移启动、端口验证)、JDK 8 启动失败的逐行剖析与卸载清理,命令回显均实测通过。
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。
二、前置条件
- 具有 root 权限的 CentOS 8 系统,至少 2 GB 可用磁盘(JDK + 完整包解压后约 250 MB,本文实测完整包解压后 147M)。
- 可访问归档下载站
archive.apache.org与 Azul 的 CDNcdn.azul.com(下载 Zulu JDK)。 - CentOS 8 已于 2021-12-31 停止维护,默认
mirrorlist全部失效——安装任何软件前先按 2.1 节修复软件源。 - 防火墙若启用需放行 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.gz | 93M(实测 Content-Length 93828414) | Tomcat 7.0.39.1 | Java EE 6 Full Profile,65 个模块,功能最全 |
geronimo-jetty8-javaee6-3.0.1-bin.tar.gz | 约 92M | Jetty 8 | 同上但换 Jetty 栈 |
geronimo-tomcat7-javaee6-web-3.0.1-bin.tar.gz | 73M(实测 Content-Length 76764923) | Tomcat 7.0.39.1 | Web Profile,50 个模块,精简启动 |
geronimo-tomcat7-minimal-3.0.1-bin.tar.gz | 约 39M | Tomcat 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 精简包 |
|---|---|---|
| 安装包大小 | 93M | 73M |
| 解压后 | 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 的实测键值(行号为文件内位置):
| 配置键 | 默认值 | 用途 |
|---|---|---|
NamingPort | 1099 | JNDI/RMI 命名服务,deploy 工具连接端口 |
JMXPort | 9999 | JMX 连接器 |
HTTPPort | 8080 | 内嵌 Tomcat HTTP |
HTTPSPort | 8443 | HTTPS |
AJPPort | 8009 | AJP 连接器 |
DerbyPort | 1527 | Derby 网络模式(嵌入式默认不监听) |
OpenEJBPort | 4201 | EJB 协议端口 |
ActiveMQPort | 61616 | 内置消息代理 |
PortOffset | 0 | 全端口偏移量 |
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 -version | 1.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-modules | Found 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 数据源与安全配置进阶详解》