由于中所周知的原因,国内访问gitlab和maven中央仓库都会出现问题;thingsboard源码涉及maven,gradle和前端等编译问题,本文将从零开始全套构建本地开发环境

本次环境搭建采用 thingsboard 3.4.1 源码,此版本基本要求

jdk 11 (必须是jdk11)

postgresql 9.6+ (本次使用使用pgsql13,安装方法自行参考官方介绍搭建)

ideaCE(社区版) 2022.2,有条件可直接使用 旗舰收费版

maven 3.6.x

nodejs 16.x

工具配置

  • maven配置

无论国内任何maven镜像,都建议您直接代理 * ; 但是直接代理全部内容thingsboard编译一定会出错,常见问题 gradle 找不到异常;先看常见配置

1
2
3
4
5
6
7
<!-- 在maven中settings.xml 文件中的mirrors节点添加阿里云maven代理 -->
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>

直接编译(maven安装,请自行搜索解决)

1
mvn clean compile package -DskipTests=true

编译结果如下:

显然,阿里代理maven直接配置,是不能编译通过的。再看阿里maven代理

public代理仅仅代理maven的central和jcenter,并没有直接代理gradle的仓库,配置镜像是如果 直接 代理 * 都指向阿里public代理,自然是找不到 gradle相关依赖;我们需要手动配置maven代理,使其只代理central和jcenter,其余仓库应当自行查找对应的仓库地址;在配置maven前请在环境变量中设置 gradle user home;不然gradle都是默认指向c盘。参考 GRADLE_USER_HOME = D:/gradle

修改settings.xml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!-- 配置第一个 maven mirror,maven代理仓是从第一个开始查找 -->
<mirror>
<id>aliyunmaven</id>
<!-- 这个是关键,此项表达,代理central, 如果central找不到,依次查询后续仓地址 -->
<mirrorOf>central,!jcenter,!jitpack.io,!gradle-plugin</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/central</url>
</mirror>
<mirror>
<id>jcenter</id>
<mirrorOf>jcenter</mirrorOf>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
<mirror>
<id>jitpack.io</id>
<mirrorOf>jitpack.io</mirrorOf>
<url>https://jitpack.io</url>
</mirror>
<mirror>
<id>gradle-plugin</id>
<mirrorOf>gradle-plugin</mirrorOf>
<url>https://maven.aliyun.com/repository/gradle-plugin</url>
</mirror>

配置到这里,编译java的编译基本都能通过,但是后续会出现前端代码编译出错

前端依赖配置

我们找到指定的目录直接npm install 尝试,但是会出现 git拉取代码错误,原因就在于访问github超时,打开ui-ngx 目录,查看package.json,发现有三个依赖是采用git拉取代码的方式导入依赖包

显然不能够直接采用这种方式,我们将对应的git仓的代码直接下载,解压放到 ui-ngx/libs目录中,直接改成本地文件依赖导入

然后更改相关配置, 将原有带有git的依赖改成以下内容,注意需要将下载下来的源码目录命名到对应的目录

1
2
3
4
5
6
7
8
9
{

"dependencies": {
"flot": "./libs/flot-0.9-work",
"flot.curvedlines": "./libs/CurvedLines",
"ngx-flowchart": "./libs/ngx-flowchart-release-1.0.0",
},
}

最终编译成功

如果出现ui-ngx由于依赖下载超时导致的问题,请参考配置npm代理镜像

  • npm配置

nodejs请自行下载安装

1
npm set registry http://registry.npmmirror.com

本地调试配置

  • idea配置

编译完成后,使用idea打开一定会出现诸多错误,首先 是 *gen.xx 找不到错误

显然这不正确,都编译打包通过了,怎么会出现依赖找不到问题了。仔细观察,这些错误都是grpc编译后的文件依赖缺失,我们需要找到对应的文件,或者手动生成对应的文件;注意不要直接根据proto文件生成对应的代码文件,否则会出现重复文件导致编译不通过。

我们找到对用的grpc编译插件,所有的proto文件都生成了对应的源码文件,但是都在target/generated-source/中,我们需要手动将每一个生成的带添加到source中

所有的protobuf生成代码的目录添加到source中后,重新在idea build,所有错都消失,如果还出现红色错误,试着重启一下idea,后添加的source中的文件并没有建立索引,所以找不到相关依赖,也是正常的,重启后,重新建立index,错误自然也就消失了。

本地调试

在启动本地调试前需要,修改一下,thingsboard中相关配置并且创建数据库和相关表

找到application 模块中的thingsboard.yml 将对应的数据库连接改成你调试所用的数据库

在postgres创建数据库,注意不要直接使用工具创建,pgsql数据库中的数据集有些特殊,请采用以下语句手动创建

1
2
3
4
5
6
create database thingsboard template='template0' lc_collate='C' lc_ctype = 'C' encoding = 'UTF-8';

-- 解释以下上述SQL的含义
-- 1、如果不指定数据 lc相关参数为C,pgsql的数据集是存在问题的,本人之前的工作遇到 采用默认或者非 C 相关的数据 pgsql order by max min等行为会忽略 ; ? /等特殊字符,这些字符是不参与排序行为的。
-- 2、所有指定字符集的template中 仅仅只有 template0支持 ,如果不指定 template0 数据创建是不成功的。
-- 3、UTF-8字符集,不必多说,但是注意,pgsql中的UTF-8 是不支持带有 BOM格式的数据,插入会弹出错误

除以上注意问题,请直接找到 dao模块中的sql,执行全部的文件,创建数据

  • 启动本地调试

运行 application中的server

thingsboard默认的三个账户