总结
- 工具准备
- 电脑安装好相应软件:JAVA_v17, Maven_v3.9.7, Git, Nodejs_v20.11.1, Yarn_v1.22.17
- 配置好 Maven , Yarn, Gradle 镜像地址
- 受网络原因影响的软件提前下载好,配置好,一般是从 github 下载包文件超时会导致编译失败。
- 源码
- Fork repository
- 克隆下来.
- 执行 Maven 编译。
- 数据库
- 启动 PostgreSQL Docker 服务,配置数据库(默认为 database name: thingsboard, user: "postgres", password: "postgres"), 如果是别的用户名密码,需改
thingsboard.yml配置文件,再执行 Maven 编译 Application 模块。 - 执行数据库初始化脚本,生成数据表和部分 demo 数据。
- 启动 PostgreSQL Docker 服务,配置数据库(默认为 database name: thingsboard, user: "postgres", password: "postgres"), 如果是别的用户名密码,需改
- 运行应用
- 可选:如需调试或修改前端界面,可以以热部署模式启动前端应用。
- 启动服务端(Server side)应用。
工具准备
java -v
mvn -v
git --version
node -v
yarn -v
电脑安装好需要的软件
官方文档中 JAVA, Maven, Git 是必须,Node 和 Yarn 不是必须,编译过程中会下载相应的版本并运行(Nodejs_v20.11.1, Yarn_v1.22.17)。
看有的教程说如果本机安装有相应的版本可以免于下载省点时间(没测试过)。
JAVA
重要提醒:3.7.0 用 JAVA17
以下是官方文档中的说明,对3.7.0以上已经不适用了。
ThingsBoard is build using Java 11.
ThingsBoard build requires Maven 3.1.0+.
Maven
直接用最新的 3.9.7 版即可。
其他
官方文档还提到 Windows 需安装如下两个包:
npm install -g cross-env
npm install -g webpack
配置好 Maven, Gradle, Yarn 镜像地址
Maven 镜像
修改{maven安装目录下}/confsettings.xml:
<localRepository>D:/programs/.m2/repository</localRepository>
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<name>Nexus aliyun</name>
<mirrorOf>central</mirrorOf>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
Gradle 镜像
新建文件
C:\Users\{user}\.gradle\wrapper\gradle-wrapper.properties
内容为
distributionUrl=https://mirrors.cloud.tencent.com/gradle/gradle-7.3.3-bin.zip
Yarn 镜像
yarn config set registry https://registry.npmmirror.com/
提前下载的软件包
Gradle
Gradle 7.3.3
位于文件夹6a41zxkdtcxs8rphpq6y0069z
.pkg-cache/
下载链接: fetched-v16.15.0-linux-x64 fetched-v16.15.0-win-x64
重命名并放到对应目录 C:\Users\{user}\.pkg-cache\v3.4
Fork and clone ThingsBoard repository
官方 repository 执行 fork
克隆 fork 后的分支
# master分支
git clone --depth=1 --single-branch git@github.com:{your_user}/thingsboard.git
# 选择某个分支
git clone -b {{ site.release.branch }} git@github.com:{your_user}/thingsboard.git --depth=1
注意: 以下将用 ${TB_WORK_DIR} 来指代克隆好的 repository .
执行 Maven 编译
注意: 执行编译前先看后面遇到的问题一节针对defaultTbMailConfigTemplateService的处理,先修改相关代码再编译,节省一次编译时间。
cd ${TB_WORK_DIR}
mvn clean install -DskipTests
注释:构建打包可开启跳过测试的选项,加快编译速度。
编译成功后控制台会看到这样的提示:
数据库
ThingsBoard 默认采用 PostgreSQL 来存储实体和时序类数据。
启动 PostgreSQL Docker 服务
version: '3.1'
services:
db:
image: postgres
volumes:
- ./postgres:/var/lib/postgresql/data
restart: always
ports:
- 5432:5432
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
adminer:
image: adminer
restart: always
ports:
- 8059:8080
PostgreSQL启动完成后创建数据库名为 "thingsboard"。
执行数据库初始化脚本
On Windows:
cd %TB_WORK_DIR%\application\target\windows
install_dev_db.bat
运行应用
以热部署模式启动前端应用
注意: 如果你不需要调试或修改前端界面,可以不用执行该步骤。
cd ${TB_WORK_DIR}/ui-ngx
mvn clean install -P yarn-start
该步骤执行成功以后你可以通过 4200 端口访问界面。
启动服务端(Server side)应用
可以有两种方案:
- IDE 中,运行位于 application 模块下的 org.thingsboard.server.ThingsboardServerApplication class。
- 直接用命令行启动 Spring boot 应用:
cd ${TB_WORK_DIR}
java -jar application/target/thingsboard-${VERSION}-boot.jar
运行成功后
可以浏览器打开 http://localhost:8080/ 或 http://localhost:4200/
- login tenant@thingsboard.org
- password tenant
还可以访问 Swagger-UI
遇到的问题
- 根据源码版本来决定JAVA版本,从3.7.0开始需要JAVA17,3.6.x 对应的JAVA11,官方文档还是写的 JAVA11 没更新。
- Gradle 包下载不成功导致 Maven 编译失败。
C:\Users\{user}\.pkg-cache下的两个文件下载巨慢影响编译速度,可以自行下载好再执行 maven 编译。- 执行
license-maven-plugin较慢,可以注释掉相关部分。 - 启动服务端(Server side)应用不成功遇到
defaultTbMailConfigTemplateService报错,解决方案参考
- [Bug] templates/mail_config_templates.json file not found when starting with java -jar thingsboard-3.6.1-boot.jar. · Issue #9693 · thingsboard/thingsboard 最后 Just-Tamizha 的方案
- Error creating bean with name 'defaultTbMailConfigTemplateService' · Issue #9324 · thingsboard/thingsboard
STEP: 1
File Location: Installation_Location\thingsboard\application\src\main\java\org\thingsboard\server\service\mail\DefaultTbMailConfigTemplateService.java
CHANGED CODE
/**
* Copyright © 2016-2023 The Thingsboard Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.server.service.mail;
import com.fasterxml.jackson.databind.JsonNode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Service;
import org.thingsboard.common.util.JacksonUtil;
// import javax.annotation.PostConstruct;
// import java.io.IOException;
import org.apache.commons.io.IOUtils;
import javax.annotation.PostConstruct;
import java.io.IOException;
import java.io.InputStream;
@Service
@Slf4j
public class DefaultTbMailConfigTemplateService implements TbMailConfigTemplateService {
private JsonNode mailConfigTemplates;
@PostConstruct
private void postConstruct() throws IOException {
//mailConfigTemplates = JacksonUtil.toJsonNode(new ClassPathResource("/templates/mail_config_templates.json").getFile());
try (InputStream inputStream = new ClassPathResource("/templates/mail_config_templates.json").getInputStream()) {
String jsonContent = IOUtils.toString(inputStream, "UTF-8");
mailConfigTemplates = JacksonUtil.toJsonNode(jsonContent);
} catch (IOException e) {
log.error("Error loading mail config templates.", e);
throw e;
}
}
@Override
public JsonNode findAllMailConfigTemplates() {
return mailConfigTemplates;
}
}
STEP: 2
File Location: Installation_Location\thingsboard\application\src\main\conf\thingsboard.conf
CHANGED CONFIG
#
# Copyright © 2016-2023 The Thingsboard Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
export JAVA_OPTS="$JAVA_OPTS -Dplatform=@pkg.platform@ -Dinstall.data_dir=@pkg.installFolder@/data"
export JAVA_OPTS="$JAVA_OPTS -Xlog:gc*,heap*,age*,safepoint=debug:file=@pkg.logFolder@/gc.log:time,uptime,level,tags:filecount=10,filesize=10M"
export JAVA_OPTS="$JAVA_OPTS -XX:+IgnoreUnrecognizedVMOptions -XX:+HeapDumpOnOutOfMemoryError"
export JAVA_OPTS="$JAVA_OPTS -XX:-UseBiasedLocking -XX:+UseTLAB -XX:+ResizeTLAB -XX:+PerfDisableSharedMem -XX:+UseCondCardMark"
export JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC -XX:MaxGCPauseMillis=500 -XX:+UseStringDeduplication -XX:+ParallelRefProcEnabled -XX:MaxTenuringThreshold=10"
export LOG_FILENAME=${pkg.name}.out
# export LOADER_PATH=${pkg.installFolder}/conf,${pkg.installFolder}/extensions
export LOADER_PATH=/usr/share/thingsboard/conf,/usr/share/thingsboard/extensions
export SQL_DATA_FOLDER=${pkg.installFolder}/data/sql
其他有用的包
# 模拟测试 MQTT 协议的小工具
git clone --depth=1 --single-branch git@github.com:thingsboard/thingsboard-python-client-sdk.git
# 文档
git clone --depth=1 --single-branch git@github.com:thingsboard/thingsboard.github.io.git
git clone --depth=1 --single-branch git@github.com:devaskim/awesome-thingsboard.git
git clone --depth=1 --single-branch git@github.com:rossmann-engineering/Collibellex-Thingsboard-Widgets.git