在上一章节Thingsboard开源平台(一)2.软件安装中,我们主要介绍了Thingsboard v3.0.1版本在Windows系统中的安装,本章也是基于最新的v3.0.1版本的源码进行编译和开发环境搭建。好了,下面就开始吧。
下载JDK1.8
https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
安装并配置环境变量
双击下载好的JDK安装文件,选择文件路径为“D:\Program Files (x86)\Java”,安装过程较为简单,直接下一步即可。
安装完成后开始配置环境变量:
新增“JAVA_HOME”变量,变量值为JDK安装路径“D:\Program Files (x86)\Java\jdk1.8.0_144”;
新增“CLASSPATH”变量,变量值类文件路径“.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar”;
修改“Path”变量,新增JDK的地址:“%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin”;
配置完成后,打开cmd命令提示符,输入 java -version
出现如下提示信息,则安装完成。
C:\Windows\system32>java -version
java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) Client VM (build 25.144-b01, mixed mode)
下载maven3.6
http://maven.apache.org/download.cgi
解压并配置环境变量
解压路径为“D:\apache-maven-3.6.3”,新增环境变量“MAVEN_HOME”,变量值为解压路径;
修改Path,增加maven的地址“%MAVEN_HOME%\bin”;
测试maven安装,打开命令行工具,输入 mvn -v
出现如下提示,则安装成功;
C:\Windows\system32>mvn -v
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: D:\apache-maven-3.6.3\bin\..
Java version: 1.8.0_144, vendor: Oracle Corporation, runtime: D:\Program Files (x86)\Java\jdk1.8.0_144\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "x86", family: "windows"
由于官方的库在国外,使用maven经常连不上或者下载速度很慢,我们这里修改使用阿里云的镜像;
<mirror>
<id>alimavenid>
<mirrorOf>centralmirrorOf>
<name>aliyun mavenname>
<url>http://maven.aliyun.com/nexus/content/repositories/central/url>
mirror>
修改{maven.home}/conf文件夹下的settings.xml文件,在标签下加入上述内容;
<mirrors>
<mirror>
<id>nexus-aliyunid>
<mirrorOf>*mirrorOf>
<name>Nexus aliyunname>
<url>http://maven.aliyun.com/nexus/content/groups/publicurl>
mirror>
mirrors>
下载Nodejs安装包,版本为v12.16.1 64位
https://nodejs.org/download/release/v12.16.1/
注:这里一定要是v12.16.1版本,npm版本为6.13.4,为了和Thingsboard UI源码保持一致。
测试node安装,打开命令行工具,输入 node -v
出现如下提示,则安装成功;
C:\Windows\system32>node -v
v12.16.1
C:\Windows\system32>npm -v
6.13.4
修改NPM镜像源
在国内直接使用npm的官方镜像是非常慢的,这里推荐使用淘宝NPM镜像,打开命令行执行如下命令:
npm config set registry https://registry.npm.taobao.org
完成后验证命令:
npm config get registry
-> https://registry.npm.taobao.org
如果返回https://registry.npm.taobao.org,说明镜像配置成功。
下载git安装包,git的官网地址如下:
https://git-scm.com/download/win
安装完成后,使用命令行测试git;
C:\Windows\system32>git
usage: git [--version] [--help] [-C <path>] [-c <name>=<value>]
[--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
[-p | --paginate | -P | --no-pager] [--no-replace-objects] [--bare]
[--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
<command> [<args>]
打开GitHub中Thingsboard代码仓库,选择v3.0.1版本,下载源码;
https://github.com/thingsboard/thingsboard/tree/v3.0.1
使用命令行执行以下命令:
# npm环境读取环境变量包
npm install -g cross-env
# webpack打包工具
npm install -g webpack
C:\Windows\system32>npm install -g cross-env
D:\Program Files\nodejs\node_global\cross-env-shell -> D:\Program Files\nodejs\node_global\node_modules\cross-env\src\bin\cross-env-shell.js
D:\Program Files\nodejs\node_global\cross-env -> D:\Program Files\nodejs\node_global\node_modules\cross-env\src\bin\cross-env.js
+ [email protected]
added 7 packages from 5 contributors in 1.39s
C:\Windows\system32>npm install -g webpack
npm WARN deprecated [email protected]: Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.
D:\Program Files\nodejs\node_global\webpack -> D:\Program Files\nodejs\node_global\node_modules\webpack\bin\webpack.js
npm WARN notsup Unsupported engine for [email protected]: wanted: {"node":"<8.10.0"} (current: {"node":"12.16.1","npm":"6.13.4"})
npm WARN notsup Not compatible with your version of node/npm: [email protected]
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: [email protected] (node_modules\webpack\node_modules\watchpack-chokidar2\node_modules\fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for [email protected]: wanted {"os":"darwin","arch":"any"} (current: {"os":"win32","arch":"x64"})
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: [email protected] (node_modules\webpack\node_modules\fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for [email protected]: wanted {"os":"darwin","arch":"any"} (current: {"os":"win32","arch":"x64"})
+ [email protected]
added 343 packages from 200 contributors in 19.003s
由于官方的库在国外,使用maven经常连不上或者下载速度很慢,我们这里修改使用阿里云的镜像;
<mirror>
<id>nexus-aliyunid>
<mirrorOf>*mirrorOf>
<name>Nexus aliyunname>
<url>http://maven.aliyun.com/nexus/content/groups/publicurl>
mirror>
修改{maven.home}/conf文件夹下的settings.xml文件,在标签下加入上述内容;
<mirrors>
<mirror>
<id>nexus-aliyunid>
<mirrorOf>*mirrorOf>
<name>Nexus aliyunname>
<url>http://maven.aliyun.com/nexus/content/groups/publicurl>
mirror>
mirrors>
在国内直接使用npm的官方镜像是非常慢的,这里推荐使用淘宝NPM镜像,打开命令行执行如下命令:
npm config set registry https://registry.npm.taobao.org
完成后验证命令:
npm config get registry
-> https://registry.npm.taobao.org
如果返回https://registry.npm.taobao.org,说明镜像配置成功。
打开代码“ui-ngx\pom.xml”文件,修改node、npm版本和安装的版本一致:
同样,修改msa模块下 js-executor、web-ui子模块中的pom.xml 文件,完成后保存。
在编译过程中,经常有jar下载不下来导致编译失败,通常情况下重复多试几次就可以了,但在编译JavaScript Executor模块时,fetched包缓存死活下载不了,所以在执行编译之前提前把它下载好。
下载这两个文件到本地,地址如下:
https://github.com/zeit/pkg-fetch/releases
将这两个文件放到:C:\Users\${username}.pkg-cache\v2.6,并修改名称为fetched-v10.17.0-linux-x64和fetched-v10.17.0-win-x64;
以管理员身份打开命令行工具,执行“mvn clean install -DskipTests”命令,等待执行完成;
mvn clean install -DskipTests
整个过程大约需要10~30分钟,耐心等待编译完成,最终结果如下:
在源码编译过程中,由于硬件、网络等环境的原因(主要是网络下载国外依赖包),很可能会编译失败,我把经常出现的问题及解决方法做了一些总结,具体如下。
注:失败不要灰心,尝试切换镜像源,清理缓存重启电脑,多试几次。
由于网络原因,gradle-maven-plugin 插件下载不成功导致编译失败。添加阿里云仓库到maven镜像,清理缓存,重新编译。
如果还是不成功,再把阿里云仓库注释掉,再次尝试,编译前最好重启电脑并清理环境。
如果遇到这个问题,可以从以下几个原因分析:
4.2.1 本地安装的node、npm版本和源码中pom.xml文件配置的版本号不一致
解决方案:修改源码中pom.xml文件中nodeVersion、npmVersion版本号
需要修改的文件有三处,位置如下:
4.2.2 是否设置了淘宝镜像源,如果是可以尝试切换回官方镜像源
解决方案:删除本地设置的淘宝镜像源
清除npm缓存:第一步执行npm cache clean --force;第二步:删除node_module包;
4.2.3 如果碰到内存溢出的情况比较麻烦,尝试修改Maven和Nodejs的内存大小
我在第二次编译的过程中就曝出了这个问题,折腾了很久
FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
解决方案:
尝试修改Maven的内存大小,在环境变量中新建 MAVEN_OPTS:
尝试修改Nodejs运行时最大内存,打开命令行工具执行以下命令:
C:\WINDOWS\system32>setx NODE_OPTIONS --max_old_space_size=10240
成功: 指定的值已得到保存。
JavaScript Executor模块时,fetched包缓存死活下载不了,所以在执行编译之前提前把它下载好。
下载这两个文件到本地,地址如下:
https://github.com/zeit/pkg-fetch/releases
将这两个文件放到:C:\Users\${username}.pkg-cache\v2.6,并修改名称为fetched-v10.17.0-linux-x64和fetched-v10.17.0-win-x64;
Web UI 编译和Server UI 类似,参考上述 4.2 Server UI 编译失败。
编译成功后,让我们尝试运行Thingsboard源码。由于在 Thingsboard开源平台(一)2.软件安装 章节中,已经启动过Thingsboard服务并执行了 –loadDemo 初始化,导入过了示例数据,因此在本章中仍使用之前配置好的thingsboard数据库。
启动IDEA,打开Thingsboard源码,在 File->Settings->Plugins 中安装Lombok插件;
打开 application 子模块下的 thingsboard.yml 文件,找到 redis 配置项修改为Redis安装的IP地址和端口号;
redis:
# standalone or cluster
connection:
type: "${REDIS_CONNECTION_TYPE:standalone}"
standalone:
host: "${REDIS_HOST:192.168.239.128}"
port: "${REDIS_PORT:6379}"
useDefaultClientConfig: "${REDIS_USE_DEFAULT_CLIENT_CONFIG:true}"
# this value may be used only if you used not default ClientConfig
clientName: "${REDIS_CLIENT_NAME:standalone}"
# this value may be used only if you used not default ClientConfig
connectTimeout: "${REDIS_CLIENT_CONNECT_TIMEOUT:30000}"
# this value may be used only if you used not default ClientConfig
readTimeout: "${REDIS_CLIENT_READ_TIMEOUT:60000}"
# this value may be used only if you used not default ClientConfig
usePoolConfig: "${REDIS_CLIENT_USE_POOL_CONFIG:false}"
在 thingsboard.yml 文件中,找到 SQL DAO Configuration 配置项,修改 datasource 中PostgreSQL的相关属性值;
# SQL DAO Configuration
spring:
data:
jpa:
repositories:
enabled: "true"
jpa:
open-in-view: "false"
hibernate:
ddl-auto: "none"
database-platform: "${SPRING_JPA_DATABASE_PLATFORM:org.hibernate.dialect.PostgreSQLDialect}"
datasource:
driverClassName: "${SPRING_DRIVER_CLASS_NAME:org.postgresql.Driver}"
url: "${SPRING_DATASOURCE_URL:jdbc:postgresql://192.168.239.128:5432/thingsboard}"
username: "${SPRING_DATASOURCE_USERNAME:postgres}"
password: "${SPRING_DATASOURCE_PASSWORD:root}"
hikari:
maximumPoolSize: "${SPRING_DATASOURCE_MAXIMUM_POOL_SIZE:5}"
在 application 模块下找到 ThingsboardServerApplication 启动引导类,运行该main函数启动服务;
2020-07-10 10:56:41,297 [main] INFO o.s.b.a.w.s.WelcomePageHandlerMapping - Adding welcome page: class path resource [public/index.html]
2020-07-10 10:56:41,911 [main] INFO s.d.s.w.p.DocumentationPluginsBootstrapper - Context refreshed
2020-07-10 10:56:41,924 [main] INFO s.d.s.w.p.DocumentationPluginsBootstrapper - Found 1 custom documentation plugin(s)
2020-07-10 10:56:41,971 [main] INFO s.d.s.w.s.ApiListingReferenceScanner - Scanning for api listing references
2020-07-10 10:56:42,655 [main] INFO s.d.s.w.r.o.CachingOperationNameGenerator - Generating unique operation named: getTenantDashboardsUsingGET_1
2020-07-10 10:56:42,779 [main] INFO s.d.s.w.r.o.CachingOperationNameGenerator - Generating unique operation named: claimDeviceUsingPOST_1
2020-07-10 10:56:42,799 [main] INFO s.d.s.w.r.o.CachingOperationNameGenerator - Generating unique operation named: findByQueryUsingPOST_1
2020-07-10 10:56:42,985 [main] INFO s.d.s.w.r.o.CachingOperationNameGenerator - Generating unique operation named: findByFromUsingGET_1
2020-07-10 10:56:42,995 [main] INFO s.d.s.w.r.o.CachingOperationNameGenerator - Generating unique operation named: findByQueryUsingPOST_2
2020-07-10 10:56:43,019 [main] INFO s.d.s.w.r.o.CachingOperationNameGenerator - Generating unique operation named: findByToUsingGET_1
2020-07-10 10:56:43,112 [main] INFO s.d.s.w.r.o.CachingOperationNameGenerator - Generating unique operation named: findByQueryUsingPOST_3
2020-07-10 10:56:43,233 [main] INFO s.d.s.w.r.o.CachingOperationNameGenerator - Generating unique operation named: getEventsUsingGET_1
2020-07-10 10:56:43,362 [main] INFO s.d.s.w.r.o.CachingOperationNameGenerator - Generating unique operation named: deleteEntityAttributesUsingDELETE_1
2020-07-10 10:56:43,747 [main] INFO s.d.s.w.r.o.CachingOperationNameGenerator - Generating unique operation named: getWidgetsBundlesUsingGET_1
2020-07-10 10:56:43,784 [main] INFO o.a.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-0.0.0.0-8080"]
2020-07-10 10:56:43,806 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer - Tomcat started on port(s): 8080 (http) with context path ''
2020-07-10 10:56:43,808 [main] INFO o.t.s.ThingsboardServerApplication - Started ThingsboardServerApplication in 15.768 seconds (JVM running for 16.463)
出现 Started ThingsboardServerApplication in xxx seconds
则启动成功。此时打开浏览器访问 localhost:8080 即可看到熟悉的Thingsboard登录页面,到这源码编译完成。O(∩_∩)O哈哈~