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

251 lines
6.2 KiB
Markdown
Raw Normal View History

2026-01-19 11:50:37 +08:00
# 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 行:
```bash
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. **权限设置**: 自动设置正确的文件权限和所有者
```bash
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
```bash
# 手动下载 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 采用)
```bash
# 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 分析
```bash
#!/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 等效的启动命令
如果不用启动脚本,等效的命令是:
```bash
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 流程
```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` 最终执行:
```bash
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`
```bash
java -jar thingsboard.jar
```
**问题**:
- 配置文件在哪里?
- 日志文件写在哪里?
- 如何管理多个配置文件?
- 如何加载扩展?
### 7.2 ThingsBoard 的解决方案
使用 `java -cp` + `PropertiesLauncher`
```bash
java -cp thingsboard.jar \
-Dloader.main=... \
-Dlogging.config=... \
org.springframework.boot.loader.launch.PropertiesLauncher
```
**优势**:
- ✅ 可以指定外部配置文件路径
- ✅ 可以加载扩展目录
- ✅ 可以灵活切换主类(安装/运行/升级)
## 8. 总结
### 8.1 关键点
1. **DEB 包 ≠ 启动方式**
- DEB 包是**文件安装工具**
- 启动方式仍然是**标准的 Java 启动**
2. **最终启动命令**
```bash
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 包只是用来管理文件安装的!**