环境安装

开发环境要求: Jdk 1.8 版本 Postgresql 9 以上 Node.js Npm Maven 3.6 以上 Git 工具 Idea 开发工具 Redis

JDK

下载安装
JDK 官方下载地址: https://www.oracle.com/java/technologies/javase-jdk8-downloads.html
JDK 版本选择 JDK8,我本地环境是 Windos10 64 位,所以选择 jdk-8u221-windows-x64.exe
Thingsboard源码编译 - 图1
下载好了之后直接默认安装就行 Thingsboard源码编译 - 图2
配置环境变量
步骤 1: 在 JAVA_HOME 中增加 JDK 的安装地址:C:\Program Files\Java\jdk1.8.0_221 Thingsboard源码编译 - 图3
步骤 2: 在 CLASSPATH 中增加 JDK 的安装地址中的文件:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar Thingsboard源码编译 - 图4
步骤 3: 在 Path 中增加 JDK 的地址:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; Thingsboard源码编译 - 图5
步骤 4 输入以下命令

  1. java -version

如果能出现以下的提示信息,就算安装成功了 Thingsboard源码编译 - 图6

安装 IDEA

参考:IDEA 安装教程

安装 Maven

步骤 1:下载 maven,进入地址:http://maven.apache.org/download.cgi Thingsboard源码编译 - 图7
步骤 2:下载到本地 Thingsboard源码编译 - 图8
步骤 3:配置环境变量 增加 MAVEN_HOME,即 maven 的地址:D:\tb\apache-maven-3.6.1-bin,请注意,如果直接解压,有可能会有两个 apache-maven-3.6.1-bin Thingsboard源码编译 - 图9
Thingsboard源码编译 - 图10
MAVEN_OPTS,参数是 -Xms128m -Xmx1024m Thingsboard源码编译 - 图11
修改 Path,增加 Maven 的地址%MAVEN_HOME%\bin; Thingsboard源码编译 - 图12
测试 Maven 安装,打开命令行工具。使用命令 mvn -v,如果能出现以下提示,即安装成功 Thingsboard源码编译 - 图13

Nodejs 安装

步骤 1:下载 Nodejs 安装包,Nodejs 官网地址:https://nodejs.org/en/download/ Thingsboard源码编译 - 图14
步骤 2:安装完成后,使用命令查看 Nodejs 是否已经安装完成,能出现以下提示说明已经安装成功 Thingsboard源码编译 - 图15

安装 git

步骤 1:下载 git 安装包,git 官网地址是:https://git-scm.com/download/win Thingsboard源码编译 - 图16
步骤 2:安装完成后,使用命令行测试 git Thingsboard源码编译 - 图17

安装 npm 全局依赖

步骤 1:使用管理员 CMD 命令行,执行下面命令

  1. #npm 环境读取环境变量包
  2. npm install -g cross-env
  3. #webpack打包工具
  4. npm install -g webpack

Thingsboard源码编译 - 图18

安装 redis

Redis 安装参考:https://www.iotschool.com/wiki/redis
环境安装到此结束,接下来是通过 Git 拉取代码。

克隆 thingsboard 代码

确定代码存放位置

在本地创建代码存放位置的文件目录,然后进入当前目录点击鼠标右键,选择 Git Bash Here Thingsboard源码编译 - 图19

输入 git 命令克隆源代码

  1. git clone https://github.com/thingsboard/thingsboard.git

Thingsboard源码编译 - 图20
耐心等待一段时间后,看到以下界面就算下载成功 Thingsboard源码编译 - 图21

切换 git 分支

默认下载的代码是 master 主分支的,我们开发需要切换到最新版本的分支。
查看项目源码的所有分支,下载源码后,需要进入到 thingsboard 文件夹 Thingsboard源码编译 - 图22
发现最新发布的版本是 2.4,所以我这里选择 2.4,当然你可以根据自己的情况进行分支选择
输入命令以下,即可切换至 2.4 的分支

  1. git checkout release-2.4

看到下图这样,即切换成成功 Thingsboard源码编译 - 图23

准备工作

外网连接

因为 TB 在编译过程中需要依赖很多国外的包,那么需要外网才能连接,有连接外网支持,可以到社区求助:https://www.iotschool.com/topics/node8

设置 Maven 为淘宝镜像

工程是基于 Maven 管理,直接通过 idea open,之后会自动下载各种依赖包。依赖包的默认存储地址为:C:\Users\用户名.m2\repository,内容如下:

  1. $tree ~/.m2 -L 2
  2. /home/jay/.m2
  3. └── repository
  4. ├── antlr
  5. ├── aopalliance
  6. ├── asm
  7. ├── backport-util-concurrent
  8. ├── ch
  9. ...

