251 lines
6.2 KiB
Markdown
251 lines
6.2 KiB
Markdown
|
|
# 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 完整流程
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
源码编译
|
|||
|
|
↓
|
|||
|
|
打包成 JAR(Java 应用)
|
|||
|
|
↓
|
|||
|
|
打包成 DEB(安装包)
|
|||
|
|
↓
|
|||
|
|
Dockerfile 安装 DEB(文件管理)
|
|||
|
|
↓
|
|||
|
|
启动脚本执行 java -cp(启动应用)← 这里才是真正的启动!
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**所以,ThingsBoard 还是用标准的 `java -jar`/`java -cp` 方式启动的,DEB 包只是用来管理文件安装的!**
|
|||
|
|
|