Ubuntu 22.04 安装 Apache Karaf 4.4.12 指南

从零开始在 Ubuntu 22.04 真实服务器上部署 Apache Karaf 4.4.12(服务端 OSGi 发行运行时),覆盖前置 JDK、官方下载校验、解压、JVM 堆限制配置、启动验证、feature/bundle 管理、卸载与常见排障。

Apache KarafApache Karaf2026/10/12

Ubuntu 22.04 安装 Apache Karaf 4.4.12 指南

目标:在 Ubuntu 22.04 真实服务器上从零完成 Apache Karaf 4.4.12(服务端 OSGi 发行/运行时、模块化应用运行时)的安装、JVM 堆限制配置与功能验证。本文所有命令与回显均在 Ubuntu 22.04.5 LTS + OpenJDK 17 环境实测通过,安装目录为 /opt/karaf/apache-karaf,SSH 控制台端口 8101、HTTP 端口 8181。

一、环境信息

项目值
操作系统Ubuntu 22.04.5 LTS(kernel 6.8.0-138-generic)
架构x86_64 / amd64
JDKOpenJDK 17.0.20.1(java-17-openjdk-amd64,安装于 /usr/lib/jvm/java-17-openjdk-amd64)
Apache Karaf4.4.12(最新稳定版,2026-09 发布)
OSGi 框架Apache Felix Framework 7.0.5
SSH 控制台TCP 8101(0.0.0.0)
HTTP(Jetty/Pax Web)TCP 8181(0.0.0.0)
JMX(RMI Registry / RMI Server)TCP 1099 / 44444(仅本机)
安装目录/opt/karaf/apache-karaf
管理账号admin / 密码 q1w2e3r4

💡 说明:Apache Karaf 是一个 OSGi 应用运行时,提供 shell 命令行、feature(功能特性)管理、bundle(模块)热部署等能力,常用于将多个 jar 打包为一个个 bundle 统一编排运行。

二、前置条件

  1. root 或具备 sudo 权限的账号:本文全程以 root 执行,普通用户请在各命令前加 sudo。
  2. JDK 11 或 17:Karaf 4.4.x 要求 Java 11 及以上,推荐安装 JDK 17。需配置 JAVA_HOME。
  3. 网络:需要能访问 downloads.apache.org(下载发行包)与 Maven 中央仓库 repo1.maven.org(安装 feature 时拉取依赖)。
  4. 依赖工具:wget(或 curl)、tar、gzip。

三、版本选型说明

Apache 官方下载站点 https://downloads.apache.org/karaf/ 目前维护三条主线(实测 2026-10 目录):

主线当前版本说明
4.4.x4.4.12最新稳定主线,推荐生产选型,JDK 11+ 即可
4.3.x4.3.10维护分支(End of Life 过渡)
4.2.x4.2.16旧维护分支
3.0.x3.0.10历史兼容分支,仅 gogo 时代产物,不建议新项目使用

选型建议:

  • 新项目统一选用 4.4.x 最新补丁版(当前 4.4.12),官方只对最新补丁进行安全修复;
  • 若业务锁死旧版 API,再考虑 4.3.x;生产环境不要使用 4.2.x 及以下。

刷新版本列表的命令(获取真实可用版本):

curl -sL https://downloads.apache.org/karaf/ | grep -oE '>[0-9]+\.[0-9]+\.[0-9]+/' | tr -d '>/'

四、部署步骤

4.1 安装 JDK 17 并配置 JAVA_HOME

export DEBIAN_FRONTEND=noninteractive
apt-get update
apt-get install -y openjdk-17-jdk wget curl tar

安装完成后确认版本与路径:

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 17.0.20.1+1-1-22.04-Ubuntu, mixed mode, sharing)

确认 JDK 绝对路径(Ubuntu 上为以下任一):

ls -d /usr/lib/jvm/java-17-openjdk-amd64

将 JAVA_HOME 与 PATH 写入全局环境(写入后重启终端或 source /etc/profile 生效):

echo "export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64" >> /etc/profile
echo "export PATH=\$JAVA_HOME/bin:\$PATH" >> /etc/profile
source /etc/profile

校验:

echo $JAVA_HOME

实测回显:

/usr/lib/jvm/java-17-openjdk-amd64

4.2 从 Apache 官方下载发行包并校验

