Thingsboard开源平台(一)4.源码编译

Thingsboard开源平台(一)--源码编译

  • Thingsboard开发环境搭建及源码编译
    • 1、环境搭建
      • 1.1 安装JDK
      • 1.2 安装maven
      • 1.3 安装Nodejs
      • 1.4 安装git
    • 2、源码下载
    • 3、编译项目
      • 3.1 安装npm全局依赖
      • 3.2 配置maven阿里云仓库
      • 3.3 配置npm淘宝镜像源
      • 3.4 配置ui模块node版本
      • 3.5 下载fetched本地缓存
      • 3.6 执行编译命令
    • 4、常见问题
      • 4.1 Http Transport Service编译失败
      • 4.2 Server UI 编译失败
      • 4.3 JavaScript Executor编译失败
      • 4.4 Web UI 编译失败
    • 5、启动服务
      • 5.1 安装Lombok插件
      • 5.2 修改Redis配置
      • 5.3 修改PostgreSQL配置
      • 5.4 运行ServerApplication

Thingsboard开发环境搭建及源码编译

在上一章节Thingsboard开源平台(一)2.软件安装中,我们主要介绍了Thingsboard v3.0.1版本在Windows系统中的安装,本章也是基于最新的v3.0.1版本的源码进行编译和开发环境搭建。好了,下面就开始吧。

1、环境搭建

1.1 安装JDK

下载JDK1.8

https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html

安装并配置环境变量
双击下载好的JDK安装文件,选择文件路径为“D:\Program Files (x86)\Java”,安装过程较为简单,直接下一步即可。
Thingsboard开源平台(一)4.源码编译_第1张图片
安装完成后开始配置环境变量:
新增“JAVA_HOME”变量,变量值为JDK安装路径“D:\Program Files (x86)\Java\jdk1.8.0_144”;
Thingsboard开源平台(一)4.源码编译_第2张图片
新增“CLASSPATH”变量,变量值类文件路径“.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar”;
Thingsboard开源平台(一)4.源码编译_第3张图片
修改“Path”变量,新增JDK的地址:“%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin”;
Thingsboard开源平台(一)4.源码编译_第4张图片
配置完成后,打开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)

1.2 安装maven

下载maven3.6

http://maven.apache.org/download.cgi

解压并配置环境变量
解压路径为“D:\apache-maven-3.6.3”,新增环境变量“MAVEN_HOME”,变量值为解压路径;
Thingsboard开源平台(一)4.源码编译_第5张图片
修改Path,增加maven的地址“%MAVEN_HOME%\bin”;
Thingsboard开源平台(一)4.源码编译_第6张图片
测试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>

1.3 安装Nodejs

下载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,说明镜像配置成功。

1.4 安装git

下载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>]

2、源码下载

打开GitHub中Thingsboard代码仓库,选择v3.0.1版本,下载源码;

https://github.com/thingsboard/thingsboard/tree/v3.0.1

Thingsboard开源平台(一)4.源码编译_第7张图片

3、编译项目

3.1 安装npm全局依赖

使用命令行执行以下命令:

# 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

3.2 配置maven阿里云仓库

由于官方的库在国外,使用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>

3.3 配置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,说明镜像配置成功。

3.4 配置ui模块node版本

打开代码“ui-ngx\pom.xml”文件,修改node、npm版本和安装的版本一致:
Thingsboard开源平台(一)4.源码编译_第8张图片
同样,修改msa模块下 js-executor、web-ui子模块中的pom.xml 文件,完成后保存。
Thingsboard开源平台(一)4.源码编译_第9张图片

3.5 下载fetched本地缓存

在编译过程中,经常有jar下载不下来导致编译失败,通常情况下重复多试几次就可以了,但在编译JavaScript Executor模块时,fetched包缓存死活下载不了,所以在执行编译之前提前把它下载好。

下载这两个文件到本地,地址如下:

https://github.com/zeit/pkg-fetch/releases

Thingsboard开源平台(一)4.源码编译_第10张图片
将这两个文件放到:C:\Users\${username}.pkg-cache\v2.6,并修改名称为fetched-v10.17.0-linux-x64和fetched-v10.17.0-win-x64
Thingsboard开源平台(一)4.源码编译_第11张图片

