6.2 KiB
6.2 KiB
ThingsBoard Java 启动方式说明
1. 核心结论
ThingsBoard 最终还是用 java -jar (或 java -cp) 启动的!
DEB 包不是替代 Java 启动方式,而是用来安装和管理文件的。
2. 启动流程
2.1 完整流程
DEB 包安装 → 文件安装到系统 → 启动脚本执行 → java -jar 启动应用
↓ ↓ ↓ ↓
管理文件 设置权限 加载配置 运行 Java
2.2 实际启动命令
查看 msa/tb-node/docker/start-tb-node.sh,第 69 行:
exec java -cp ${jarfile} $JAVA_OPTS \
-Dloader.main=org.thingsboard.server.ThingsboardServerApplication \
-Dlogging.config=${LOGGING_CONFIG} \
org.springframework.boot.loader.launch.PropertiesLauncher
这就是标准的 Java 启动方式!
3. DEB 包的作用
3.1 DEB 包做什么
DEB 包的作用是文件管理和安装,不是启动方式:
-
文件安装: 将 JAR 文件、配置文件、脚本复制到标准位置
/usr/share/thingsboard/bin/thingsboard.jar ← JAR 文件 /usr/share/thingsboard/conf/thingsboard.yml ← 配置文件 /usr/bin/start-tb-node.sh ← 启动脚本 -
权限设置: 自动设置正确的文件权限和所有者
chown -R thingsboard:thingsboard /usr/share/thingsboard chmod 555 /usr/share/thingsboard/bin/thingsboard.jar -
依赖检查: 检查是否安装了 Java 17
-
系统集成: 注册 systemd 服务(可选)
3.2 DEB 包不做什么
- ❌ 不启动应用: DEB 包安装后不会自动启动
- ❌ 不替代 Java: 最终还是用
java命令启动 - ❌ 不改变启动方式: 启动方式仍然是标准的 Java 启动
4. 两种使用场景对比
4.1 场景1:直接使用 JAR(不用 DEB)
# 手动下载 JAR
wget https://github.com/thingsboard/thingsboard/releases/download/v4.2.1/thingsboard-4.2.1-boot.jar
# 直接启动
java -jar thingsboard-4.2.1-boot.jar \
--spring.config.name=thingsboard
优点: 简单直接
缺点:
- 需要手动管理文件位置
- 需要手动设置权限
- 需要手动管理配置文件
4.2 场景2:使用 DEB 包安装(ThingsBoard 采用)
# 1. 安装 DEB 包(自动管理文件)
dpkg -i thingsboard-4.2.1.deb
# 2. 启动(启动脚本内部还是用 java -jar)
start-tb-node.sh
# 或
systemctl start thingsboard
优点:
- ✅ 标准化文件位置
- ✅ 自动设置权限
- ✅ 配置文件管理
- ✅ 系统服务集成
缺点: 多了一个安装步骤
5. 启动脚本详解
5.1 start-tb-node.sh 分析
#!/bin/bash
# 1. 定义 JAR 文件路径(DEB 包安装后的位置)
jarfile=${pkg.installFolder}/bin/${pkg.name}.jar
# 实际路径: /usr/share/thingsboard/bin/thingsboard.jar
# 2. 加载配置文件(DEB 包安装的配置文件)
CONF_FOLDER="/usr/share/thingsboard/conf"
source "${CONF_FOLDER}/${pkg.name}.conf"
# 3. 切换到工作目录
cd ${pkg.installFolder}/bin
# 4. 启动应用(标准的 Java 启动方式)
exec java -cp ${jarfile} $JAVA_OPTS \
-Dloader.main=org.thingsboard.server.ThingsboardServerApplication \
-Dlogging.config=${LOGGING_CONFIG} \
org.springframework.boot.loader.launch.PropertiesLauncher
5.2 为什么用 java -cp 而不是 java -jar
ThingsBoard 使用 java -cp + PropertiesLauncher 的原因:
- 支持外部配置: 可以加载外部配置文件
- 支持扩展: 可以加载
extensions/目录下的扩展 - 灵活启动: 可以指定不同的主类(安装、升级、运行)
5.3 等效的启动命令
如果不用启动脚本,等效的命令是:
java -cp /usr/share/thingsboard/bin/thingsboard.jar \
-Dloader.main=org.thingsboard.server.ThingsboardServerApplication \
-Dlogging.config=/usr/share/thingsboard/conf/logback.xml \
org.springframework.boot.loader.launch.PropertiesLauncher
6. Docker 中的使用
6.1 Dockerfile 流程
# 1. 安装 DEB 包(文件管理)
COPY thingsboard.deb /tmp/
RUN dpkg -i /tmp/thingsboard.deb
# 2. 设置启动命令(Java 启动)
CMD ["start-tb-node.sh"]
6.2 启动脚本最终执行
启动脚本 start-tb-node.sh 最终执行:
java -cp /usr/share/thingsboard/bin/thingsboard.jar \
-Dloader.main=org.thingsboard.server.ThingsboardServerApplication \
...
所以最终还是 java -jar (或 java -cp) 启动!
7. 为什么不直接用 java -jar
7.1 传统方式的问题
如果直接用 java -jar:
java -jar thingsboard.jar
问题:
- 配置文件在哪里?
- 日志文件写在哪里?
- 如何管理多个配置文件?
- 如何加载扩展?
7.2 ThingsBoard 的解决方案
使用 java -cp + PropertiesLauncher:
java -cp thingsboard.jar \
-Dloader.main=... \
-Dlogging.config=... \
org.springframework.boot.loader.launch.PropertiesLauncher
优势:
- ✅ 可以指定外部配置文件路径
- ✅ 可以加载扩展目录
- ✅ 可以灵活切换主类(安装/运行/升级)
8. 总结
8.1 关键点
-
DEB 包 ≠ 启动方式
- DEB 包是文件安装工具
- 启动方式仍然是标准的 Java 启动
-
最终启动命令
java -cp ${jarfile} ... PropertiesLauncher这就是标准的 Java 启动方式!
-
DEB 包的价值
- 标准化文件位置
- 自动权限管理
- 配置文件管理
- 系统服务集成
8.2 类比理解
可以这样理解:
DEB 包 = Windows 的安装程序(.exe)
↓
安装 → 把文件放到 C:\Program Files\ThingsBoard\
↓
启动 → 双击 thingsboard.exe(实际上还是运行 Java)
DEB 包是"安装程序",不是"启动程序"!
8.3 完整流程
源码编译
↓
打包成 JAR(Java 应用)
↓
打包成 DEB(安装包)
↓
Dockerfile 安装 DEB(文件管理)
↓
启动脚本执行 java -cp(启动应用)← 这里才是真正的启动!
所以,ThingsBoard 还是用标准的 java -jar/java -cp 方式启动的,DEB 包只是用来管理文件安装的!