第六章、IDEA环境配置
上一章我们总算用Maven把thingsboard正常进行了一次编译,同时我们也把Maven的相关依赖下载到了我们的本地仓库。接下来我们要在Vscode中打开项目。
本章的目的是配置一个对thingsboard进行编辑的开发环境,便于后续在项目中对其进行修改。
经过各种尝试,VScode不管如何设置最后都会报错,最终使用的是IDEA,只要能正常进行一次编译,基本上就能正常进行开发调试了。
如果你对thingsboard没有修改要求,可以跳过这一章。
1、插件
我使用的是IDEA的社区版,因为毕竟不会对其进行大的改动
除了会提示你安装一些插件外,需要单独去安装一下Protocol Buffers插件
2、编程环境搭建
2.1、postgresql数据库
这里我们主要是搭建一个编程环境,真正的部署还是在服务器上的,为了便于测试代码,我在windows环境中也安装了postgresql数据库。
下载地址:需要15以上的版本
EDB: Open-Source, Enterprise Postgres Database Management
无脑下一步,设置好你的密码,这个是postgresql数据的密码。
打开pgAdmin4
右键,注册-->服务器
起个名字,我这里是127.0.0.1
输入主机地址,这里我是本机,127.0.0.1,输入密码后保存,
右键数据库,创建-->数据库,创建一个名为thingsboard的数据库
保存退出即可。
2.2、 PostgreSQL JDBC
下载最新的JDBC
https://jdbc.postgresql.org/download/
修改环境变量
按官方文档,在C:\Program Files\目录下新建一个JDBC目录,然后将下载的文件放进去。
以管理员身份运行PowerShell,把下面复制后运行。
[System.Environment]::SetEnvironmentVariable("CLASSPATH", '.;"C:\Program Files\JDBC\postgresql-42.7.3.jar"', [System.EnvironmentVariableTarget]::Machine)
修改postgresql-42.7.3.jar为你下载的文件名。
2.3、node和yarn
查看ui-ngx\pom.xml文件,其中59行
<configuration>
<nodeVersion>v20.11.1</nodeVersion>
<yarnVersion>v1.22.17</yarnVersion>
</configuration>
可以看出需要这个二个版本的软件。
PS:如果你已经有了,那么修改这个为你现在的版本。
没有得话就去下载,官网 msi文件地址:
https://nodejs.org/dist/v20.11.1/
yarn安装命令:
choco install yarn
修改yarn版本
yarn set version 1.22.17
3、IDEA设置
3.1、设置maven
打开项目,在设置中设置好maven配置。
在idea设置中搜索maven
在构建工具-->maven中,根据自己的实际情况,修改maven参数为自己的路径。
打开源码位置,导入项目。
最好在idea中对项目再进行一次编译。
mvn clean install -DskipTests
大部分的错误都是少了相应的文件,要一个个去核对补充,还是建议使用上一章提供的本地仓库,可以减少绝大部分的错误发生。
3.2、修改程序数据库连接
修改原码 application\src\main\resources\thingsboard.yml
搜索datasource
把
password: "${SPRING_DATASOURCE_PASSWORD:password}"
替换红色password为你之前输入的postgresql的密码。
3.3、运行项目
用idea定位到\application\src\main\java\org\thingsboard\server找到ThingsboardServerApplication
右键运行。
我的电脑报错,命令行过长
选择缩短命令行并重新运行。
经过一番等待,运行成功!
4、遇到的问题总结
下面碰到的问题都是我之前用vscode所碰到的,虽然后面用idea整好了,但希望能为大家举一反三。
每次解决一个问题,建议重新打开一次编辑器。
为了避免强烈建议使用前一章的本地maven库。
4.1、Connect timed out
连接超时是常见的错误。大部分情况下这个因为网络问题造成的,所以多做几次reload projects模块既能解决此错误,如果不行,我们以下面的为例。
[{
"resource": "/C:/thingsboard-3.7/msa/web-ui/pom.xml",
"owner": "_generated_diagnostic_collection_name_#3",
"code": "0",
"severity": 8,
"message": "org.apache.maven.plugins:maven-dependency-plugin:pom:3.6.1 failed to transfer from https://repo.maven.apache.org/maven2 during a previous attempt. This failure was cached in the local repository and resolution is not reattempted until the update interval of central has elapsed or updates are forced. Original error: Could not transfer artifact org.apache.maven.plugins:maven-dependency-plugin:pom:3.6.1 from/to central (https://repo.maven.apache.org/maven2): Connect to repo.maven.apache.org:443 [repo.maven.apache.org/151.101.108.215] failed: Connect timed out",
"source": "Java",
"startLineNumber": 1,
"startColumn": 1,
"endLineNumber": 1,
"endColumn": 1
}]
有问题的部分我高亮了。这个是maven-dependency-plugin-3.6.1.pom文件下载错误,我们找到本地仓库,定位到\.m2\repository\org\apache\maven\plugins\maven-dependency-plugin\3.6.1
可以看到有个maven-dependency-plugin-3.6.1.pom.lastUpdated,但没有maven-dependency-plugin-3.6.1.pom
快速方案是去https://repo1.maven.org/maven2/ 找到文件,下载后放到这个目录中即可。
有时候同一个pom.xml文件中会有多个超时错误,需要逐一排除。
4.2、org.eclipse.sisu:org.eclipse.sisu.plexus:jar:0.3.0.M1
无法下载
[{
"resource": "/C:/Users/zhangdaye/Desktop/thingsboard-3.7/thingsboard-3.7/application/pom.xml",
"owner": "_generated_diagnostic_collection_name_#3",
"code": "0",
"severity": 8,
"message": "Failed to execute mojo org.apache.maven.plugins:maven-dependency-plugin:3.6.1:copy {execution: copy-protoc} (org.apache.maven.plugins:maven-dependency-plugin:3.6.1:copy:copy-protoc:generate-sources)\n\norg.eclipse.core.runtime.CoreException: Failed to execute mojo org.apache.maven.plugins:maven-dependency-plugin:3.6.1:copy {execution: copy-protoc}\r\n\tat org.eclipse.m2e.core.internal.embedder.MavenExecutionContext.executeMojo(MavenExecutionContext.java:404)\r\n\tat org.eclipse.m2e.core.internal.embedder.MavenExecutionContext.lambda$2(MavenExecutionContext.java:355)\r\n\tat org.eclipse.m2e.core.internal.embedder.MavenExecutionContext.executeBare(MavenExecutionContext.java:458)\r\n\tat org.eclipse.m2e.core.internal.embedder.MavenExecutionContext.execute(MavenExecutionContext.java:339)\r\n\tat org.eclipse.m2e.core.internal.embedder.MavenExecutionContext.execute(MavenExecutionContext.java:354)\r\n\tat org.eclipse.m2e.core.project.configurator.MojoExecutionBuildParticipant.build(MojoExecutionBuildParticipant.java:57)\r\n\tat org.eclipse.m2e.core.internal.builder.MavenBuilderImpl.lambda$2(MavenBuilderImpl.java:159)\r\n\tat java.base/java.util.LinkedHashMap.forEach(Unknown Source)\r\n\tat org.eclipse.m2e.core.internal.builder.MavenBuilderImpl.build(MavenBuilderImpl.java:139)\r\n\tat org.eclipse.m2e.core.internal.builder.MavenBuilder$1.method(MavenBuilder.java:164)\r\n\tat org.eclipse.m2e.core.internal.builder.MavenBuilder$1.method(MavenBuilder.java:1)\r\n\tat org.eclipse.m2e.core.internal.builder.MavenBuilder$BuildMethod.lambda$1(MavenBuilder.java:109)\r\n\tat org.eclipse.m2e.core.internal.embedder.MavenExecutionContext.executeBare(MavenExecutionContext.java:458)\r\n\tat org.eclipse.m2e.core.internal.embedder.MavenExecutionContext.execute(MavenExecutionContext.java:292)\r\n\tat org.eclipse.m2e.core.internal.builder.MavenBuilder$BuildMethod.lambda$0(MavenBuilder.java:100)\r\n\tat org.eclipse.m2e.core.internal.embedder.MavenExecutionContext.executeBare(MavenExecutionContext.java:458)\r\n\tat org.eclipse.m2e.core.internal.embedder.MavenExecutionContext.execute(MavenExecutionContext.java:339)\r\n\tat org.eclipse.m2e.core.internal.embedder.MavenExecutionContext.execute(MavenExecutionContext.java:278)\r\n\tat org.eclipse.m2e.core.internal.builder.MavenBuilder$BuildMethod.execute(MavenBuilder.java:83)\r\n\tat org.eclipse.m2e.core.internal.builder.MavenBuilder.build(MavenBuilder.java:192)\r\n\tat org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:1077)\r\n\tat org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47)\r\n\tat org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:296)\r\n\tat org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:352)\r\n\tat org.eclipse.core.internal.events.BuildManager$1.run(BuildManager.java:441)\r\n\tat org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47)\r\n\tat org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:444)\r\n\tat org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:555)\r\n\tat org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:503)\r\n\tat org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:585)\r\n\tat org.eclipse.core.internal.events.AutoBuildJob.doBuild(AutoBuildJob.java:207)\r\n\tat org.eclipse.core.internal.events.AutoBuildJob.run(AutoBuildJob.java:300)\r\n\tat org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)\r\nCaused by: org.apache.maven.plugin.PluginExecutionException: Execution copy-protoc of goal org.apache.maven.plugins:maven-dependency-plugin:3.6.1:copy failed: Plugin org.apache.maven.plugins:maven-dependency-plugin:3.6.1 or one of its dependencies could not be resolved: Failed to collect dependencies at org.apache.maven.plugins:maven-dependency-plugin:jar:3.6.1 -> org.apache.maven.reporting:maven-reporting-impl:jar:3.2.0 -> org.apache.maven:maven-core:jar:3.1.0 -> org.eclipse.sisu:org.eclipse.sisu.plexus:jar:0.3.0.M1\r\n\tat org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:100)\r\n\tat org.eclipse.m2e.core.internal.embedder.MavenExecutionContext.executeMojo(MavenExecutionContext.java:402)\r\n\t... 32 more\r\nCaused by: org.apache.maven.plugin.PluginResolutionException: Plugin org.apache.maven.plugins:maven-dependency-plugin:3.6.1 or one of its dependencies could not be resolved: Failed to collect dependencies at org.apache.maven.plugins:maven-dependency-plugin:jar:3.6.1 -> org.apache.maven.reporting:maven-reporting-impl:jar:3.2.0 -> org.apache.maven:maven-core:jar:3.1.0 -> org.eclipse.sisu:org.eclipse.sisu.plexus:jar:0.3.0.M1\r\n\tat org.apache.maven.plugin.internal.DefaultPluginDependenciesResolver.resolveInternal(DefaultPluginDependenciesResolver.java:221)\r\n\tat org.apache.maven.plugin.internal.DefaultPluginDependenciesResolver.resolve(DefaultPluginDependenciesResolver.java:165)\r\n\tat org.eclipse.m2e.core.internal.project.registry.EclipsePluginDependenciesResolver.resolve(EclipsePluginDependenciesResolver.java:55)\r\n\tat org.apache.maven.plugin.internal.DefaultMavenPluginManager.createPluginRealm(DefaultMavenPluginManager.java:377)\r\n\tat org.apache.maven.plugin.internal.DefaultMavenPluginManager.lambda$setupPluginRealm$1(DefaultMavenPluginManager.java:340)\r\n\tat org.apache.maven.plugin.DefaultPluginRealmCache.lambda$get$0(DefaultPluginRealmCache.java:156)\r\n\tat java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(Unknown Source)\r\n\tat org.apache.maven.plugin.DefaultPluginRealmCache.get(DefaultPluginRealmCache.java:154)\r\n\tat org.apache.maven.plugin.internal.DefaultMavenPluginManager.setupPluginRealm(DefaultMavenPluginManager.java:339)\r\n\tat org.apache.maven.plugin.DefaultBuildPluginManager.getPluginRealm(DefaultBuildPluginManager.java:205)\r\n\tat org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:98)\r\n\t... 33 more\r\nCaused by: org.eclipse.aether.collection.DependencyCollectionException: Failed to collect dependencies at org.apache.maven.plugins:maven-dependency-plugin:jar:3.6.1 -> org.apache.maven.reporting:maven-reporting-impl:jar:3.2.0 -> org.apache.maven:maven-core:jar:3.1.0 -> org.eclipse.sisu:org.eclipse.sisu.plexus:jar:0.3.0.M1\r\n\tat org.eclipse.aether.internal.impl.collect.DependencyCollectorDelegate.collectDependencies(DependencyCollectorDelegate.java:260)\r\n\tat org.eclipse.aether.internal.impl.collect.DefaultDependencyCollector.collectDependencies(DefaultDependencyCollector.java:87)\r\n\tat org.eclipse.aether.internal.impl.DefaultRepositorySystem.collectDependencies(DefaultRepositorySystem.java:306)\r\n\tat org.apache.maven.plugin.internal.DefaultPluginDependenciesResolver.resolveInternal(DefaultPluginDependenciesResolver.java:212)\r\n\t... 43 more\r\nCaused by: org.eclipse.aether.resolution.ArtifactDescriptorException: Failed to read artifact descriptor for org.eclipse.sisu:org.eclipse.sisu.plexus:jar:0.3.0.M1\r\n\tat org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.loadPom(DefaultArtifactDescriptorReader.java:245)\r\n\tat org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.readArtifactDescriptor(DefaultArtifactDescriptorReader.java:175)\r\n\tat org.eclipse.aether.internal.impl.collect.bf.BfDependencyCollector.resolveCachedArtifactDescriptor(BfDependencyCollector.java:464)\r\n\tat org.eclipse.aether.internal.impl.collect.bf.BfDependencyCollector.resolveDescriptorForVersion(BfDependencyCollector.java:450)\r\n\tat org.eclipse.aether.internal.impl.collect.bf.BfDependencyCollector.lambda$resolveArtifactDescriptorAsync$1(BfDependencyCollector.java:417)\r\n\tat java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(Unknown Source)\r\n\tat java.base/java.util.stream.ReferencePipeline$Head.forEach(Unknown Source)\r\n\tat org.eclipse.aether.internal.impl.collect.bf.BfDependencyCollector.lambda$resolveArtifactDescriptorAsync$4(BfDependencyCollector.java:416)\r\n\tat java.base/java.util.concurrent.FutureTask.run(Unknown Source)\r\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)\r\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)\r\n\tat java.base/java.lang.Thread.run(Unknown Source)\r\nCaused by: org.eclipse.aether.resolution.ArtifactResolutionException: The following artifacts could not be resolved: org.eclipse.sisu:org.eclipse.sisu.plexus:pom:0.3.0.M1 (absent): org.eclipse.sisu:org.eclipse.sisu.plexus:pom:0.3.0.M1 failed to transfer from https://repo.maven.apache.org/maven2 during a previous attempt. This failure was cached in the local repository and resolution is not reattempted until the update interval of central has elapsed or updates are forced. Original error: Could not transfer artifact org.eclipse.sisu:org.eclipse.sisu.plexus:pom:0.3.0.M1 from/to central (https://repo.maven.apache.org/maven2): Connect to repo.maven.apache.org:443 [repo.maven.apache.org/146.75.112.215] failed: Connect timed out\r\n\tat org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolve(DefaultArtifactResolver.java:473)\r\n\tat org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifacts(DefaultArtifactResolver.java:261)\r\n\tat org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifact(DefaultArtifactResolver.java:243)\r\n\tat org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.loadPom(DefaultArtifactDescriptorReader.java:234)\r\n\t... 11 more\r\nCaused by: org.eclipse.aether.transfer.ArtifactTransferException: org.eclipse.sisu:org.eclipse.sisu.plexus:pom:0.3.0.M1 failed to transfer from https://repo.maven.apache.org/maven2 during a previous attempt. This failure was cached in the local repository and resolution is not reattempted until the update interval of central has elapsed or updates are forced. Original error: Could not transfer artifact org.eclipse.sisu:org.eclipse.sisu.plexus:pom:0.3.0.M1 from/to central (https://repo.maven.apache.org/maven2): Connect to repo.maven.apache.org:443 [repo.maven.apache.org/146.75.112.215] failed: Connect timed out\r\n\tat org.eclipse.aether.internal.impl.DefaultUpdateCheckManager.newException(DefaultUpdateCheckManager.java:235)\r\n\tat org.eclipse.aether.internal.impl.DefaultUpdateCheckManager.checkArtifact(DefaultUpdateCheckManager.java:201)\r\n\tat org.eclipse.aether.internal.impl.DefaultArtifactResolver.gatherDownloads(DefaultArtifactResolver.java:586)\r\n\tat org.eclipse.aether.internal.impl.DefaultArtifactResolver.performDownloads(DefaultArtifactResolver.java:525)\r\n\tat org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolve(DefaultArtifactResolver.java:449)\r\n\t... 14 more\r\n",
"source": "Java",
"startLineNumber": 21,
"startColumn": 6,
"endLineNumber": 21,
"endColumn": 13
}]
这个错误信息表明,Maven 在执行 maven-dependency-plugin
插件的 copy
目标时遇到了问题,具体是因为 org.eclipse.sisu:org.eclipse.sisu.plexus:jar:0.3.0.M1
这个依赖项无法从 Maven 中央仓库下载,并且由于缓存的失败记录,Maven 在更新间隔时间内不会重新尝试下载。
这个文件在.m2\repository\org\eclipse\sisu\org.eclipse.sisu.plexus\0.3.0.M1这个位置,我之前搞错了一直在C:.m2\repository\org\eclipse\sisu\sisu-plexus这里找。
解决方法同样 是去https://repo1.maven.org/maven2/ 找到文件,下载后放到这个目录中即可。
4.3、空值分析
在打开过程中会提示
Null annotation types have been detected in the project. Do you wish to enable null analysis for this project?
这个我打开了。
4.4、import org.thingsboard.server.gen.transport 找不到
这个问题是这些类是有protobuf自动生成的,只要在idea下安装这个插件就好了
4.5、其他依赖的缺失
在配置中会发生很多的依赖下载问题,我建议你找个大语言模型,然后把错误贴给他,让他列出这个错误信息中所有的缺失的依赖。不然你一个个看太费眼了。