创建安装上级目录并下载 apache-karaf-4.4.12.tar.gz(约 35MB):

mkdir -p /opt/downloads
cd /opt/downloads
wget https://downloads.apache.org/karaf/4.4.12/apache-karaf-4.4.12.tar.gz

实测回显(文件已下载到本地):

apache-karaf-4.4.12.tar.gz                                         100%[===========================>]
ls -lh apache-karaf-4.4.12.tar.gz

实测回显:

-rw-r--r-- 1 root root 35M Sep 22 12:17 apache-karaf-4.4.12.tar.gz

下载官方 SHA-512 校验文件并校验完整性:

curl -sL https://downloads.apache.org/karaf/4.4.12/apache-karaf-4.4.12.tar.gz.sha512 \
  > apache-karaf-4.4.12.tar.gz.sha512
sha512sum -c apache-karaf-4.4.12.tar.gz.sha512

实测回显(表示校验通过):

apache-karaf-4.4.12.tar.gz: OK

💡 说明:本文实测 sha512 为 e50442276a2c475c31bf7121936a65abcee7ac79f233e5ec118a7589dd6dd780c9c4afc546e67906c77c1dff771b745144553ffa6080848b6806f0932314a26b,校验输出 OK 即表示与服务端一致。生产环境建议同时用签名与 KEYS 校验,这里以官方 sha512 即可满足完整性要求。

4.3 解压并重命名安装目录

mkdir -p /opt/karaf
tar -xzf /opt/downloads/apache-karaf-4.4.12.tar.gz -C /opt/karaf
mv /opt/karaf/apache-karaf-4.4.12 /opt/karaf/apache-karaf

查看顶层目录结构:

ls -la /opt/karaf/apache-karaf

实测回显:

total 64
drwxr-xr-x  9 root root  4096 Oct 11 11:41 .
drwxr-xr-x  3 root root  4096 Oct 11 11:41 ..
-rw-r--r--  1 root root 19832 Sep 22 11:38 LICENSE
-rw-r--r--  1 root root  2800 Sep 22 11:38 NOTICE
-rw-r--r--  1 root root  3592 Sep 22 11:38 README.md
drwxr-xr-x  3 root root  4096 Sep 22 11:38 bin
drwxr-xr-x  3 root root  4096 Sep 22 11:38 data
drwxr-xr-x  2 root root  4096 Sep 22 11:38 deploy
drwxr-xr-x  3 root root  4096 Sep 22 11:38 etc
drwxr-xr-x 32 root root  4096 Sep 22 11:38 examples
drwxr-xr-x  6 root root  4096 Sep 22 11:38 lib
drwxr-xr-x  3 root root  4096 Sep 22 11:38 system

关键目录说明:

目录作用
bin/启动/停止/控制台客户端脚本
etc/全部配置文件(含用户、端口、JVM、feature 源等)
deploy/热部署目录,放入 jar 会自动安装为 bundle
data/运行时数据、日志(data/log/karaf.log)
system/本地 OSGi 仓库(内置 jar 缓存)

4.4 配置 JVM 堆限制(256–512MB)与 JAVA_HOME

Karaf 4.4.x 不再使用 etc/karafrc,JVM 参数配置在启动脚本引用到的 bin/setenv(也可以直接改 bin/karaf)。修改 bin/setenv,将 # export JAVA_OPTS(Generic JVM options 注释行)替换为以下实际配置(同时写入 JAVA_HOME):

sed -i \
  "s|# export JAVA_OPTS # Generic JVM options, for instance, where you can pass the memory configuration|export JAVA_OPTS=\"-Xms256m -Xmx512m -XX:+HeapDumpOnOutOfMemoryError\"\nexport JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64|" \
  /opt/karaf/apache-karaf/bin/setenv

💡 说明:-Xms256m 为初始堆、-Xmx512m 为最大堆,将堆限制在 256–512MB 区间,避免 Karaf 默认按物理内存自动扩容抢占资源;-XX:+HeapDumpOnOutOfMemoryError 在 OOM 时输出 heap dump 便于排障。

确认修改已写入:

grep -nE "JAVA_OPTS|JAVA_HOME" /opt/karaf/apache-karaf/bin/setenv

实测回显:

39:export JAVA_OPTS="-Xms256m -Xmx512m -XX:+HeapDumpOnOutOfMemoryError"
40:export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64

4.5 创建管理账号(SSH 控制台登录)

默认 etc/users.properties 中没有可用账号,需要追加一个 admin 用户用于 SSH 控制台(8101)登录。执行:

KAFAR_HOME=/opt/karaf/apache-karaf
printf 'admin = q1w2e3r4,_g_:admingroup\n_g_\\:admingroup = group,admin,manager,viewer,systembundles,ssh\n' \
  >> "$KAFAR_HOME/etc/users.properties"

确认追加成功:

tail -3 /opt/karaf/apache-karaf/etc/users.properties

实测回显:

#_g_\:admingroup = group,admin,manager,viewer,systembundles,ssh
admin = q1w2e3r4,_g_:admingroup
_g_\:admingroup = group,admin,manager,viewer,systembundles,ssh

💡 说明:admin 属于 admingroup,该组被授予 group,admin,manager,viewer,systembundles,ssh 角色,即具备完整控制台权限。

4.6 启动并进入控制台

方式 A:前台交互式启动

export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
cd /opt/karaf/apache-karaf
bin/karaf

实测回显(进入交互式 shell,提示符为 karaf@root()>):

        __ __                  ____
       / //_/____ __________ _/ __/
      / ,<  / __ `/ ___/ __ `/ /_
     / /| |/ /_/ / /  / /_/ / __/
    /_/ |_|\__,_/_/   \__,_/_/

  Apache Karaf (4.4.12)

Hit '<tab>' for a list of available commands
and '[cmd] --help' for help on a specific command.
Hit '<ctrl-d>' or type 'system:shutdown' or 'logout' to shutdown Karaf.

karaf@root()>

方式 B:后台守护进程方式(推荐生产)

cd /opt/karaf/apache-karaf
bin/start
sleep 20
bin/status

实测回显:

Running ...

用 jps -v 验证 JVM 参数与进程已带上堆限制:

jps -v | grep -i karaf

实测回显(进程参数行,-Xms256m -Xmx512m 在列):

3765 Main -Xms256m -Xmx512m -XX:+HeapDumpOnOutOfMemoryError --add-reads=java.xml=java.logging --add-exports=java.base/org.apache.karaf.specs.locator=java.xml,ALL-UNNAMED --patch-module=java.base=/opt/karaf/apache-karaf/lib/endorsed/org.apache.karaf.specs.locator-4.4.12.jar --patch-module=java.xml=/opt/karaf/apache-karaf/lib/endorsed/org.apache.karaf.specs.java.xml-4.4.12.jar --add-opens=java.base/java.security=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.naming/javax.naming.spi=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport.tcp=ALL-UNNAMED --add-exports=java.base/sun.net.www.protocol.file=ALL-UNNAMED --add-exports=java.base/sun.net.www.protocol.ftp=ALL-UNNAMED --add-exports=java.base/sun.net.www.protocol.http=ALL-UNNAMED --add-exports=java.base/sun.net.www.protocol.https=ALL-UNNAMED --add-exports=java.base/sun.net.www.protocol.jar=ALL-UNNAMED --add-exports=java.base/sun.net.www.content.text=ALL-UNNAMED

4.7 验证运行状态

登录控制台方式:使用 bin/client 连接 SSH 控制台端口 8101,把命令通过标准输入传入:

cd /opt/karaf/apache-karaf
printf 'feature:list | grep Started\n' | bin/client -u admin -p q1w2e3r4

实测回显(控制台横幅 + 登录后的 admin@root() 提示符,已启动 feature 共 18 行全量):

        __ __                  ____
       / //_/____ __________ _/ __/
      / ,<  / __ `/ ___/ __ `/ /_
     / /| |/ /_/ / /  / /_/ / __/
    /_/ |_|\__,_/_/   \__,_/_/

  Apache Karaf (4.4.12)

Hit '<tab>' for a list of available commands
and '[cmd] --help' for help on a specific command.
Hit 'system:shutdown' to shutdown Karaf.
Hit '<ctrl-d>' or type 'logout' to disconnect shell from current session.