一般情况下,使用官方镜像更新依赖包,网速不稳定,可将 Maven 镜像源设置为淘宝的,在 maven 安装包目录下找到 settings.xml 设置
大概位置截图:
Thingsboard源码编译 - 图24
把 settings.xml 里面内容设置成以下:

  1. <mirrors>
  2. <mirror>
  3. <!--This sends everything else to /public -->
  4. <id>aliyun_nexus</id>
  5. <mirrorOf>*,!maven_nexus_201</mirrorOf>
  6. <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
  7. </mirror>
  8. </mirrors>

不会设置的,可以参考这个文件:https://cdn.iotschool.com/iotschool/settings.xml
thingsboard QQ 群也有这个资源:121202538

设置 npm 为淘宝镜像

同上,网速不好 npm 过程中也会下载失败,这是导致很多同学 thingsboard 编译失败的主要原因,所以我们在进行编译之前,也将 npm 替换为淘宝镜像:

  1. npm install -g mirror-config-china --registry=http://registry.npm.taobao.org #使用淘宝镜像
  2. npm config get registry #查询当前镜像
  3. npm config rm registry #删除自定义镜像,使用官方镜像
  4. npm info express

设置 IDEA 管理员启动

我本地开发环境编译项目使用 IDEA 工具进行编译,所以需要设置管理员启动,这样才有所有的权限执行编译命令。 步骤 1:点击 IDEA 图标右键,选择属性。 Thingsboard源码编译 - 图25
步骤 2:点击兼容性 - 更改所有用户设置 - 以管理员身份运行此程序 Thingsboard源码编译 - 图26 Thingsboard源码编译 - 图27

开始编译

编译项目跟网速有关,最好连接上外网进行编译,一般 5~30 分钟都有可能,超过 30 分钟要检查你的网络。

清理项目编译文件

使用 IDEA Maven 工具进行清理 Thingsboard源码编译 - 图28

输入编译命令开始编译

在 IDEA 控制台(左下方)Terminal 输入以下命令进行编译:

  1. mvn clean install -DskipTests

Thingsboard源码编译 - 图29
等一段时间后,看到下面这张图就算编译成功,如果没有编译成功请按照本教程最后的常见问题进行排查,一般都是网络问题。如果还有问题,请到社区thingsboard 专题中提问。
Thingsboard源码编译 - 图30

常见问题

pom包pkg.name等标签未定义

  1. <properties>
  2. <pkg.name>thingsboard</pkg.name>
  3. <main.dir>${basedir}</main.dir>
  4. <pkg.type>java</pkg.type>
  5. <pkg.mainClass>org.thingsboard.server.ThingsboardServerApplication</pkg.mainClass>
  6. <pkg.copyInstallScripts>true</pkg.copyInstallScripts>
  7. <main.dir>${basedir}</main.dir>
  8. <pkg.disabled>true</pkg.disabled>
  9. <pkg.process-resources.phase>none</pkg.process-resources.phase>
  10. <pkg.package.phase>none</pkg.package.phase>
  11. <pkg.user>thingsboard</pkg.user>
  12. <pkg.implementationTitle>${project.name}</pkg.implementationTitle>
  13. <pkg.unixLogFolder>/var/log/${pkg.name}</pkg.unixLogFolder>
  14. <pkg.installFolder>/usr/share/${pkg.name}</pkg.installFolder>
  15. </properties>

缓存导致编译失败

每次编译失败进行二次编译时,要清理缓存,并杀死遗留进程 步骤 1:执行下面命令,杀死遗留进程

  1. taskkill /f /im java.exe

步骤 2:使用 IDEA Maven 工具进行清理 Thingsboard源码编译 - 图31
温馨提示:要进行二次编译前,最好重启一次电脑!

Server UI 编译失败

  1. [ERROR] Failed to execute goal com.github.eirslett:frontend-maven-plugin:1.0:npm (npm install) on project ui: Failed to run task: 'npm install' failed. (error code 1) -> [Help 1]

Thingsboard源码编译 - 图32
如果遇到这个问题,可从以下几个原因进行分析:

原因 1:node、npm 版本号问题

本地环境安装的 node、npm 版本号与源码中 pom.xml 文件配置的版本号不一致。
解决方案: 步骤 1:使用 node -v、npm -v 查看安装的 node 和 npm 版本号 Thingsboard源码编译 - 图33
步骤 2:修改源码中 pom.xml 文件中的版本号

  1. <configuration>
  2. <nodeVersion>v12.13.1</nodeVersion>
  3. <npmVersion>6.12.1</npmVersion>
  4. </configuration>

需要修改的文件有三处,位置如下: Thingsboard源码编译 - 图34

原因 2:node-sass 下载失败

