ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Thingsboard在Windows上的启动实战:从发行包到源码编译

Thingsboard在Windows上的启动实战:从发行包到源码编译 经常有人私信我说Thingsboard这个开源物联网平台下载下来照着官方文档在Windows上搞了大半天启动还是各种报错。我太理解这种感受了。Thingsboard功能是真的强设备接入、规则引擎、可视化大屏全都有但它的启动流程也确实不是开箱即用——要装对JDK、配好PostgreSQL、改对配置文件还得把前端的静态资源处理好。这篇文章我就按自己实际跑通的流程从零开始把手教你在Windows上启动Thingsboard社区版包括官方发行包和源码编译两条路顺带把我踩过的坑一个一个列出来。想在自己电脑上先跑通评估一下、或者准备做二次开发的同学直接照着做就行。1. 启动前先把Thingsboard的脾气摸清楚1.1 这个开源物联网平台到底“重”在哪其实很多人第一次接触Thingsboard是被它的功能列表吸引过来的支持MQTT、CoAP、HTTP等设备接入协议内置规则引擎可以做数据流转和告警还有一套不错的管理后台和可视化仪表盘。换句话说一个物联网平台该有的部件它基本都齐了所以它不是一个单纯的后端服务而是一整套系统。这套系统在启动时至少要拉起这么几部分Spring Boot主程序负责业务接口和规则引擎PostgreSQL负责存实体数据和时序数据前端是一个Angular工程构建后的静态资源也要跟后端放在一起。任何一个环节没就位启动就会失败或者页面打不开。在Linux上官方脚本把这些流程处理得比较顺滑到了Windows上环境变量、路径、杀毒软件、端口占用全都会跳出来捣乱这也是为什么Windows启动这么容易翻车。1.2 三条启动路线怎么选根据你的目标不同启动路径其实有三条我建议先选好再动手不然到最后容易白折腾。第一条是用官方发行包。从GitHub Releases下载Windows对应的zip或exe改一个配置文件跑install再跑start这是最标准、最接近官方支持的路径。适合只是想本地评估、学习、或者不想碰源码的人也是我最推荐新手走的路。第二条是源码编译。你需要把GitHub上的仓库拉下来装Maven、Node.js前后端全部编译一遍然后启动。这条路适合要做二次开发的同学编译过程比较耗时但编译过一次之后后续改代码调试会顺手很多。第三条是Docker Desktop。如果你机器上已经有Docker直接拉thingsboard/tb-postgres镜像容器起来就完了。但如果你对Docker本身不熟还得先学容器网络、端口映射这个学习成本和踩坑量不比前两条少。我个人建议是先走发行包路线跑通理解Thingsboard的组成后面再考虑容器化。2. 环境准备把地基一次打牢无论走哪条路Java和数据库都是绕不开的。环境这块我建议一次装到位不要装一半发现版本不对又卸载重装那才是最磨人的。2.1 JDK版本别装错JAVA_HOME要配好Thingsboard是Java技术栈JDK版本是第一个大坑。不同版本的Thingsboard要求不一样我的经验是3.5及以前的版本老老实实用JDK 113.6之后官方开始向Java 17迁移3.7以后的版本直接要求JDK 17。所以在你下载完源码或者发行包之后先去官方仓库的README里看一眼当前这个版本用的到底哪个Java版本再决定装JDK。装完JDK以后光配置PATH不够一定把JAVA_HOME也配上。Windows下JAVA_HOME指的是JDK的安装根目录比如C:\Program Files\Java\jdk-17。然后在PATH里加%JAVA_HOME%\bin。配完之后打开一个新的cmd窗口执行java -version确认输出的是不是你刚装的版本。很多启动脚本里找的是JAVA_HOME而不是单纯靠PATH里的java这一步偷懒后面会莫名其妙报“找不到java命令”。这里还要提醒一句别图省事装个JRE就开跑编译和运行都需要完整的JDK。也不能同时装一堆JDK然后凭缘分选版本建议装一个、只保留一个JAVA_HOME指向它。我见过有人装了JDK 8和JDK 17结果脚本去调JAVA_HOME时切到了老版本整个启动流程直接废掉。2.2 PostgreSQL安装与建库数据库方面Thingsboard社区版用的是PostgreSQL安装完成后默认端口是5432。安装PostgreSQL时会让你设置超级用户postgres的密码这个密码一定记清楚后面所有配置都要用到它。为了避免大小写和特殊字符引起配置麻烦我建议干脆把密码设成常见的口令当然生产环境另说本地学习怎么方便怎么来。装好以后创建数据库。我习惯用pgAdmin的图形界面也可以直接用命令行CREATE DATABASE thingsboard ENCODING UTF8;为什么特别强调UTF8因为Thingsboard的仪表盘、规则链里都会存中文数据库编码不对后面写入中文数据会报编码错误。如果你机器上已经装过别的PostgreSQL版本或者之前装过又卸载过很容易出现端口已经不是5432的情况比如变成了5433。这种问题后面排查数据库连接时极其隐蔽。测试连接的时候先用pgAdmin或者psql确认当前实际端口是多少。2.3 Maven、IDEA和网络镜像问题源码编译这条路需要准备Maven。版本不要用太老的3.6以上都行。装完之后我强烈建议先改Maven的settings.xml把中央仓库源换成国内镜像比如阿里云的maven镜像。不改的话第一次编译光下载依赖可能就要等上一个小时改了至少能快一半以上。IDEA方面如果你打算在Windows上改代码调试除了下载Ultimate或者Community版本有一个容易忽略的插件必须装上Lombok。Thingsboard的代码里大量用了Lombok省去getter/setter没装这个插件或者没在IDEA里启用注解处理你会看到一大堆类标红编译也过不去。到这一步环境就算准备好了。接下来按你选的路线继续。3. 官方发行包启动今天就能跑通如果你是第一次接触Thingsboard想花最短时间跑通一套系统看看效果直接走这条线。不出意外的话从下载到登录后台差不多半小时就能搞定。3.1 下载解压路径、目录别埋雷去GitHub的Thingsboard仓库Releases页面下载对应版本的Windows发行包。这里提醒一下不要下载source code的zip那个是源码包要下载带windows标识的安装包或zip包。解压的时候路径选择非常重要。我踩过一个很傻的坑把包解压到C:\Program Files\Thingsboard这样带空格的目录里结果启动脚本解析路径出错报错信息还不明显。后来我总结出了规矩解压路径不要有中文、不要有空格比如直接放D:\thingsboard就很好。解压完你会看到bin、conf、application、logs这几个核心目录。bin下面有install.bat、start.bat、stop.bat这些脚本conf里面是配置文件logs是日志输出。心里先有个数后面所有的操作基本都围绕这几个目录展开。3.2 改thingsboard.yml数据库连接信息用文本编辑器打开conf目录下的thingsboard.yml。这个文件是整个平台配置的核心我们需要调整数据库连接部分。我用的Thingsboard 3.x版本配置大致是下面这样不同小版本字段名会有一点点差异但结构基本一致database: type: ${DATABASE_TYPE:postgres} entities: type: ${DATABASE_ENTITIES_TYPE:postgres} url: ${DATABASE_ENTITIES_URL:jdbc:postgresql://localhost:5432/thingsboard} username: ${DATABASE_ENTITIES_USERNAME:postgres} password: ${DATABASE_ENTITIES_PASSWORD:postgres} ts: type: ${DATABASE_TS_TYPE:postgres}直接把url里的localhost:5432保持默认把username和password改成你安装PostgreSQL时设置的用户名和密码type保持postgres。还有一个database.ts.type下面的type同样保持postgres。为什么要同时看entities和ts两块entities存的是设备、租户这些业务实体ts存的是遥测时序数据两者对社区版来说都用PostgreSQL。改的时候注意YAML文件对缩进非常敏感一定用空格缩进不要用Tab改错了启动时直接解析失败。3.3 install.bat建表、初始化、写种子数据数据库连接配好之后用cmd进入bin目录或者直接在文件管理器地址栏敲cmd打开命令行然后执行install.bat这一步做的事情很多包括创建数据库表结构、执行Liquibase数据库迁移脚本、写入系统配置以及写默认账号和演示数据。你可以把它理解成“初始化操作”不是每次启动都要执行但第一次跑之前必须执行。install过程中屏幕上会刷大量日志看到类似Installation finished successfully的字样说明成功了。如果中途报错优先看两个地方一是数据库服务有没有启动二是yml里的账号密码和端口对不对。这里有个经验install.bat失败之后不要马上再执行一次。它内部用的是一套数据库迁移逻辑上一次失败留下的半成品状态可能导致第二次执行时出现重复迁移的报错。先去改配置确认没问题再重试。install过程的具体日志会写在logs目录下不是只盯着cmd窗口。3.4 start.bat启动和页面登录验证install成功之后在同一个bin目录里执行start.bat。Windows下启动方式有点特殊它会新开一个Java进程所以cmd窗口不要关让它继续挂着。启动过程中如果你发现窗口里半天没动静也很正常第一次启动往往需要几十秒到两三分钟尤其是数据库初始化完成后第一次连接会比较慢。判断是否真的启动完成盯着logs目录下的thingsboard.log看到日志尾部出现类似Started Thingsboard的英文日志才算真正起来了。然后打开浏览器访问http://localhost:8080如果页面能打开说明主程序已经正常工作。默认账号密码官方固定系统管理员sysadminthingsboard.org / sysadmin租户管理员tenantthingsboard.org / tenant客户用户customerthingsboard.org / customer我一般先用tenant账号登录它对应的是实际业务里“租户”的视角能看到设备接入、规则链、仪表盘这些核心功能比sysadmin更贴近日常使用场景。3.5 顺手把JVM堆内存调到合适大小Thingsboard启动之后默认的JVM堆内存参数不一定适合你的机器尤其在Windows上表现明显。我遇到过跑起来之后页面加载很卡过一会儿提示OutOfMemoryError的情况原因就是默认堆内存太小。在bin目录下找到setenv.bat之类的环境变量脚本用编辑器打开找到JAVA_OPTS的设置改成类似下面的值set JAVA_OPTS-Xms1024m -Xmx2048m-Xms是启动时分配的最小堆-Xmx是最大堆。给到2G对大多数本地评估场景是够用的。如果机器内存只有8G给1.5G也行如果16G以上可以放心给2G甚至更高。改完之后重启Thingsboard才会生效。我自己的习惯是把内存参数记录在配置文件旁边换机器部署时直接参考省得再翻日志猜来猜去。4. 源码编译启动二次开发者的必修课如果你不是只想跑一下看看界面而是要改Thingsboard的代码、做私有化定制那源码编译这条线迟早要过一遍。4.1 拉代码选分支Maven编译的完整命令首先把Thingsboard源码克隆到本地git clone https://github.com/thingsboard/thingsboard.git cd thingsboard然后切分支。这里有一个选择上的学问不要直接拉master分支master往往是开发主线可能正在变更、接口不稳定直接用master编译特别容易遇到奇怪的失败。正确做法是拉一个release分支比如官方仓库里的release-3.6、release-3.7这种稳定版本分支。具体有哪些分支在GitHub仓库页面的Branch按钮里能看到认准release开头就行。切好分支后在项目根目录执行Maven编译mvn clean install -DskipTests -Dlicense.skiptrue第一次编译的时间会比你预想的久得多因为要下载海量依赖。为了编译不中途崩掉先设置Maven运行内存set MAVEN_OPTS-Xmx2048m否则会在编译到某个模块时突然报Java heap space错误。这种错误不是代码问题是内存不够。再补一句Windows的Defender实时防护在编译时非常拖速度扫描临时文件会疯狂占CPU。编译的过程中可以把实时防护暂时关掉注意不要关掉防火墙本身。实测这个操作能让编译时间明显缩短。4.2 前端ui-ngx构建和静态资源拷贝很多新手弄不明白为什么后端代码编译成功了页面还是打不开因为Thingsboard的前端是独立的Angular工程目录在ui-ngx。后端进程能起来但它需要把前端构建出来的静态资源放在自己的classpath里才能对外提供web页面。如果你走了全量的Maven构建前端构建产物会被自动合并到后端模块里你其实不用管前端。但如果你是在IDEA里直接改代码调试没有走全量Maven构建那前端资源大概率是没有的这时候需要手动构建前端。前端构建命令如下cd ui-ngx npm config set registry https://registry.npmmirror.com npm install npm run buildnpm install阶段会因为网络原因卡住的概率很高所以先把npm源切到国内镜像再装依赖。构建完成后把ui-ngx/dist目录里的内容拷贝到application模块的target/classes/static目录下然后重启后端。如果跳过了这一步你在浏览器里打开localhost:8080看到的就是404或者白屏。Node版本也要注意不同版本的ui-ngx对Node.js版本要求不同老版本可能要求Node14/16新版本要求更高。装错Node版本npm install会报各种匪夷所思的错比如依赖版本冲突、构建脚本失败等。遇到这类报错第一反应别去瞎查依赖先看Node和npm版本对不对得上。4.3 三种运行方式对比与推荐组合源码跑起来的方式有三种我把它们的适用场景说清楚。第一种是直接运行打好的jar包。在根目录编译完成后到application/target目录下找到生成的jar第一次运行时加上安装参数java -jar thingsboard.jar --install这个参数等价于发行包里的install.bat负责初始化数据库。等安装完成再用不带参数的命令启动java -jar thingsboard.jar这种方式最接近生产环境受IDE干扰最小我建议做二次开发时优先用这种。第二种是在IDEA里直接运行ThingsboardApplication这个类。好处是断点调试方便坏处是环境变量、工作目录、前端资源全都要自己准备。如果要在IDEA里跑至少注意三点工作目录得是application模块VM options配好内存参数前端dist要拷贝到位。缺一个就会让你在IDE和日志之间来回折腾。第三种是用Maven的spring-boot:run插件跑适合研发流程里临时验证但速度慢一些。我的真实组合是第一次初始化用jar加--install日常调试用IDEA运行后端加断点。前端改完就统一构建一次把dist同步过去。5. 启动失败排查那些我踩过最深的坑看到这里你应该已经动手了。为了让过程更顺利我把Windows启动中最常见的故障集中列一遍带有速查表的味道遇到问题直接按图索骥。5.1 端口被占用8080、5432、1883Thingsboard最常用的端口有两个8080是网页和REST接口1883是MQTT设备接入。如果你之前装过其他物联网平台或者开发工具这两个端口很容易被占用。页面打不开先在命令行里查端口netstat -ano | findstr 8080看到监听8080的进程不是Java的话一般就是被别的程序抢占了。处理办法有两个要么用任务管理器结束那个进程要么改Thingsboard的监听端口。改端口很简单在thingsboard.yml的server部分把8080改成9090然后访问http://localhost:9090就行。MQTT的1883同理可以在yml里找到对应的监听配置改掉。PostgreSQL的5432端口如果被其他程序占用问题就严重些因为数据库进程如果起不来整个Thingsboard都会启动失败。先确认“服务管理器里的postgresql服务是启动状态”再用5432试连连不上就查实际端口。5.2 内存不足编译期和运行期分开查内存问题分两种别搞混。编译期报Java heap space是Maven进程的内存不够需要设置MAVEN_OPTS。运行期报OutOfMemoryError或者启动中途卡死是Thingsboard进程的内存不够需要设置JAVA_OPTS。还有一种情况是启动时直接报“Could not reserve enough space for object heap”这种一般是你装了32位JDK或者系统可用内存实在不够解决办法是换64位JDK并关闭其他大内存程序。另外Windows的虚拟内存如果被某些优化工具关掉Java进程申请大块堆内存也容易失败建议改回系统自动管理。这个坑比较隐蔽因为报错信息里只写内存不足你很难想到是虚拟内存的问题。我身边就有同事因为优化工具关了虚拟内存Java服务怎么都起不来折腾一晚上才发现。5.3 数据库连接失败和时区问题数据库连接失败是最常见的启动失败原因日志里的关键词无非这几种Connection refused说明PostgreSQL服务没启动或者端口不对password authentication failed说明密码不匹配database thingsboard does not exist说明数据库还没建好或者yml里连的库名不对。排查顺序我建议固定下来先确认PostgreSQL服务在任务栏服务列表里是运行状态再用数据库客户端或psql手动连一次确认服务确实可用最后打开yml核对url、用户名、密码跟真实环境一致。时区问题容易被忽略。如果你启动后发现在的时序数据前后差8小时不用惊讶多半是数据库和JVM的默认时区不一致。官方推荐的方式是服务端统一用UTC展示层再做本地时区转换。本地学习时嫌麻烦可以把PostgreSQL的会话时区设置成Asia/Shanghai再在yml里同步设置保证数据记录和展示对得上。5.4 页面空白、404、前端资源缺失后端日志显示“Started Thingsboard”但浏览器打开却404或者白屏这是典型的静态资源缺失。自己从源码跑时九成是前端构建产物没有放到后端模块的static目录里。按4.2的方法把前端dist拷贝过去再重启就好。发行包路线也偶尔出现这种情况多半是解压不完整或者启动脚本找不到静态资源目录重新解压一遍就好。还有一个容易忽略的点是浏览器缓存旧页面被缓存了强制刷新一下CtrlF5往往页面就出来了。如果页面能打开但登录后某些功能一直转圈多半是规则引擎或者消息队列的配置没跑起来。社区版默认用内存模式处理消息队列不需要额外部署只要你别去瞎配外部消息队列就行。我见过有人一上来就按网上教程配Kafka结果平台起不来了其实本地评估根本用不上。5.5 启动问题速查表现象大概率原因处理办法install.bat中途失败数据库服务没启动或yml配置错误检查PostgreSQL服务核对url/账号/密码启动卡住日志长时间没变化JVM堆内存不足或数据库连接超时调大JAVA_OPTS重启数据库等待1-2分钟页面localhost:8080打不开8080端口被占用或没启动成功netstat查端口必要时改server.port页面404白屏后端日志正常前端静态资源缺失拷贝前端dist到static目录强制刷新登录时提示密码错误数据库里没有种子数据重新执行install.bat或jar加--install遥测数据显示差8小时时区不一致统一JVM和数据库时区建议用UTC存储这张表不是标准答案但它覆盖了我在Windows下遇到过的绝大多数问题。你看到的报错可能字面上不一样只要顺着“日志关键词”去查基本能对上号。最后再分享一点个人体会Thingsboard在Windows上启动这件事百分之八十的困难都集中在环境而不是程序本身。只要你把JDK版本、数据库连接、前端资源这三件事搞定后面的启动流程其实非常顺。我自己也建议本地开发用Windows没问题但真要长时间稳定运行还是放到Linux服务器或者容器里更省心。先在本机把它跑通把系统结构和配置文件摸熟再往服务器上搬你会觉得一切都顺理成章。
返回列表