admin@root()> feature:list | grep Started
feature                           | 4.4.12           | x        | Started     | standard-4.4.12          | Features Support
shell                             | 4.4.12           | x        | Started     | standard-4.4.12          | Karaf Shell
deployer                          | 4.4.12           | x        | Started     | standard-4.4.12          | Karaf Deployer
bundle                            | 4.4.12           | x        | Started     | standard-4.4.12          | Provide Bundle support
config                            | 4.4.12           | x        | Started     | standard-4.4.12          | Provide OSGi ConfigAdmin support
diagnostic                        | 4.4.12           | x        | Started     | standard-4.4.12          | Provide Diagnostic support
instance                          | 4.4.12           | x        | Started     | standard-4.4.12          | Provide Instance support
jaas                              | 4.4.12           | x        | Started     | standard-4.4.12          | Provide JAAS support
log                               | 4.4.12           | x        | Started     | standard-4.4.12          | Provide Log support
package                           | 4.4.12           | x        | Started     | standard-4.4.12          | Package commands and mbeans
service                           | 4.4.12           | x        | Started     | standard-4.4.12          | Provide Service support
system                            | 4.4.12           | x        | Started     | standard-4.4.12          | Provide System support
kar                               | 4.4.12           | x        | Started     | standard-4.4.12          | Provide KAR (KARaf archive) support
ssh                               | 4.4.12           | x        | Started     | standard-4.4.12          | Provide a SSHd server on Karaf
management                        | 4.4.12           | x        | Started     | standard-4.4.12          | Provide a JMX MBeanServer and a set of MBeans in
eventadmin                        | 4.4.12           | x        | Started     | standard-4.4.12          | OSGi Event Admin service specification for event-
pax-url-wrap                      | 2.7.1            |          | Started     | standard-4.4.12          | Wrap URL handler
wrap                              | 2.7.1            | x        | Started     | standard-4.4.12          | Transition feature to pax-url-wrap

查看已安装 bundle(注意默认阈值):

printf 'bundle:list -t 0\n' | bin/client -u admin -p q1w2e3r4

💡 说明:bundle:list 默认阈值(threshold)为 50,只会打印 start-level ≥ 50 的 bundle(仅有系统 Event 服务等少数),要看全量请加 -t 0。实测共 53 个 bundle(全量),列出 System Bundle(Felix 7.0.5)以及 Karaf 各核心模块。

验证端口监听(8101 SSH 控制台、8181 HTTP、1099/44444 JMX):