编译 Server UI 时,会下载 node-sass 依赖,如果因为网络原因没有下载成功,也会编译失败。如果你是按照本本教材一步一步来的,应该不会有问题,上面准备工作中,将 npm 镜像源切换为淘宝,那么下载会很快的。

  1. [INFO] Downloading binary from https://github.com/sass/node-sass/releases/download/v4.12.0/win32-x64-72_binding.node
  2. [ERROR] Cannot download "https://github.com/sass/node-sass/releases/download/v4.12.0/win32-x64-72_binding.node":
  3. [ERROR]
  4. [ERROR] ESOCKETTIMEDOUT
  5. [ERROR]
  6. [ERROR] Hint: If github.com is not accessible in your location
  7. [ERROR] try setting a proxy via HTTP_PROXY, e.g.
  8. [ERROR]
  9. [ERROR] export HTTP_PROXY=http://example.com:1234
  10. [ERROR]
  11. [ERROR] or configure npm proxy via
  12. [ERROR]
  13. [ERROR] npm config set proxy http://example.com:8080
  14. [INFO]
  15. [INFO] > node-sass@4.12.0 postinstall F:\workspace\thingsboard\thingsboard\ui\node_modules\node-sass
  16. [INFO] > node scripts/build.js
  17. [INFO]

Thingsboard源码编译 - 图35
解决方案:切换镜像源为淘宝
解决方案:重启电脑,清理缓存

原因 3:Thingsboard 3.0 版本编译遇到的问题

亲测:2.4 版本也可以通过这种方式来解决

  1. Failed to execute goal com.github.eirslett:frontend-maven-plugin:1.7.5:npm (npm install) on project ui-ngx: Failed to run task: 'npm install' failed. org.apache.commons.exec.ExecuteException: Process exited with an error: -4048 (Exit value: -4048) -> [Help 1]

解决方案:https://www.iotschool.com/topics/84

原因 4:二次编译导致残留进程

报错:

  1. [ERROR] Failed to execute goal org.apache.maven.plugins:maven-clean-plugin:2.5:clean (default-clean) on project ui: Failed to clean project: Failed to delete F:\workspace\thingsboard\thingsboard\ui\target\node\node.exe -> [Help 1]

Thingsboard源码编译 - 图36

Server Tool 编译失败

