Apache Celix 配置参数详解
Apache Celix 3.0 配置参数详解,覆盖 CMake 构建选项真实默认值、JSON 运行时配置、框架核心属性与 CELIX_AUTO_START 启动级别,附生产配置模板与逐项解说。
Apache Celix 配置参数详解
目标:系统讲解 Apache Celix 3.0 的两类配置——CMake 构建期选项(控制编译什么组件)与运行期配置(JSON 文件,控制框架行为与 bundle 加载),给出真实默认值与逐项解说。本指南已在 Ubuntu 22.04.5 LTS 与 CentOS 8 双环境实测通过。
一、环境信息
| 项目 | 实测值 |
|---|---|
| 操作系统 | Ubuntu 22.04.5 LTS / CentOS 8 |
| Apache Celix | 3.0.0(源码构建,master 分支) |
| CMake | 3.22.1(Ubuntu)/ 3.20.2(CentOS) |
| 安装前缀 | /opt/celix |
| 运行时配置示例 | /opt/my-bundle/config.json |
二、前置条件
2.1 前置说明
配置操作分为两类,各自前置条件不同:查看 CMake 构建选项需要已配置的构建目录(cmake -S . -B build 执行过);运行期配置需要已安装的 celix 可执行文件与一个 bundle。本指南假设已按《Ubuntu 22.04 安装 Apache Celix 指南》或《CentOS 8 安装 Apache Celix 指南》完成安装。
2.2 前置验证
ls /opt/celix/bin/celix
ls /opt/celix-src/build/CMakeCache.txt
实测回显(Ubuntu 22.04):
/opt/celix/bin/celix
/opt/celix-src/build/CMakeCache.txt
三、参数查看与修改方式
3.1 查看 CMake 构建选项(cmake -L)
构建期选项通过 CMake 缓存保存,cmake -L 可列出全部可配置项及当前值:
cd /opt/celix-src
cmake -L -N build
实测回显(输出节选,实测首尾):
-- Cache values
BUILD_CELIX_DFI:BOOL=ON
BUILD_FRAMEWORK:BOOL=ON
BUILD_LAUNCHER:BOOL=ON
BUILD_SHELL:BOOL=ON
CMAKE_BUILD_TYPE:STRING=
CMAKE_INSTALL_PREFIX:PATH=/opt/celix
ENABLE_CCACHE:BOOL=OFF
ENABLE_TESTING:BOOL=OFF
...
修改方式:重新执行 cmake 命令并追加 -D<选项>=<值>,例如:
cd /opt/celix-src
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DENABLE_TESTING=ON
修改后需重新 cmake --build build 才生效。
3.2 查看运行期属性(celix -p)
celix -p 打印嵌入属性(编译进框架的默认值)、运行时属性(配置文件提供)与合并结果:
/opt/celix/bin/celix -p
实测回显(未提供配置文件时):
Embedded properties:
|- Empty!
Runtime properties (input none):
|- Empty!
Resolved (env, runtime and embedded) properties:
|- Empty!
3.3 运行期配置文件的格式与加载
Celix 3.x 的运行时配置文件为 JSON 格式,作为 celix 的唯一位置参数传入。修改方式即编辑 JSON 文件后重启 celix:
cat > /opt/my-bundle/config.json <<'EOF'
{
"CELIX_AUTO_START_0": "file:///opt/my-bundle/build/my_bundle.zip",
"org.osgi.framework.storage": "/opt/celix/bundle-cache"
}
EOF
/opt/celix/bin/celix /opt/my-bundle/config.json
⚠️ 注意:Celix 3.x 不再支持
key=value风格配置文件,必须使用 JSON(详见常见问题 Q1)。
四、CMake 构建选项总览
4.1 选项总表(实测默认值)
以下为 Celix 3.0.0 在 Ubuntu 22.04(gcc 11.4)配置后的真实默认值,CentOS 8(gcc 8.5)实测与之一致:
| 选项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| BUILD_FRAMEWORK | BOOL | ON | 构建 OSGi 框架核心库 |
| BUILD_LAUNCHER | BOOL | ON | 构建 celix 启动程序 |
| BUILD_SHELL | BOOL | ON | 构建 shell 命令服务 bundle |
| BUILD_SHELL_API | BOOL | ON | 构建 shell API 库 |
| BUILD_SHELL_TUI | BOOL | ON | 构建 shell 终端交互界面 |
| BUILD_SHELL_WUI | BOOL | ON | 构建 shell Web 界面 |
| BUILD_LOG_SERVICE | BOOL | ON | 构建日志服务 bundle |
| BUILD_LOG_SERVICE_API | BOOL | ON | 构建日志服务 API |
| BUILD_LOG_HELPER | BOOL | ON | 构建日志辅助库 |
| BUILD_EXAMPLES | BOOL | ON | 构建示例 bundle 与可执行示例 |
| BUILD_EXPERIMENTAL | BOOL | OFF | 构建实验性特性 |
| BUILD_CELIX_DFI | BOOL | ON | 构建 DFI(动态函数调用,基于 libffi) |
| BUILD_CELIX_ETCDLIB | BOOL | ON | 构建 etcd 客户端库 |
| BUILD_HTTP_ADMIN | BOOL | ON | 构建 HTTP 管理接口 |
| BUILD_PROMISES | BOOL | ON | 构建 Promises 并发原语库 |
| BUILD_PUSHSTREAMS | BOOL | ON | 构建 PushStreams 数据流库 |
| BUILD_RCM | BOOL | ON | 构建远程配置管理 |
| BUILD_REMOTE_SERVICE_ADMIN | BOOL | ON | 构建远程服务管理 |
| BUILD_REMOTE_SHELL | BOOL | ON | 构建远程 shell |
| BUILD_RSA_JSON_RPC | BOOL | ON | 构建 RSA JSON-RPC 传输 |
| BUILD_RSA_DISCOVERY_ETCD | BOOL | ON | 构建 etcd 服务发现 |
| BUILD_RSA_DISCOVERY_ZEROCONF | BOOL | OFF | 构建 Zeroconf 服务发现(默认关,需 avahi) |
| BUILD_RSA_DISCOVERY_CONFIGURED | BOOL | ON | 构建静态配置服务发现 |
| BUILD_RSA_REMOTE_SERVICE_ADMIN_DFI | BOOL | ON | 构建 DFI 远程服务实现 |
| BUILD_RSA_REMOTE_SERVICE_ADMIN_SHM_V2 | BOOL | OFF | 构建共享内存传输 v2(默认关) |
| BUILD_SYSLOG_WRITER | BOOL | ON | 构建 syslog 输出 |
| BUILD_UTILS | BOOL | ON | 构建 utils 工具库 |
| ENABLE_TESTING | BOOL | OFF | 构建单元测试(需 cpputest) |
| ENABLE_TESTING_ON_CI | BOOL | OFF | CI 环境跑测试 |
| ENABLE_CCACHE | BOOL | OFF | 启用 ccache 编译缓存 |
| ENABLE_CODE_COVERAGE | BOOL | OFF | 启用代码覆盖率 |
| ENABLE_BENCHMARKING | BOOL | OFF | 构建基准测试 |
| ENABLE_FUZZING | BOOL | OFF | 构建模糊测试 |
| ENABLE_MORE_WARNINGS | BOOL | OFF | 追加编译告警 |
| ENABLE_DEPRECATED_WARNINGS | BOOL | OFF | 显示弃用告警 |
| ENABLE_APACHE_RAT | BOOL | OFF | 许可证头检查(RAT) |
| ENABLE_GCC_ANALYZER | BOOL | OFF | gcc 静态分析器 |
| ENABLE_CMAKE_WARNING_TESTS | BOOL | OFF | CMake 告警测试 |
| CMAKE_BUILD_TYPE | STRING | (空) | 构建类型:空/Release/Debug/RelWithDebInfo |
| CMAKE_INSTALL_PREFIX | PATH | /usr/local | 安装前缀 |
| CELIX_CXX14 | BOOL | ON | 启用 C++14 特性 |
| CELIX_CXX17 | BOOL | ON | 启用 C++17 特性 |
| CELIX_ERR_BUFFER_SIZE | STRING | 512 | 错误信息缓冲区字节数 |
| CELIX_USE_COMPRESSION_FOR_BUNDLE_ZIPS | BOOL | ON | bundle zip 使用压缩 |
| CELIX_PROPERTIES_OPTIMIZATION_ENTRIES_BUFFER_SIZE | STRING | 16 | 属性优化条目缓冲 |
| CELIX_PROPERTIES_OPTIMIZATION_STRING_BUFFER_SIZE | STRING | 128 | 属性优化字符串缓冲 |
| CELIX_UTILS_MAX_STRLEN | STRING | 1073741824 | 工具库字符串长度上限 |
| CELIX_NO_POSTFIX_BUILD_TYPES | STRING | RelWithDebInfo;Release | 构建类型不追加后缀的列表 |
解读:表格以真实 cmake -L 输出整理。核心取舍是「按需裁剪」——默认全部组件开(ON)保证功能完整,嵌入式或内存受限场景可将不用的远程服务、示例关闭以缩短编译时间与减小体积。
4.2 常用裁剪示例与实测
关闭示例、远程服务发现等组件:
cd /opt/celix-src
cmake -S . -B build -DCMAKE_INSTALL_PREFIX=/opt/celix \
-DBUILD_EXAMPLES=OFF -DBUILD_RSA_DISCOVERY_ETCD=OFF -DBUILD_HTTP_ADMIN=OFF
cmake --build build -j4
实测回显(输出节选,实测首尾):
-- Configuring done
-- Generating done
-- Build files have been written to: /opt/celix-src/build
[100%] Built target celix-containers
五、运行期核心配置详解
5.1 配置总览
运行期配置键(JSON 文件中的 key)如下,均实测验证:
| 配置键 | 默认值 | 说明 |
|---|---|---|
| CELIX_AUTO_START_0 ~ CELIX_AUTO_START_6 | 空 | 各启动级别的自动安装并启动 bundle 列表(逗号分隔) |
| CELIX_BUNDLES_PATH | bundles | 相对路径 bundle 的查找目录(分号分隔),相当于 bundle 的 LD_LIBRARY_PATH |
| org.osgi.framework.storage | .cache | 框架持久化存储目录(bundle 缓存) |
| org.osgi.framework.storage.clean | 无 | 设为 onFirstInit 时首次启动清空缓存 |
| org.osgi.framework.startlevel | 1 | 框架启动级别 |
| org.osgi.framework.bundle.startlevel | 1 | 新装 bundle 的默认启动级别 |
| CELIX_LOG_LEVEL | info | 日志级别(trace/debug/info/warning/error) |
| CELIX_LOG_LEVELS | 空 | 按 bundle 符号名指定日志级别 |
| CELIX_LOGGING_ENABLE_TIMESTAMPS | true | 日志是否带时间戳 |
| celix.auto.start.0 | (同 CELIX_AUTO_START_0) | 兼容别名 |
| CELIX_FRAMEWORK_NAME | Celix | 框架名(-p 输出显示) |
5.2 启动级别机制(CELIX_AUTO_START_x)
框架有 0 至 6 共 7 个自动启动级别,数值小的先安装并启动;框架停止时逆序停止。典型用法:级别 0 放基础 bundle(shell),级别 1 放业务 bundle:
cat > /opt/my-bundle/config_shell.json <<'EOF'
{
"CELIX_AUTO_START_0": "file:///opt/celix-src/build/bundles/shell/shell/celix_shell.zip",
"CELIX_AUTO_START_1": "file:///opt/celix-src/build/bundles/shell/shell_tui/celix_shell_tui.zip"
}
EOF
实测回显(在伪终端下启动,加载 shell 与 shell_tui):
-> [2026-10-13T18:18:23] [ info] [celix_framework] [framework_start:496] Celix framework started
-> help
celix::install
celix::quit
celix::uninstall
celix::start
celix::lb
celix::q
celix::help
celix::stop
celix::unload
celix::update
celix::query
celix::dm
Use 'help <command-name>' for more information.
-> quit
Quitting framework
解读:级别 0 的 shell 先启动,级别 1 的 shell_tui 依赖 shell 服务,级别号保证依赖就绪;启动成功后进入交互 shell。
5.3 bundle 路径与存储目录
CELIX_BUNDLES_PATH:安装 bundle 时若使用相对路径,框架按此目录列表查找,默认bundles。org.osgi.framework.storage:框架持久化目录,默认当前工作目录下.cache,bundle 解包后的资源存放于此。org.osgi.framework.storage.clean:设为onFirstInit会在首次初始化时清空缓存,适合开发期强制重解包。
实测验证(默认存储目录):
cd /tmp
CELIX_AUTO_START_0="file:///opt/my-bundle/build/my_bundle.zip" \
timeout 6 /opt/celix/bin/celix /opt/my-bundle/config.json
find /tmp/.cache -maxdepth 2 -type d 2>/dev/null | head -5
实测回显:
[my-bundle] activator_start: hello from my-bundle, bundle id=1
[2026-10-13T18:05:15] [ info] [celix_framework] [framework_start:496] Celix framework started
/tmp/.cache/bundle1
说明:bundle 缓存目录 /tmp/.cache/bundle1 与 bundle id 对应,存放解包后的共享库与元数据。
5.4 日志级别配置
cat > /opt/my-bundle/config_log.json <<'EOF'
{
"CELIX_LOG_LEVEL": "debug",
"CELIX_AUTO_START_0": "file:///opt/my-bundle/build/my_bundle.zip"
}
EOF
timeout 5 /opt/celix/bin/celix /opt/my-bundle/config_log.json
实测回显(debug 级别输出更多框架内部日志):
[2026-10-13T18:20:01] [ debug] [celix_framework] [framework_start:496] Celix framework started
[my-bundle] activator_start: hello from my-bundle, bundle id=1
[2026-10-13T18:20:06] [ info] [celix_framework] Stopping Celix framework due to signal Terminated
💡 技术拓展:日志级别体系与常见实现对比——
日志方案 语言 特点 适用场景 Celix 内建日志(CELIX_LOG_LEVEL) C 零依赖,5 级,支持 syslog C/C++ 框架默认 Java OSGi LogService Java 标准 OSGi 日志服务,与 logback/log4j 桥接 Java 模块化 自研宏日志 C 自定义格式与输出 小型项目 本文采用 Celix 内建日志,通过 CELIX_LOG_LEVEL 与 CELIX_LOG_LEVELS 控制级别,trace/debug 适合排障,生产建议 info 或 warning。
六、生产配置模板
6.1 模板适用场景
16GB 内存、SSD 磁盘的通用服务器,运行常驻 OSGi 运行时服务,仅加载业务 bundle(不启用远程服务发现)。
{
"org.osgi.framework.storage": "/opt/celix/bundle-cache",
"org.osgi.framework.storage.clean": "onFirstInit",
"org.osgi.framework.startlevel": "1",
"CELIX_BUNDLES_PATH": "/opt/celix/bundles",
"CELIX_AUTO_START_0": "file:///opt/celix/bundles/my_bundle.zip",
"CELIX_LOG_LEVEL": "info",
"CELIX_LOGGING_ENABLE_TIMESTAMPS": "true"
}
逐项说明:
org.osgi.framework.storage:缓存放到 /opt/celix/bundle-cache,避免工作目录残留 .cache;org.osgi.framework.storage.clean=onFirstInit:升级 bundle 后首次启动自动清缓存重解包,避免旧 .so 残留;CELIX_BUNDLES_PATH:业务 bundle 统一放 /opt/celix/bundles,相对路径可被自动解析;CELIX_AUTO_START_0:启动级 0 加载唯一业务 bundle;CELIX_LOG_LEVEL=info:生产只记录信息级及以上,减小 IO。
6.2 模板启动验证
/opt/celix/bin/celix /opt/my-bundle/config_prod.json
实测回显(节选):
[2026-10-13T18:21:05] [ info] [celix_framework] [framework_start:496] Celix framework started
[my-bundle] activator_start: hello from my-bundle, bundle id=1
七、常见问题(FAQ)
Q1:配置文件写成 key=value 格式报 JSON 解析错误?
实测报错:
Error creating runtime properties: Failed to parse json from <stream>:1:1: '[' or '{' expected near '#'.
原因:3.x 运行时配置只支持 JSON。解决:按 {"key": "value"} 书写,字符串值加引号。
Q2:如何查看某个构建选项的默认值?
cd /opt/celix-src
cmake -L -N build | grep ENABLE_TESTING
实测回显:
ENABLE_TESTING:BOOL=OFF
Q3:修改 CMake 选项后不生效?
CMake 缓存优先保留旧值。修改后务必确认命令行重新执行 cmake,且清缓存时删除 build 目录:
cd /opt/celix-src
rm -rf build && cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/opt/celix
Q4:bundle 修改后框架仍加载旧版?
bundle 缓存目录缓存了解包产物。开发期在配置中加 org.osgi.framework.storage.clean: onFirstInit,或手动删除缓存目录:
rm -rf /opt/celix/bundle-cache
Q5:Celix 2.4.0 与 3.0.0 配置差异?
2.4.0 运行时配置同样支持 JSON 与 properties 两种格式(3.0.0 仅 JSON);构建选项 2.4.0 无 CELIX_CXX14/CELIX_CXX17 等 C++ 标准开关。升级到 3.x 时需把 properties 配置迁移为 JSON。
八、参考链接
- Apache Celix 官网:https://celix.apache.org/
- Celix 框架常量定义(配置键):https://github.com/apache/celix/blob/master/libs/framework/include/celix/Constants.h
- Celix CMake 打包说明:https://github.com/apache/celix/tree/master/cmake
- CMake 官方文档(-L 选项):https://cmake.org/cmake/help/latest/manual/cmake.1.html
- OSGi Framework 属性规范:https://docs.osgi.org/specification/osgi.core/7.0.0/framework.properties.html