3.6 执行编译命令

以管理员身份打开命令行工具,执行“mvn clean install -DskipTests”命令,等待执行完成;

mvn clean install -DskipTests

整个过程大约需要10~30分钟,耐心等待编译完成,最终结果如下:
Thingsboard开源平台(一)4.源码编译_第12张图片

4、常见问题

在源码编译过程中,由于硬件、网络等环境的原因(主要是网络下载国外依赖包),很可能会编译失败,我把经常出现的问题及解决方法做了一些总结,具体如下。

注:失败不要灰心,尝试切换镜像源,清理缓存重启电脑,多试几次。

4.1 Http Transport Service编译失败

由于网络原因,gradle-maven-plugin 插件下载不成功导致编译失败。添加阿里云仓库到maven镜像,清理缓存,重新编译。
Thingsboard开源平台(一)4.源码编译_第13张图片
如果还是不成功,再把阿里云仓库注释掉,再次尝试,编译前最好重启电脑并清理环境。
Thingsboard开源平台(一)4.源码编译_第14张图片

4.2 Server UI 编译失败

如果遇到这个问题,可以从以下几个原因分析:
Thingsboard开源平台(一)4.源码编译_第15张图片
4.2.1 本地安装的node、npm版本和源码中pom.xml文件配置的版本号不一致
解决方案:修改源码中pom.xml文件中nodeVersion、npmVersion版本号
Thingsboard开源平台(一)4.源码编译_第16张图片
需要修改的文件有三处,位置如下:
Thingsboard开源平台(一)4.源码编译_第17张图片
4.2.2 是否设置了淘宝镜像源,如果是可以尝试切换回官方镜像源
解决方案:删除本地设置的淘宝镜像源
Thingsboard开源平台(一)4.源码编译_第18张图片
清除npm缓存:第一步执行npm cache clean --force;第二步:删除node_module包;
Thingsboard开源平台(一)4.源码编译_第19张图片
4.2.3 如果碰到内存溢出的情况比较麻烦,尝试修改Maven和Nodejs的内存大小

我在第二次编译的过程中就曝出了这个问题,折腾了很久

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory

解决方案:
尝试修改Maven的内存大小,在环境变量中新建 MAVEN_OPTS
Thingsboard开源平台(一)4.源码编译_第20张图片
尝试修改Nodejs运行时最大内存,打开命令行工具执行以下命令:

C:\WINDOWS\system32>setx NODE_OPTIONS --max_old_space_size=10240
成功: 指定的值已得到保存。

4.3 JavaScript Executor编译失败

JavaScript Executor模块时,fetched包缓存死活下载不了,所以在执行编译之前提前把它下载好。

下载这两个文件到本地,地址如下:

https://github.com/zeit/pkg-fetch/releases

Thingsboard开源平台(一)4.源码编译_第21张图片
将这两个文件放到:C:\Users\${username}.pkg-cache\v2.6,并修改名称为fetched-v10.17.0-linux-x64和fetched-v10.17.0-win-x64
Thingsboard开源平台(一)4.源码编译_第22张图片

4.4 Web UI 编译失败

Web UI 编译和Server UI 类似,参考上述 4.2 Server UI 编译失败。

5、启动服务

编译成功后,让我们尝试运行Thingsboard源码。由于在 Thingsboard开源平台(一)2.软件安装 章节中,已经启动过Thingsboard服务并执行了 –loadDemo 初始化,导入过了示例数据,因此在本章中仍使用之前配置好的thingsboard数据库。

5.1 安装Lombok插件

启动IDEA,打开Thingsboard源码,在 File->Settings->Plugins 中安装Lombok插件;
Thingsboard开源平台(一)4.源码编译_第23张图片

5.2 修改Redis配置

打开 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}"

5.3 修改PostgreSQL配置

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}"

5.4 运行ServerApplication

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哈哈~
Thingsboard开源平台(一)4.源码编译_第24张图片

你可能感兴趣的:(Thingsboard开源平台)