接手一个旧项目报错:

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
    请删除该文件或确保该文件位于正确的类路径子目录中。

自动化部署工具

4_集运维平台使用_哔哩哔哩_bilibili

分析问题:调用的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年前可以运行但是现在不行了 

  

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