while read -r _ loc _ st _; do
  [ "$st" = "0A" ] || continue
  port=$((16#${loc#*:}))
  case $port in 8101|8181|1099|44444) printf 'tcp6 port %d listen %s\n' "$port" "${loc%:*}";; esac
done < /proc/net/tcp6

实测回显(Karaf 四个端口全量):

tcp6 port 44444 listen 0000000000000000FFFF00000100007F
tcp6 port 8101 listen 00000000000000000000000000000000
tcp6 port 8181 listen 00000000000000000000000000000000
tcp6 port 1099 listen 0000000000000000FFFF00000100007F

4.8 安装功能特性(feature)与 bundle 实测

安装 http feature(拉起 Jetty/Pax Web,监听 8181):

printf 'feature:install http\n' | bin/client -u admin -p q1w2e3r4

查看日志确认 Jetty 启动在 8181:

tail -5 /opt/karaf/apache-karaf/data/log/karaf.log

实测回显(关键行):

Started default@63f245f2{HTTP/1.1, (http/1.1)}{0.0.0.0:8181}
Registering HttpService factory
Binding HTTP Service for bundle: [org.apache.karaf.http.core [54]]

安装 webconsole(Web 管理台,需先装 http):

printf 'feature:install webconsole\n' | bin/client -u admin -p q1w2e3r4

验证 Web 管理台可访问(未登录返回 401 属正常,说明 HTTP 服务已就绪):

curl -s -o /dev/null -w "HTTP %{http_code}\n" http://127.0.0.1:8181/system/console

实测回显:

HTTP 401

💡 说明:http://<服务器IP>:8181/system/console 是 Karaf Web 管理台地址,用 admin/q1w2e3r4 登录。

安装一个 bundle(bundle:install)+ 启停 + 卸载实测:

cd /opt/karaf/apache-karaf
cat > /tmp/cmds.txt <<EOF
bundle:install mvn:org.apache.felix/org.apache.felix.eventadmin/1.6.4
bundle:list -t 0 82
bundle:start 82
bundle:stop 82
bundle:uninstall 82
bundle:list -t 0 82
EOF
bin/client -u admin -p q1w2e3r4 < /tmp/cmds.txt

实测回显(截取关键输出):

admin@root()> bundle:install mvn:org.apache.felix/org.apache.felix.eventadmin/1.6.4
Bundle ID: 82
admin@root()> bundle:list -t 0 82
82 | Active |  80 | 1.6.4   | Apache Felix EventAdmin
admin@root()> bundle:uninstall 82
admin@root()> bundle:list -t 0 82

💡 说明:安装后刚 bundle:start 时状态为 Active;bundle:uninstall 后再查询该 ID 无输出,表示已彻底移除。

五、配置说明(含 JVM 堆限制)

5.1 关键配置文件位置

所有配置都在 /opt/karaf/apache-karaf/etc/ 下,改动后注意部分需在客户端执行 config:update 或重启实例生效:

文件用途
users.properties登录账号/组/角色(JAAS)
org.apache.karaf.shell.cfgSSH 控制台端口(默认 8101)
org.apache.karaf.management.cfgJMX 端口(1099/44444)
org.ops4j.pax.web.cfgHTTP/HTTPS 端口(默认 8181)
org.apache.karaf.features.cfgfeature 仓库与启动特性
org.ops4j.pax.logging.cfg日志配置
bin/setenvJVM 参数(JAVA_OPTS、JAVA_HOME),堆限制在此配置

5.2 JVM 堆限制核对方式

修改 bin/setenv 后,用 jps -v 确认生效(见 4.6 回显,含 -Xms256m -Xmx512m);也可在控制台用 shell:info 查看运行时堆:

printf 'shell:info\n' | bin/client -u admin -p q1w2e3r4

实测回显(关键段,Maximum heap size 为 512MB=524288KB,Committed 为 256MB):

Memory
  Current heap size           154,367 kbytes
  Maximum heap size           524,288 kbytes
  Committed heap size         262,144 kbytes

六、注意事项

  • 首次以 root 直接运行 bin/karaf 前台启动是可以的;若在生产以 root 运行并设置了安全策略,可使用 KARAF_NOROOT 相关开关,本文不启用。
  • bundle:list 默认阈值 50 只显示高 start-level 的 bundle,看全量务必 -t 0,避免误判「bundle 缺失」。
  • webconsole 依赖 OSGi HTTP Service(即 http/pax-web feature),需先装 http 再装 webconsole,否则直接装会报 osgi.http 依赖缺失。
  • 修改 etc/ 下用户与端口配置后需要重启实例生效;feature/bundle 级别热操作立即生效。
  • 堆上限 512MB 适合轻量运行;若挂载大量业务 bundle 可适度上调,但生产仍建议控制在 512MB 左右并配合 -XX:+HeapDumpOnOutOfMemoryError。

七、常见问题(FAQ)

Q1:bin/client 提示 Closed 或连接即断开?

SSH 服务器 8101 未就绪时会出现。确认 sshHost/sshPort、是否已 bin/start 且等待约 10–20s,再重试;改用标准输入喂命令(printf 'feature:list\n' | bin/client -u admin -p q1w2e3r4)更稳定。

Q2:bundle:list 只看到一两个 bundle?

因为默认阈值 50 过滤掉了多数底层 bundle,惯例加 -t 0 查看全量。

Q3:feature:install webconsole 报 Unable to resolve root 依赖缺失?

未先安装 http feature,报错关键段为 missing requirement [webconsole/4.4.12] osgi.implementation; osgi.implementation=osgi.http; version:Version=1.1.0。按序执行 feature:install http 后再装 webconsole。

Q4:如何改 SSH 控制台端口?

编辑 etc/org.apache.karaf.shell.cfg 的 sshPort,重启生效。

八、卸载与清理

停止实例:

cd /opt/karaf/apache-karaf
bin/stop
bin/status

实测回显:

Not Running ...

删除安装目录与下载缓存:

rm -rf /opt/karaf/apache-karaf
rm -rf /opt/downloads/apache-karaf-4.4.12.tar.gz

若同时清除环境变量引用,删除 /etc/profile 中新增的两行 JAVA_HOME/PATH 导出即可。

九、参考链接