java 类文件具有错误的版本 61.0, 应为 52.0
接手一个旧项目报错:
E:\code_rhkj\battery\smart-battery-server\src\main\java\com\rihua\tech\websocket\WebSocketConfig.java:6:54
java: 无法访问org.springframework.web.socket.server.standard.ServerEndpointExporter
错误的类文件: /C:/Users/Administrator/.m2/repository/org/springframework/spring-websocket/7.0.0-M7/spring-websocket-7.0.0-M7.jar!/org/springframework/web/socket/server/standard/ServerEndpointExporter.class
类文件具有错误的版本 61.0, 应为 52.0
请删除该文件或确保该文件位于正确的类路径子目录中。
自动化部署工具
分析问题:调用的jar jdk版本和项目跑的jdk版本不一致
参考 https://wenku.csdn.net/answer/3fgn8w7mov
错误的类文件: Spring Pulsar 0.2.0类文件具有错误的版本 61.0, 应为 52.0
在使用 Spring Pulsar 0.2.0 版本时,如果遇到类文件版本不兼容的问题,例如提示“需要版本 52.0,但实际为 61.0”,这通常意味着运行环境中的 Java 版本与编译或构建该库时所使用的 Java 版本不兼容。Java 类文件的版本号对应不同的 JDK 版本:
- 类文件版本 52.0:JDK 8
- 类文件版本 61.0:JDK 17
这意味着 Spring Pulsar 0.2.0 构建时可能使用了 JDK 17(生成类版本 61.0),而当前运行环境中使用的是 JDK 8(仅支持到类版本 52.0)[^3]。
类文件具有错误的版本 61.0, 应为 52.0 :
调用的类jdk版本是 jdk17, 但是你实际项目用的jdk版本是 jdk1.8, 具体的类是spring-websocket/7.0.0-M7/spring-websocket-7.0.0-M7.jar!
代码5年前可以用,现在不能用,估计是pom.xml中包引入未指定版本,现在很多jar更新后,引入新的jdk17的包,导致不兼容
查看项目配置的jdk版本:是使用jdk1.8运行
项目pom.xml锁定了项目的jdk版本为1.8
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerArguments>
<bootclasspath>${env.JAVA_HOME}/jre/lib/rt.jar</bootclasspath>
</compilerArguments>
</configuration>
</plugin>

spring boot版本 2.1.3 非3.0以上 jdk1.8可以运行
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.3.RELEASE</version> </parent>
idea查看包jdk版本:
这个位置可以查看版本,看到是jdk17的版本

最后处理方式 修改pom.xml去掉jdk17包引入的地方:
项目整体运行的jdk版本是1.8. pom.xml里面添加引入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
这样引入的好处是自动化匹配绑定spring boot 版本, spring boot版本如下
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.3.RELEASE</version> </parent>
确认下载时低版本 时jdk1.8的 websocket 。 重新构架后不行
查看maven构建图

右键


spring-boot-starter-websocket 锁定的是5.1.5 但是 spirng-webscoket 改了版本号改成了7的版本。7的版本需要jdk17。
双击

进入

spring-webscoket未指定版本引入了jdk17的包
如果版本号不明确,如 RELEASE、LATEST 和 SNAPSHOT,Maven 就需要根据远程仓库更新策略来检查更新。 导致下载的版本过高 是jdk17的版本。 这个代码5年前可以运行但是现在不行了
其他参考ai maven配置jdk版本

maven配置jdk版本
在 Maven 中配置 JDK 版本主要通过以下几种方式实现:
1. 在 pom.xml 文件中指定
虽然直接在 pom.xml 中指定 JDK 版本不是一个常见的做法,因为 Maven 主要用于构建管理和依赖管理,而不是环境配置。但是,你可以通过配置插件来间接影响 JDK 版本,例如通过 maven-compiler-plugin 插件来指定编译时的 JDK 版本。
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version> <!-- 使用最新版本或你需要的版本 -->
<configuration>
<source>1.8</source> <!-- 源码使用的JDK版本 -->
<target>1.8</target> <!-- 目标JDK版本 -->
</configuration>
</plugin>
</plugins>
</build>
...
</project>
2. 在 settings.xml 文件中配置
在 Maven 的 settings.xml 文件中配置 JDK 版本通常不是必需的,因为 Maven 主要依赖于环境变量(如 JAVA_HOME)来识别 JDK 版本。你可以通过设置 JAVA_HOME 环境变量来指定 JDK 版本。
例如,在 Windows 上,你可以在命令行中设置:
set JAVA_HOME=C:\path\to\your\jdk1.8
在 Unix/Linux/Mac 上,你可以在 shell 中设置:
export JAVA_HOME=/path/to/your/jdk1.8
3. 使用 Maven Wrapper
使用 Maven Wrapper (mvnw 或 mvnw.cmd) 可以帮助确保使用正确的 JDK 版本。Maven Wrapper 是一个脚本,它会使用 .mvn/wrapper/maven-wrapper.properties 文件中的配置来指定 JDK 版本。虽然这不是直接配置 JDK 版本,但它确保了你的项目使用特定版本的 Maven 和 JDK。
例如,在 .mvn/wrapper/maven-wrapper.properties 中可以设置:
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip
这指定了 Maven 的下载 URL,但并不直接控制 JDK 版本。JDK 版本仍然通过 JAVA_HOME 环境变量控制。
4. 使用 IDE(如 IntelliJ IDEA 或 Eclipse)配置
如果你在使用 IDE,通常可以在 IDE 的设置中直接选择或配置 JDK 版本。例如,在 IntelliJ IDEA 中,你可以在 "File" -> "Project Structure" -> "Project" 中设置 "Project SDK"。这样 IDE 会使用指定的 JDK 版本来编译和运行你的项目。
结论
最推荐的方法是通过设置 JAVA_HOME 环境变量来控制全局的 JDK 版本,或者在使用 IDE 时直接在 IDE 中配置 JDK 版本。这样可以确保无论是命令行还是 IDE 都使用正确的 JDK 版本。在 Maven 的 pom.xml 中指定 JDK 版本主要用于插件配置,而不是环境变量设置。
最后总结
构建项目的时候 尽量使用 spring-boot-starter-xx 和spirng-boot 自动化绑定版本。
如果未使用 spring-boot-starter 的包引入则不要使用 RELEASE
版本号不明确,如 RELEASE、LATEST 和 SNAPSHOT,Maven 就需要根据远程仓库更新策略来检查更新。 导致下载的版本过高 是jdk17的版本。 这个代码5年前可以运行但是现在不行了
更多推荐
所有评论(0)