Thingsboard開發環境搭建及編譯項目

  • 2020 年 3 月 13 日
  • 筆記

交流QQ群

如果安裝有其他問題,可以到QQ群求助

如果安裝有其他問題,可以優先查看本文後面的各種編譯問題解決方案,如果還不行可以到交流群求助:121202538

環境安裝

開發環境要求:
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

image.png

下載好了之後直接默認安裝就行
image.png

配置環境變數

步驟1:
在JAVA_HOME中增加JDK的安裝地址:C:Program FilesJavajdk1.8.0_221
image.png

步驟2:
在CLASSPATH中增加JDK的安裝地址中的文件:.;%JAVA_HOME%lib;%JAVA_HOME%libdt.jar;%JAVA_HOME%libtools.jar
image.png

步驟3:
在Path中增加JDK的地址:%JAVA_HOME%bin;%JAVA_HOME%jrebin;
image.png

步驟4
輸入以下命令

java -version

如果能出現以下的提示資訊,就算安裝成功了
image.png

安裝IDEA

參考:IDEA安裝教程

安裝Maven

步驟1:下載maven,進入地址:http://maven.apache.org/download.cgi
image.png

步驟2:下載到本地
image.png

步驟3:配置環境變數
增加MAVEN_HOME,即maven的地址:D:tbapache-maven-3.6.1-bin,請注意,如果直接解壓,有可能會有兩個apache-maven-3.6.1-bin
image.png

image.png

MAVEN_OPTS,參數是 -Xms128m -Xmx1024m
image.png

修改Path,增加Maven的地址%MAVEN_HOME%bin;
image.png

測試Maven安裝,打開命令行工具。使用命令mvn -v,如果能出現以下提示,即安裝成功
image.png

Nodejs安裝

步驟1:下載Nodejs安裝包,Nodejs官網地址:https://nodejs.org/en/download/
image.png

步驟2:安裝完成後,使用命令查看Nodejs是否已經安裝完成,能出現以下提示說明已經安裝成功
image.png

安裝git

步驟1:下載git安裝包,git官網地址是:https://git-scm.com/download/win
image.png

步驟2:安裝完成後,使用命令行測試git
image.png

安裝npm全局依賴

步驟1:使用管理員CMD命令行,執行下面命令

#npm 環境讀取環境變數包  npm install -g cross-env    #webpack打包工具  npm install -g webpack

image.png

安裝redis

Redis安裝參考:https://www.iotschool.com/wiki/redis

環境安裝到此結束,接下來是通過Git拉取程式碼。

克隆thingsboard程式碼

確定程式碼存放位置

在本地創建程式碼存放位置的文件目錄,然後進入當前目錄點擊滑鼠右鍵,選擇Git Bash Here
image.png

輸入git命令克隆源程式碼

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

image.png

耐心等待一段時間後,看到以下介面就算下載成功
image.png

切換git分支

默認下載的程式碼是master主分支的,我們開發需要切換到最新版本的分支。

查看項目源碼的所有分支,下載源碼後,需要進入到thingsboard文件夾
image.png

發現最新發布的版本是2.4,所以我這裡選擇2.4,當然你可以根據自己的情況進行分支選擇

輸入命令以下,即可切換至2.4的分支

git checkout release-2.4

看到下圖這樣,即切換成成功
image.png

準備工作

外網連接

因為TB在編譯過程中需要依賴很多國外的包,那麼需要外網才能連接,有連接外網支援,可以到社區求助:https://www.iotschool.com/topics/node8

設置Maven為淘寶鏡像

工程是基於Maven管理,直接通過idea open,之後會自動下載各種依賴包。依賴包的默認存儲地址為:C:Users用戶名.m2repository,內容如下:

$tree ~/.m2 -L 2  /home/jay/.m2  └── repository      ├── antlr      ├── aopalliance      ├── asm      ├── backport-util-concurrent      ├── ch      ...

一般情況下,使用官方鏡像更新依賴包,網速不穩定,可將Maven鏡像源設置為淘寶的,在maven安裝包目錄下找到settings.xml設置

大概位置截圖:

把settings.xml裡面內容設置成以下:

<mirrors>    <mirror>         <!--This sends everything else to /public -->         <id>aliyun_nexus</id>         <mirrorOf>*,!maven_nexus_201</mirrorOf>         <url>http://maven.aliyun.com/nexus/content/groups/public/</url>     </mirror>  </mirrors>

不會設置的,可以參考這個文件:https://cdn.iotschool.com/iotschool/settings.xml

thingsboard QQ群也又這個資源:121202538

設置npm為淘寶鏡像

同上,網速不好npm過程中也會下載失敗,這是導致很多同學thingsboard編譯失敗的主要原因,所以我們在進行編譯之前,也將npm替換為淘寶鏡像:

npm install -g mirror-config-china --registry=http://registry.npm.taobao.org        #使用淘寶鏡像  npm config get registry                                                             #查詢當前鏡像  npm config rm registry                                                              #刪除自定義鏡像,使用官方鏡像  npm info express

設置IDEA管理員啟動

我本地開發環境編譯項目使用IDEA工具進行編譯,所以需要設置管理員啟動,這樣才有所有的許可權執行編譯命令。
步驟1:點擊IDEA圖標右鍵,選擇屬性。
image.png

步驟2:點擊兼容性-更改所有用戶設置-以管理員身份運行此程式
image.png
image.png

開始編譯

編譯項目跟網速有關,最好連接上外網進行編譯,一般5~30分鐘都有可能,超過30分鐘要檢查你的網路。

清理項目編譯文件

使用IDEA Maven工具進行清理
image.png

輸入編譯命令開始編譯

