Ubuntu 22.04 安装 Apache Geronimo 指南
在 Ubuntu 22.04 服务器上从零安装并验证 Apache Geronimo 3.0.1 应用服务器,覆盖 JDK 选型、完整版与 minimal 版两种安装方案、管理员配置、启动验证与排障。
Ubuntu 22.04 安装 Apache Geronimo 指南
目标:在一台 Ubuntu 22.04 服务器上完成 Apache Geronimo 3.0.1(Java EE 6 应用服务器)的安装、管理员密码配置、启动与部署验证,并弄清其 JDK 兼容边界。(实测通过)
一、环境信息
本文所有命令与回显均在以下环境实测:
| 项目 | 值 |
|---|---|
| 操作系统 | Ubuntu 22.04.5 LTS(Jammy) |
| 内核 | x86_64 |
| JDK(实测可用) | Zulu 7.56.0.11(OpenJDK 1.7.0_352) |
| JDK(实测不可用) | OpenJDK 1.8.0_504、OpenJDK 17.0.20.1 |
| Geronimo 版本 | 3.0.1(geronimo-tomcat7-javaee6-3.0.1-bin.tar.gz) |
| 安装路径 | /opt/geronimo-tomcat7-javaee6-3.0.1 |
| 默认端口 | 8080(HTTP)、1099(RMI)、9999(JMX) |
| 磁盘占用 | 完整版约 143 MB,minimal 版约 55 MB |
开始前确认磁盘与网络:
root@server:~# df -h /opt
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 100G 12G 88G 12% /
二、前置条件
2.1 JDK 版本要求(重要)
Apache Geronimo 3.0.1 官方 RELEASE_NOTES 写明:需要 Sun JDK 6.0 或以上(J2SE 1.6+)。但经实测,其可用性远比这条描述苛刻:
| JDK | 实测结论 | 失败现象 |
|---|---|---|
| OpenJDK 17.0.20.1 | 不可用 | JVM 直接创建失败(MaxPermSize 不识别) |
| OpenJDK 1.8.0_504 | 不可用 | Main not found,进程退出 |
| Zulu 1.7.0_352 | 可用 | 正常启动,全部 67 个模块启动完成 |
因此本文使用 Azul Zulu 7(免费构建、无需注册)作为运行时 JDK。Ubuntu 22.04 的 apt 仓库中没有 openjdk-7 包,只能使用 tarball 方式安装。
2.2 安装 Zulu JDK 7
从 Azul 官方 CDN 下载并解压到 /opt:
root@server:~# cd /opt
root@server:/opt# wget https://cdn.azul.com/zulu/bin/zulu7.56.0.11-ca-jdk7.0.352-linux_x64.tar.gz
root@server:/opt# md5sum zulu7.56.0.11-ca-jdk7.0.352-linux_x64.tar.gz
ffcb957e1d4c701c9fef165812440fb6 zulu7.56.0.11-ca-jdk7.0.352-linux_x64.tar.gz
root@server:/opt# tar xzf zulu7.56.0.11-ca-jdk7.0.352-linux_x64.tar.gz
root@server:/opt# /opt/zulu7.56.0.11-ca-jdk7.0.352-linux_x64/bin/java -version
openjdk version "1.7.0_352"
OpenJDK Runtime Environment (Zulu build 1.7.0_352-b07)
OpenJDK 64-Bit Server VM (Zulu build 1.7.0_352-b07, mixed mode)
要点小结:
- Zulu JDK 7 为绿色 tarball 安装,不写入 /usr,不与系统其他 JDK 冲突。
- 后续所有 Geronimo 操作都通过
JAVA_HOME=/opt/zulu7.56.0.11-ca-jdk7.0.352-linux_x64指定运行时,无需 update-alternatives。
2.3 基础工具
root@server:/opt# apt-get install -y wget curl unzip
三、版本选型与退役状态
Geronimo 项目已于 2016 年进入 Apache Attic(退役),最终版本为 3.0.1(2013 年发布)。其官方发行包已从 downloads.apache.org 移除,只能从 Apache 归档站 archive.apache.org 获取:
| 发行包 | 说明 | Java EE 认证 | 建议场景 |
|---|---|---|---|
| geronimo-tomcat7-javaee6-3.0.1 | 完整版,内置 Tomcat 7 | Java EE 6 Full Profile | 生产/全功能评估 |
| geronimo-tomcat7-javaee6-web-3.0.1 | Web Profile 版 | Java EE 6 Web Profile | 仅 Web 应用 |
| geronimo-tomcat7-minimal-3.0.1 | 最小内核版 | 无 | 学习内核/定制发行 |
💡 技术拓展:tomcat7 与 jetty 两种发行版
对比项 tomcat7 发行版 jetty 发行版(2.x 时代提供) Web 服务器 Apache Tomcat 7.0.x Eclipse Jetty 3.0.1 是否提供 是(3.0.1 仅提供 tomcat7 系列) 否(归档中 3.0.1 目录无 jet8 包) Java EE 认证 Full Profile 已认证 2.2.1 为 Web Profile 本文选用 tomcat7-javaee6 完整版(方案 A)与 tomcat7 minimal(方案 B)。
由于项目已退役,本文如实提示:该服务器适合做历史系统维护、遗留应用迁移评估或教学演示,不建议用于新建生产系统。
四、方案 A:安装完整版(tomcat7-javaee6)
4.1 下载与校验
root@server:/opt# wget https://archive.apache.org/dist/geronimo/3.0.1/geronimo-tomcat7-javaee6-3.0.1-bin.tar.gz
root@server:/opt# md5sum geronimo-tomcat7-javaee6-3.0.1-bin.tar.gz
7cae01626e4b0db786ab2078f9dd8d72 geronimo-tomcat7-javaee6-3.0.1-bin.tar.gz
root@server:/opt# sha1sum geronimo-tomcat7-javaee6-3.0.1-bin.tar.gz
eabfee307fe2b4d14967479eeb41f23f1c16cb4b geronimo-tomcat7-javaee6-3.0.1-bin.tar.gz
与官方发布页(archive.apache.org/dist/geronimo/3.0.1/)公布的校验值一致。
4.2 解压与目录结构
root@server:/opt# tar xzf geronimo-tomcat7-javaee6-3.0.1-bin.tar.gz
root@server:/opt# ls -F 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/
root@server:/opt# du -sh geronimo-tomcat7-javaee6-3.0.1
143M geronimo-tomcat7-javaee6-3.0.1
关键目录:
- bin/:启动脚本(startup、shutdown、geronimo)与部署客户端(deploy)。
- etc/:端口与 JVM 属性配置(system.properties 等)。
- repository/:Geronimo 插件仓库,所有模块(car)、RAR、驱动都存在这里。
- var/:运行时数据,包括日志(var/log)、内置 Derby 数据库(var/derby)、安全配置(var/security)、OSGi 缓存(var/cache)。
4.3 设置环境变量(可选但推荐)
为避免每次手动指定 JDK,可写入 profile:
root@server:/opt# cat > /etc/profile.d/geronimo.sh << 'EOF'
export JAVA_HOME=/opt/zulu7.56.0.11-ca-jdk7.0.352-linux_x64
export GERONIMO_HOME=/opt/geronimo-tomcat7-javaee6-3.0.1
EOF
root@server:/opt# chmod +x /etc/profile.d/geronimo.sh
注意:Geronimo 的启动脚本读取 JAVA_HOME/JRE_HOME。若两者都未定义,脚本会尝试通过 which java 自动探测,在最小化安装的 Ubuntu 上可能失败(见 FAQ 9.6)。
五、方案 B:安装 minimal 版
minimal 版只含 OSGi 内核、rmi-naming 与部署框架,不预装 Tomcat 控制台、JMS、JPA 等模块,适合作为定制内核起点:
root@server:/opt# wget https://archive.apache.org/dist/geronimo/3.0.1/geronimo-tomcat7-minimal-3.0.1-bin.tar.gz
root@server:/opt# md5sum geronimo-tomcat7-minimal-3.0.1-bin.tar.gz
269d1effa89fc058b0a68aaa12a729c7 geronimo-tomcat7-minimal-3.0.1-bin.tar.gz
root@server:/opt# tar xzf geronimo-tomcat7-minimal-3.0.1-bin.tar.gz
root@server:/opt# ls geronimo-tomcat7-minimal-3.0.1/
LICENSE NOTICE README.txt RELEASE_NOTES-3.0.1.txt bin deploy etc hotbundles jsr88 lib repository schema var
root@server:/opt# du -sh geronimo-tomcat7-minimal-3.0.1
55M geronimo-tomcat7-minimal-3.0.1
以 256 MB 堆启动 minimal 版(完整版在该堆下会 OOM,见 FAQ 9.4):
root@server:/opt# cd geronimo-tomcat7-minimal-3.0.1
root@server:/opt/geronimo-tomcat7-minimal-3.0.1# export JAVA_HOME=/opt/zulu7.56.0.11-ca-jdk7.0.352-linux_x64
root@server:/opt/geronimo-tomcat7-minimal-3.0.1# export JAVA_OPTS="-Xms256m -Xmx256m -XX:MaxPermSize=128m"
root@server:/opt/geronimo-tomcat7-minimal-3.0.1# bin/startup
Using GERONIMO_HOME: /opt/geronimo-tomcat7-minimal-3.0.1
Using GERONIMO_SERVER: /opt/geronimo-tomcat7-minimal-3.0.1
Using GERONIMO_TMPDIR: /opt/geronimo-tomcat7-minimal-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-minimal-3.0.1/var/log/geronimo.out
Geronimo started in background. PID: 5927
root@server:/opt/geronimo-tomcat7-minimal-3.0.1# grep -E "Startup completed|Application Server started" var/log/geronimo.out
Startup completed in 1.786s seconds
Geronimo Application Server started
实测要点:minimal 版 1.8 秒即可完成启动,256 MB 堆足够;完整版同参数则会因线程池 OutOfMemoryError 崩溃。
验证 HTTP(minimal 内核自带 welcome 应用):
root@server:~# curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:8080/
200
六、方案对比
| 对比项 | 方案 A 完整版 | 方案 B minimal |
|---|---|---|
| 磁盘占用 | 143 MB | 55 MB |
| 启动模块数 | 67 个(含 console 等 12 个 Web 应用) | 极少(内核 + 部署框架) |
| 启动耗时(实测) | 约 60~90 秒 | 1.8 秒 |
| 内存(实测可用) | -Xmx512m + -XX:MaxPermSize=256m | -Xmx256m 即可 |
| Java EE 6 Full Profile | 认证通过 | 需自行安装插件 |
| 控制台 /console | 内置 | 无 |
| 本文建议 | 评估与遗留系统维护 | 定制内核、学习 OSGi 部署 |
七、基础配置
7.1 JVM 堆设置
Geronimo 启动脚本的 JVM 参数来自环境变量 JAVA_OPTS。bin/geronimo 脚本第 193~196 行定义了默认值:JAVA_OPTS 未设置时取 -Xmx256m -XX:MaxPermSize=128m。对完整版推荐显式覆盖:
root@server:~# export JAVA_OPTS="-Xms256m -Xmx512m -XX:MaxPermSize=256m"
root@server:~# export JAVA_HOME=/opt/zulu7.56.0.11-ca-jdk7.0.352-linux_x64
root@server:~# /opt/geronimo-tomcat7-javaee6-3.0.1/bin/startup
启动后确认参数已生效:
root@server:~# ps aux | grep DaemonCLI | head -1 | tr ' ' '\n' | grep -E 'Xms|Xmx|Perm'
-Xms256m
-Xmx512m
-XX:MaxPermSize=256m
要点小结:
- JAVA_OPTS 在执行 startup 前以环境变量形式导出即可生效,无需修改脚本。
- 想持久化可把两条 export 写入 /etc/profile.d/geronimo.sh,或写入 Geronimo 的 bin/setjavaenv.sh。
- JDK 7 时代必须显式给出 -XX:MaxPermSize,完整版实测 256 MB 堆、默认 PermGen(约 85 MB)会在启动完成后 OOM。
7.2 管理员账号与密码
默认管理员为 system,默认密码为 manager,存储在 var/security/users.properties,属 admin 组(var/security/groups.properties)。
实测确认默认值:
root@server:~# cat /opt/geronimo-tomcat7-javaee6-3.0.1/var/security/users.properties
system=manager
monitor=password
修改密码必须先停服再改文件。若在服务器运行中直接编辑该文件,Geronimo 的文件监控会立刻把整份文件按内存中的旧口令重新加密写回,编辑结果会被覆盖(实测踩坑,见 FAQ 9.5):
root@server:~# /opt/geronimo-tomcat7-javaee6-3.0.1/bin/shutdown
root@server:~# sed -i 's/^system=.*/system=q1w2e3r4/;s/^monitor=.*/monitor=q1w2e3r4/' /opt/geronimo-tomcat7-javaee6-3.0.1/var/security/users.properties
root@server:~# grep -E '^system|^monitor' /opt/geronimo-tomcat7-javaee6-3.0.1/var/security/users.properties
monitor=q1w2e3r4
system=q1w2e3r4
7.3 端口配置
完整版监听端口一览(来自启动日志):
Listening on Ports:
1050 0.0.0.0 CORBA Naming Service
1099 0.0.0.0 RMI Naming
1527 0.0.0.0 Derby Connector
2001 0.0.0.0 OpenEJB SSL ORB Adapter
4201 0.0.0.0 OpenEJB Daemon
6882 0.0.0.0 OpenEJB ORB Adapter
8009 0.0.0.0 Tomcat Connector AJP TomcatAJPConnector
8080 0.0.0.0 Tomcat Connector HTTP BIO TomcatWebConnector
8443 0.0.0.0 Tomcat Connector HTTPS BIO TomcatWebSSLConnector
9999 0.0.0.0 JMX Remoting Connector
61616 0.0.0.0 ActiveMQ Transport Connector
端口偏移量在 etc/system.properties 中以 geronimo.bootstrap.PortsOffset 机制控制;也可在 var/config/config-substitutions.properties 中修改 PortOffset,使全部端口整体平移,便于单机多实例。
八、启动与验证
8.1 启动完整版
root@server:~# cd /opt/geronimo-tomcat7-javaee6-3.0.1
root@server:/opt/geronimo-tomcat7-javaee6-3.0.1# export JAVA_HOME=/opt/zulu7.56.0.11-ca-jdk7.0.352-linux_x64
root@server:/opt/geronimo-tomcat7-javaee6-3.0.1# export JAVA_OPTS="-Xms256m -Xmx512m -XX:MaxPermSize=256m"
root@server:/opt/geronimo-tomcat7-javaee6-3.0.1# bin/startup
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: 1949
启动日志(var/log/geronimo.out)关键行:
Booting Geronimo Kernel (in Java 1.7.0_352)...
Module 1/67 org.apache.geronimo.framework/j2ee-system/3.0.1/car started in .000s
Module 2/67 org.apache.geronimo.framework/rmi-naming/3.0.1/car started in .083s
Module 3/67 org.apache.geronimo.framework/plugin/3.0.1/car started in .046s
Module 4/67 org.apache.geronimo.framework/j2ee-security/3.0.1/car started in .245s
Module 10/67 org.apache.geronimo.configs/transaction-1_6/3.0.1/car started in .067s
Module 11/67 org.apache.geronimo.configs/jasper/3.0.1/car started in .020s
Module 12/67 org.apache.geronimo.configs/tomcat7/3.0.1/car started in .557s
Module 13/67 org.apache.geronimo.configs/connector-deployer-1_6/3.0.1/car started in .027s
Module 14/67 org.apache.geronimo.configs/tomcat7-deployer/3.0.1/car started in .017s
Web Applications:
/
/activemq
/console
/console-base
/monitoring
/openejb-server
/plan-creator
/plugin
/remote-deploy
/system-database
Geronimo Application Server started
8.2 HTTP 与部署工具验证
root@server:~# curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:8080/
200
root@server:~# cd /opt/geronimo-tomcat7-javaee6-3.0.1
root@server:/opt/geronimo-tomcat7-javaee6-3.0.1# bin/deploy --user system --password q1w2e3r4 list-targets
Available Targets:
org.apache.geronimo.framework/j2ee-system/3.0.1/car?ServiceModule=org.apache.geronimo.framework/j2ee-system/3.0.1/car,j2eeType=ConfigurationStore,name=Local
list-targets 返回部署目标说明部署通道(RMI 1099)与认证均正常。
浏览器访问 http://服务器IP:8080/ 进入 welcome 页,http://服务器IP:8080/console/ 为管理控制台(浏览器表单登录,账号 system / q1w2e3r4)。
九、FAQ
9.1 用 JDK 17 启动直接失败(Unrecognized VM option)
现象:
root@server:/opt/geronimo-tomcat7-javaee6-3.0.1# bin/startup
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: /usr
Using GERONIMO_OUT: /opt/geronimo-tomcat7-javaee6-3.0.1/var/log/geronimo.out
OpenJDK 64-Bit Server VM warning: Ignoring option MaxPermSize; support was removed in 8.0
Error occurred during initialization of VM
Unrecognized VM option 'MaxPermSize=128m'
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
定位:bin/geronimo 第 194 行的默认 JAVA_OPTS 含 -XX:MaxPermSize=128m。该参数在 JDK 8 中被忽略(仅告警),自 JDK 9 起随 PermGen 概念移除,JDK 17 遇到不识别参数直接拒绝创建 JVM,因此第一道坎就过不去。
结论:不要尝试通过删参数在 JDK 17 上运行,OSGi 内核后续同样过不去。正确解法是使用 JDK 7(见 2.2)。
9.2 用 JDK 8 启动报 Main not found
现象(JDK 8 上 JVM 参数告警只是 warning,随后 launcher 退出):
OpenJDK 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0
Main not found
定位:Main not found 来自 lib/geronimo-main.jar 中 org/apache/geronimo/main/Bootstrapper.class 的 getMain() 方法——它通过 OSGi ServiceTracker 查找 org.apache.geronimo.main.Main 服务,说明 Equinox OSGi 框架在 JDK 8 上未能完成 bundle 解析,Main 服务未注册。分别在 OpenJDK 1.8.0_504 两套环境实测均稳定复现,与 var/cache 内容无关(清理 OSGi 缓存后依旧失败)。
结论:Geronimo 3.0.1 的内核(Karaf 2.2 时代的 Equinox)不支持 JDK 8。JDK 7 实测通过(Module 67/67 全部 started,Application Server started),请使用 JDK 6/7。
9.3 默认 JAVA_OPTS 与脚本探测到的 JRE_HOME 不符
现象:明明 PATH 里的 java 是某个版本,日志却显示 Using JRE_HOME: /usr。
定位:JAVA_HOME 与 JRE_HOME 均未定义时,bin/setjavaenv.sh 用 which java 取当前 java、回退两级目录当作 JRE_HOME(/usr/bin/java 对应 /usr)。后续 JVM 与 deploy 工具都会使用这个路径。
解决:始终显式 export JAVA_HOME=/opt/zulu7.56.0.11-ca-jdk7.0.352-linux_x64 再执行 startup/deploy。
9.4 完整版用 256 MB 堆启动完成后 OOM
现象:以默认 JAVA_OPTS(-Xmx256m)启动,日志已打出 Geronimo Application Server started,随后进程退出,geronimo.out 末尾出现:
java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "DefaultThreadPool 1"
java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "ContainerBackgroundProcessor[StandardEngine[Geronimo]]"
定位:完整版要装载 console 等 12 个 Web 应用与大量 GBean,256 MB 堆不够用;JDK 7 默认 PermGen 也偏小。
解决:export JAVA_OPTS="-Xms256m -Xmx512m -XX:MaxPermSize=256m" 后重启。minimal 版 256 MB 堆实测无此问题。
9.5 运行中修改 users.properties 被覆盖
现象:服务运行中把 system=manager 改为 system=q1w2e3r4,几秒后再查看,该行变成以 {Simple} 开头的密文,且新密码登录失败、旧密码反而可登录。
定位:Geronimo 3.0 的安全模块监控 var/security 下的 properties 文件,检测到变更后会把整份文件按内存中已加载的口令重新加密(javax.crypto.SealedObject,AES,前缀 {Simple})写回,内存值来自启动时加载的内容,本次编辑被丢弃。
解决:一律先 bin/shutdown 停服,再修改 users.properties,随后 startup。服务在启动时会自动把明文口令加密为 {Simple} 密文,登录时使用明文原值即可。
9.6 启动报 Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
现象:
Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
At least one of these environment variable is needed to run this program
定位:setjavaenv.sh 依赖 which java 做自动探测,最小化安装的系统里没有 which 命令时探测链直接失败。
解决:apt-get install which,或(更可靠)显式 export JAVA_HOME。
9.7 服务器异常停止后重启失败:Missing Constraint: Import-Package
现象:服务器停止后再次 bin/startup,启动到应用装载阶段即中断、进程退出,geronimo.out 报此前部署的应用配置加载失败:
org.apache.geronimo.kernel.config.LifecycleException: load of default/geronimo-demo/1792057808094/war failed
Caused by: org.osgi.framework.BundleException: The bundle "default.geronimo-demo_0.0.0.1792057808094 [380]" could not be resolved. Reason: Missing Constraint: Import-Package: org.osgi.service.prefs; version="[1.1.1,1.1.1]"
定位:内核模块与其他应用(demo/DemoDS、default/geronimo-db-demo)均可正常 started,仅该应用 bundle 解析失败;实测清空 var/cache 后依旧复现,说明问题不在 OSGi 缓存,而在该应用配置本身。
解决:停服后删除 repository/ 下对应应用目录(如 rm -rf repository/default/geronimo-demo),再次 startup 即可正常启动(Application Server started)。如应用仍需使用,重新 bin/deploy deploy xxx.war 部署一次。
十、卸载与清理
Geronimo 是纯目录式安装,停服后删除目录即可,不产生系统级残留:
root@server:~# /opt/geronimo-tomcat7-javaee6-3.0.1/bin/shutdown
Stopping Geronimo Server:
[JVM in background]
root@server:~# rm -rf /opt/geronimo-tomcat7-javaee6-3.0.1
root@server:~# rm -rf /opt/geronimo-tomcat7-minimal-3.0.1
root@server:~# rm -rf /opt/zulu7.56.0.11-ca-jdk7.0.352-linux_x64
root@server:~# rm -f /etc/profile.d/geronimo.sh
如需保留历史数据(var/derby 下的业务库、var/security 的账号配置),备份 var/ 目录后再删除安装目录。
十一、参考链接
- Apache Geronimo 3.0.1 归档下载:https://archive.apache.org/dist/geronimo/3.0.1/
- Apache Geronimo 官网(退役状态说明):https://geronimo.apache.org/
- Apache Attic 项目列表:https://attic.apache.org/
- Azul Zulu JDK 下载页:https://www.azul.com/downloads/
- Geronimo 3.0 文档库(Apache Attic 存档):https://cwiki.apache.org/GMOxDOC30/