(超全)Windows 10 编译最新 ThingsBoard 3.7.0 源码成功

1,158 阅读3分钟

总结

  1. 工具准备
    1. 电脑安装好相应软件:JAVA_v17, Maven_v3.9.7, Git, Nodejs_v20.11.1, Yarn_v1.22.17
    2. 配置好 Maven , Yarn, Gradle 镜像地址
    3. 受网络原因影响的软件提前下载好,配置好,一般是从 github 下载包文件超时会导致编译失败。
  2. 源码
    1. Fork repository
    2. 克隆下来.
  3. 执行 Maven 编译。
  4. 数据库
    1. 启动 PostgreSQL Docker 服务,配置数据库(默认为 database name: thingsboard, user: "postgres", password: "postgres"), 如果是别的用户名密码,需改 thingsboard.yml 配置文件,再执行 Maven 编译 Application 模块。
    2. 执行数据库初始化脚本,生成数据表和部分 demo 数据。
  5. 运行应用
    1. 可选:如需调试或修改前端界面,可以以热部署模式启动前端应用。
    2. 启动服务端(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

屏幕截图 2024-06-12 153616.png

.pkg-cache/

下载链接: fetched-v16.15.0-linux-x64 fetched-v16.15.0-win-x64

重命名并放到对应目录 C:\Users\{user}\.pkg-cache\v3.4

屏幕截图 2024-06-12 153505.png

Fork and clone ThingsBoard repository

官方 repository 执行 fork

ThingsBoard repository.

克隆 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

注释:构建打包可开启跳过测试的选项,加快编译速度。

编译成功后控制台会看到这样的提示:

屏幕截图 2024-06-11 123536.png

数据库

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)应用

可以有两种方案:

  1. IDE 中,运行位于 application 模块下的 org.thingsboard.server.ThingsboardServerApplication class。
  2. 直接用命令行启动 Spring boot 应用:
cd ${TB_WORK_DIR}
java -jar application/target/thingsboard-${VERSION}-boot.jar

运行成功后

可以浏览器打开 http://localhost:8080/http://localhost:4200/

屏幕截图 2024-06-12 101041.png

还可以访问 Swagger-UI

屏幕截图 2024-06-12 100720.png

屏幕截图 2024-06-12 100805.png

遇到的问题

  1. 根据源码版本来决定JAVA版本,从3.7.0开始需要JAVA17,3.6.x 对应的JAVA11,官方文档还是写的 JAVA11 没更新。
  2. Gradle 包下载不成功导致 Maven 编译失败。 屏幕截图 2024-06-11 095557.png
  3. C:\Users\{user}\.pkg-cache 下的两个文件下载巨慢影响编译速度,可以自行下载好再执行 maven 编译。
  4. 执行 license-maven-plugin 较慢,可以注释掉相关部分。
  5. 启动服务端(Server side)应用不成功遇到defaultTbMailConfigTemplateService报错,解决方案参考

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