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

251 lines
6.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 包只是用来管理文件安装的!**