Spring Boot(v2.7.2)打包Jar运行报java.lang.NoSuchMethodError异常
Spring Boot Jar运行出现java.lang.NoSuchMethodError(List.of方法)的解决方案
问题场景
在Eclipse中运行Spring Boot 2.7.2项目正常,但打包成Jar后在CMD运行时,代码第50行的List.of(role1, role2)抛出java.lang.NoSuchMethodError异常。
相关代码
@Override public void run(String... args) throws Exception { try { Role role1 = new Role(); role1.setId(AppConstants.ADMIN_USER); role1.setName("ROLE_ADMIN"); Role role2 = new Role(); role2.setId(AppConstants.NORMAL_USER); role2.setName("ROLE_NORMAL"); List<Role> roles = List.of(role1, role2); //@line 50 List<Role> result = this.roleRepo.saveAll(roles); result.forEach(r -> System.out.println(r.getName())); } catch (Exception e) { e.printStackTrace(); } }
报错截图

原因分析
List.of()是Java 9及以上版本新增的静态方法,若打包后运行Jar的JDK版本低于Java 9,就会触发该异常。Eclipse中运行正常,说明开发环境使用的是Java 9+,但打包或运行Jar时使用了更低版本的JDK。
解决方法
检查并升级运行环境JDK版本
打开CMD执行java -version,确认输出的版本号≥9。若低于9,升级JDK至9或更高版本(推荐Java 11,Spring Boot 2.7.x兼容Java 8-17)。统一项目编译和打包的JDK版本
在项目的pom.xml中明确指定JDK版本:<properties> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> </properties>Eclipse中右键项目 → 属性 → Java Build Path → 库,确认JRE系统库为Java 9+;再进入Java Compiler,勾选“使用模块路径上的执行环境'JavaSE-11'的合规性”(对应你选择的JDK版本)。
替换为Java 8兼容写法(若需保留Java 8运行)
将List.of(role1, role2)替换为Java 8支持的代码:// 可变列表 List<Role> roles = Arrays.asList(role1, role2); // 不可变列表(模拟List.of的效果) List<Role> roles = Collections.unmodifiableList(Arrays.asList(role1, role2));
内容的提问来源于stack exchange,提问作者Suhail Ansari
相关产品推荐
相关产品推荐

