thingsboard/summary/08-Java启动方式说明.md

6.2 KiB
Raw Permalink Blame History

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 包的作用是文件管理和安装,不是启动方式:

  1. 文件安装: 将 JAR 文件、配置文件、脚本复制到标准位置

    /usr/share/thingsboard/bin/thingsboard.jar  ← JAR 文件
    /usr/share/thingsboard/conf/thingsboard.yml ← 配置文件
    /usr/bin/start-tb-node.sh                   ← 启动脚本
    
  2. 权限设置: 自动设置正确的文件权限和所有者

    chown -R thingsboard:thingsboard /usr/share/thingsboard
    chmod 555 /usr/share/thingsboard/bin/thingsboard.jar
    
  3. 依赖检查: 检查是否安装了 Java 17

  4. 系统集成: 注册 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 的原因:

  1. 支持外部配置: 可以加载外部配置文件
  2. 支持扩展: 可以加载 extensions/ 目录下的扩展
  3. 灵活启动: 可以指定不同的主类(安装、升级、运行)

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 关键点

  1. DEB 包 ≠ 启动方式

    • DEB 包是文件安装工具
    • 启动方式仍然是标准的 Java 启动
  2. 最终启动命令

    java -cp ${jarfile} ... PropertiesLauncher
    

    这就是标准的 Java 启动方式!

  3. DEB 包的价值

    • 标准化文件位置
    • 自动权限管理
    • 配置文件管理
    • 系统服务集成

8.2 类比理解

可以这样理解:

DEB 包 = Windows 的安装程序(.exe
  ↓
安装 → 把文件放到 C:\Program Files\ThingsBoard\
  ↓
启动 → 双击 thingsboard.exe实际上还是运行 Java

DEB 包是"安装程序",不是"启动程序"

8.3 完整流程

源码编译
  ↓
打包成 JARJava 应用)
  ↓
打包成 DEB安装包
  ↓
Dockerfile 安装 DEB文件管理
  ↓
启动脚本执行 java -cp启动应用← 这里才是真正的启动!

所以ThingsBoard 还是用标准的 java -jar/java -cp 方式启动的DEB 包只是用来管理文件安装的!