Spring项目Linux正常Windows编译报错:无法实例化SpringApplicationRunListener
先明确你遇到的核心报错:
Exception in thread "main" java.lang.IllegalArgumentException: Cannot instantiate interface org.springframework.boot.SpringApplicationRunListener : org.springframework.boot.context.event.EventPublishingRunListener at org.springframework.boot.SpringApplication.createSpringFactoriesInstances(SpringApplication.java...
我之前在跨平台开发时也碰到过几乎一模一样的问题,本质上大多是Windows系统特性或者本地构建环境的差异导致的,给你几个亲测有效的排查方向:
清理本地依赖缓存
Windows的文件系统大小写不敏感,有时候Maven/Gradle下载依赖时会出现缓存损坏、依赖不全的情况。最简单的解决方式是:- 如果你用Maven:找到用户目录下的
.m2/repository文件夹,直接删除它,然后回到STS中执行mvn clean install -U强制更新依赖。 - 如果你用Gradle:删除用户目录下的
.gradle/caches文件夹,然后执行gradle clean build --refresh-dependencies。
- 如果你用Maven:找到用户目录下的
解决Windows路径长度限制
Windows默认的文件路径长度限制是260字符,而Spring Boot的依赖层级很深,很容易触发这个限制。解决方法二选一:- 启用Windows长路径支持:按下Win+R输入
regedit,找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem,修改LongPathsEnabled的值为1(如果没有就新建一个DWORD(32位)值),重启电脑后生效。 - 把项目移动到更短的路径下,比如从
C:\Users\YourFullName\Documents\Workspaces\SpringBootProjects\MyComplexApp改成C:\Apps\MyApp。
- 启用Windows长路径支持:按下Win+R输入
对齐STS与Linux的构建环境
检查STS的JDK和构建工具版本是否和Linux一致:- 打开STS的
Window > Preferences > Java > Installed JREs,确保使用的JDK版本(比如OpenJDK 17)和Linux上完全相同,不要混用Oracle JDK和OpenJDK。 - 检查Maven/Gradle配置:
Window > Preferences > Maven > Installations,确认STS使用的Maven版本和Linux一致,同时检查settings.xml的镜像、仓库配置是否和Linux端没有差异。
- 打开STS的
检查文件换行符和编码
跨平台的换行符差异(LF vs CRLF)偶尔会导致Spring Boot的配置文件或类文件解析异常:
右键项目选择Properties > Resource,在Text file encoding里设置编码为UTF-8,Line delimiter选择Unix and OS X (LF),然后点击Apply and Close,重新执行构建。确认STS与Spring Boot版本兼容
如果你的Spring Boot版本比较新(比如3.x),旧版本的STS可能不支持。可以打开STS的Help > Check for Updates,把STS更新到最新稳定版,或者查看Spring Boot官方文档确认对应的STS版本要求。
内容的提问来源于stack exchange,提问作者Przemysław Mateusz Buzałek