Thingsboard源码编译 - 图37

  1. [ERROR] Failed to execute goal on project tools: Could not resolve dependencies for project org.thingsboard:tools:jar:2.4.3: Failed to collect dependencies at org.eclipse.paho:org.eclipse.paho.client.mqttv3:jar:1.1.0: Failed to read artifact descriptor for org.eclipse.paho:org.eclipse.paho.clien
  2. t.mqttv3:jar:1.1.0: Could not transfer artifact org.eclipse.paho:org.eclipse.paho.client.mqttv3:pom:1.1.0 from/to aliyun_nexus (http://maven.aliyun.com/nexus/content/groups/public/): Failed to transfer file http://maven.aliyun.com/nexus/content/groups/public/org/eclipse/paho/org.eclipse.paho.cli
  3. ent.mqttv3/1.1.0/org.eclipse.paho.client.mqttv3-1.1.0.pom with status code 502 -> [Help 1]

一般由于网络原因,IoTSchool 小编至少编译了 3 次才成功,每次编译都重启电脑,并清理环境。
解决方案:如果使用的是 mvn clean install -DskipTests 命令进行编译,那么就多尝试几次,每次编译前,要清理环境。
参考:https://github.com/thingsboard/performance-tests/issues/10

JavaScript Executor 编译失败

JavaScript Executor Microservice 编译失败 Thingsboard源码编译 - 图38

  1. [ERROR] Failed to execute goal com.github.eirslett:frontend-maven-plugin:1.0:npm (npm install) on project js-executor: Failed to run task: 'npm install' failed. (error code 2) -> [Help 1]
  2. [ERROR]
  3. [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
  4. [ERROR] Re-run Maven using the -X switch to enable full debug logging.
  5. [ERROR]
  6. [ERROR] For more information about the errors and possible solutions, please read the following articles:
  7. [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
  8. [ERROR]
  9. [ERROR] After correcting the problems, you can resume the build with the command
  10. [ERROR] mvn <goals> -rf :js-executor

原因:本地缓存缺少 fetched-v10.15.3-linux-x64 和 fetched-v10.15.3-win-x64 这两个文件。
解决方案: 步骤 1:下载这两个文件到本地,下载后记得重命名,下载地址:https://github.com/zeit/pkg-fetch/releases Thingsboard源码编译 - 图39
步骤 2: 将下载的两个文件放到:放到:C:\Users\你的用户名 \ .pkg-cache\v2.6。并将名字分别修改为:fetched-v10.15.3-linux-x64 和 fetched-v10.15.3-win-x64
参考:https://github.com/thingsboard/thingsboard/issues/2084

License 检查不通过

  1. [ERROR] Failed to execute goal com.mycila:license-maven-plugin:3.0:check (default) on project thingsboard: Some files do not have the expected license header -> [Help 1]

解决方案:在根目录 pom.xml 中屏蔽 license-maven-plugin
Thingsboard源码编译 - 图40
搜索 license-maven-plugin,将整个 plugin 都注释掉 Thingsboard源码编译 - 图41

Web UI 编译失败

Web UI 编译失败请参考Server UI 编译失败第一个原因

maven:Could not resolve dependencies for project org.thingsboard:application:

错误信息

  1. [ERROR] Failed to execute goal on project application: Could not resolve dependencies for project org.thingsboard:application:jar:2.4.1: The following artifacts could not be resolved: org.thingsboard.rule-engine:rule-engine-components:jar:2.4.1, org.thingsboard:dao:jar:2.4.1: Could not find artifact org.thingsboard.rule-engine:rule-engine-components:jar:2.4.1 in jenkins (http://repo.jenkins-ci.org/releases) -> [Help 1]

解决方案:根目录下去 maven 编译,不要在每个单独编译,否则不能自动解决依赖,如果你已经在子模块进行了编译,请回到根目录先 clean 一下,再重新编译。

maven:Failed to delete tb-http-transport.rpm

错误信息:

  1. [ERROR] Failed to execute goal org.apache.maven.plugins:maven-clean-plugin:2.5:clean (default-clean) on project http: Failed to clean project: Failed to delete D:\my_project\thingsboard\transport\http\target\tb-http-transport.rpm -> [Help 1]

解决方案:第一次编译失败,再次编译可能会提示该错误,可以手动到报错路径删除,如果提示文件正在使用,需要在任务管理器杀死 java 进程后再手动删除。

npm:npm:cb() never called!

错误信息:

  1. npm ERR! cb() never called!
  2. npm ERR! This is an error with npm itself. Please report this error at:
  3. npm ERR! <https://npm.community>
  4. npm ERR! A complete log of this run can be found in:
  5. npm ERR! C:\Users\yuren\AppData\Roaming\npm-cache\_logs\2019-11-06T10_55_28_258Z-debug.log

解决方案: 尝试 npm cache clean —force 后再次 npm install 无果; 尝试更换淘宝镜像源后再次 npm install 无果; 怀疑有些包下载需要翻墙,全局代理翻墙后问题依然存在; 参考网上关闭所有代理后问题依然存在; 通过 log 日志分析最后一个解包报错的地方,屏蔽需要的 material-design-icons,新 modules rxjs 仍然报错;

  1. extract material-design-icons@3.0.1 extracted to node_modules\.staging\material-design-icons-61b4d55e (72881ms)
  2. extract rxjs@6.5.2 extracted to node_modules\.staging\rxjs-e901ba4c (24280ms)

参考 npm ERR cb() never called 执行

  1. npm install --no-package-lock

之后提示 npm ERR! path git,添加 git 到环境变量后正常。

npm:npm ERR! path git

错误信息

  1. npm ERR! path git
  2. npm ERR! code ENOENT
  3. npm ERR! errno ENOENT
  4. npm ERR! syscall spawn git
  5. npm ERR! enoent Error while executing:
  6. npm ERR! enoent undefined ls-remote -h -t git://github.com/fabiobiondi/angular-

解决方案:添加 git 到环境变量。

No compiler is provided in this environment

错误信息:

  1. [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.
  2. 1:compile (default-compile) on project netty-mqtt: Compilation failure
  3. [ERROR] No compiler is provided in this environment. Perhaps you are running on
  4. a JRE rather than a JDK?

需要在环境变量中设置 java,包含%JAVA_HOME%bin;%JAVA_HOME%lib;

Failed to execute goal org.thingsboard:gradle-maven-plugin:1.0.10:invoke (default) on project http: org.gradle.tooling.BuildException: Could not execute build using Gradle distribution ‘https://services.gradle.org/distributions/gradle-6.3-bin.zip’.

Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project rest-client: Compilation failure

An unknown compilation problem occurred
这个问题主要是jdk版本跟项目不一致导致的,如果项目的版本是大于(不含!)3.2.1,则需要JDK11,反之JDK8

此应用无法在你的电脑上运行

Thingsboard源码编译 - 图42

  • 版本:thingsboard3.1.1
  • 系统版本:win10 专业版
  • java:1.8.271
  • node: 12.16.0
  • yarn:1.22.10(通过 npm 安装)

解决方案: 从https://github.com/yarnpkg/yarn/releases/tag/v1.22.10yarn-v1.22.10.tar.gz,下载
然后放在自己的 maven 仓库中\com\github\eirslett\yarn\1.22.10 下,重新编译即可,其他问题暂未发现Thingsboard源码编译 - 图43