在IDEA控制台(左下方)Terminal輸入以下命令進行編譯:

mvn clean install -DskipTests

image.png

等一段時間後,看到下面這張圖就算編譯成功,如果沒有編譯成功請按照本教程最後的常見問題進行排查,一般都是網路問題。如果還有問題,請到社區thingsboard專題中提問。

image.png

常見問題

本教程只會羅列IoTSchool小編在thingsboard編譯過程中遇到的問題,如果有其他問題,請到社區thingsboard專題中提問,會有專家為你解答。

快取導致編譯失敗

每次編譯失敗進行二次編譯時,要清理快取,並殺死遺留進程
步驟1:執行下面命令,殺死遺留進程

taskkill /f /im java.exe

步驟2:使用IDEA Maven工具進行清理
image.png

溫馨提示:要進行二次編譯前,最好重啟一次電腦!

Server UI 編譯失敗

[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]

image.png

如果遇到這個問題,可從以下幾個原因進行分析:

原因1:node、npm版本號問題

本地環境安裝的node、npm版本號與源碼中pom.xml文件配置的版本號不一致。

解決方案:
步驟1:使用node -v、npm -v查看安裝的node和npm版本號
image.png

步驟2:修改源碼中pom.xml文件中的版本號

<configuration>     <nodeVersion>v12.13.1</nodeVersion>     <npmVersion>6.12.1</npmVersion>  </configuration>

需要修改的文件有三處,位置如下:
image.png

原因2:node-sass下載失敗

編譯Server UI時,會下載node-sass依賴,如果因為網路原因沒有下載成功,也會編譯失敗。如果你是按照本本教材一步一步來的,應該不會有問題,上面準備工作中,將npm鏡像源切換為淘寶,那麼下載會很快的。

[INFO] Downloading binary from https://github.com/sass/node-sass/releases/download/v4.12.0/win32-x64-72_binding.node  [ERROR] Cannot download "https://github.com/sass/node-sass/releases/download/v4.12.0/win32-x64-72_binding.node":  [ERROR]  [ERROR] ESOCKETTIMEDOUT  [ERROR]  [ERROR] Hint: If github.com is not accessible in your location  [ERROR]       try setting a proxy via HTTP_PROXY, e.g.  [ERROR]  [ERROR]       export HTTP_PROXY=http://example.com:1234  [ERROR]  [ERROR] or configure npm proxy via  [ERROR]  [ERROR]       npm config set proxy http://example.com:8080  [INFO]  [INFO] > [email protected] postinstall F:workspacethingsboardthingsboarduinode_modulesnode-sass  [INFO] > node scripts/build.js  [INFO]

image.png

解決方案:切換鏡像源為淘寶

解決方案:重啟電腦,清理快取

原因3:Thingsboard 3.0版本編譯遇到的問題

親測:2.4版本也可以通過這種方式來解決

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:二次編譯導致殘留進程

報錯:

[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:workspacethingsboardthingsboarduitargetnodenode.exe -> [Help 1]

image.png

Server Tool編譯失敗

image.png

[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  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  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編譯失敗
image.png

[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]  [ERROR]  [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.  [ERROR] Re-run Maven using the -X switch to enable full debug logging.  [ERROR]  [ERROR] For more information about the errors and possible solutions, please read the following articles:  [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException  [ERROR]  [ERROR] After correcting the problems, you can resume the build with the command  [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
image.png

步驟2: 將下載的兩個文件放到:放到:C:Users你的用戶名  .pkg-cachev2.6。並將名字分別修改為:fetched-v10.15.3-linux-x64和fetched-v10.15.3-win-x64

參考:https://github.com/thingsboard/thingsboard/issues/2084

License檢查不通過

[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

image.png

搜索license-maven-plugin,將整個plugin都注釋掉
image.png

Web UI編譯失敗

Web UI編譯失敗請參考Server UI編譯失敗第一個原因

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

錯誤資訊

[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

錯誤資訊:

[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_projectthingsboardtransporthttptargettb-http-transport.rpm -> [Help 1]

解決方案:第一次編譯失敗,再次編譯可能會提示該錯誤,可以手動到報錯路徑刪除,如果提示文件正在使用,需要在任務管理器殺死java進程後再手動刪除。

npm:npm:cb() never called!

錯誤資訊:

npm ERR! cb() never called!    npm ERR! This is an error with npm itself. Please report this error at:  npm ERR!     <https://npm.community>    npm ERR! A complete log of this run can be found in:  npm ERR!     C:UsersyurenAppDataRoamingnpm-cache_logs2019-11-06T10_55_28_258Z-debug.log

解決方案:
嘗試npm cache clean –force 後再次npm install 無果;
嘗試更換淘寶鏡像源後再次npm install 無果;
懷疑有些包下載需要翻牆,全局代理翻牆後問題依然存在;
參考網上關閉所有代理後問題依然存在;
通過log日誌分析最後一個解包報錯的地方,屏蔽需要的material-design-icons,新modules rxjs仍然報錯;

extract [email protected] extracted to node_modules.stagingmaterial-design-icons-61b4d55e (72881ms)  extract [email protected] extracted to node_modules.stagingrxjs-e901ba4c (24280ms)

參考npm ERR cb() never called 執行

npm install --no-package-lock

之後提示npm ERR! path git,添加git 到環境變數後正常。

npm:npm ERR! path git

錯誤資訊

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

解決方案:添加git到環境變數。

No compiler is provided in this environment

錯誤資訊:

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

需要在環境變數中設置java,包含%JAVA_HOME%bin;%JAVA_HOME%lib;

更多問題,請到社區解決:https://www.iotschool.com/topics/node8