错误的类文件: *** 类文件具有错误的版本 61.0, 应为 52.0 请删除该文件或确保该文件位于正确的类路径子目录中

news2025/1/12 0:11:50

一、问题


用maven对一个开源项目打包时,遇到了“错误的类文件: *** 类文件具有错误的版本 61.0, 应为 52.0 请删除该文件或确保该文件位于正确的类路径子目录中。”:

在这里插入图片描述

二、原因


原因是当前java环境是Java 8(版本52.0),但项目中依赖的某个类文件(比如上面的的org.eclipse.core.runtime.Plugin)是由Java 17(版本61.0)编译生成的,Java运行时环境只能运行与其自身版本相同或者更低版本编译的类文件。

下面来验证下,把有问题的jar解压一下:

jar -xvf org.eclipse.core.runtime-3.31.100.jar

把有报错这个类反编译一下:

javap -verbose org/eclipse/core/runtime/Plugin.class

可以看到这个类确实是由Java 17(版本61.0)编译生成的,反编译后的字节码指令中,major version的值是61:

  Last modified 2024-5-24; size 9363 bytes
  MD5 checksum b41961b4155bfdabeeb67952fdec406f
  Compiled from "Plugin.java"
public abstract class org.eclipse.core.runtime.Plugin implements org.osgi.framework.BundleActivator
  minor version: 0
  major version: 61
  flags: ACC_PUBLIC, ACC_SUPER, ACC_ABSTRACT
Constant pool:
    #1 = Class              #2            // org/eclipse/core/runtime/Plugin
    #2 = Utf8               org/eclipse/core/runtime/Plugin
    #3 = Class              #4            // java/lang/Object
    #4 = Utf8               java/lang/Object
    #5 = Class              #6            // org/osgi/framework/BundleActivator
    #6 = Utf8               org/osgi/framework/BundleActivator
    #7 = Utf8               PLUGIN_PREFERENCE_SCOPE
    
    省略……
    

记录一下每个版本的 Java 对应的类文件格式版本号major version(截止2024-07-18):

Java SE 1.1 = 45
Java SE 1.2 = 46
Java SE 1.3 = 47
Java SE 1.4 = 48
Java SE 5.0 = 49
Java SE 6.0 = 50
Java SE 7.0 = 51
Java SE 8.0 = 52
Java SE 9.0 = 53
Java SE 10 = 54
Java SE 11 = 55
Java SE 12 = 56
Java SE 13 = 57
Java SE 14 = 58
Java SE 15 = 59
Java SE 16 = 60
Java SE 17 = 61
Java SE 18 = 62
Java SE 19 = 63
Java SE 20 = 64

三、解决

那这个问题怎么解决呢?

1 . 升级当前环境的jdk版本,操作简单,但一般不太现实

2 . 降低对应依赖的版本

比如在我这个项目中,有问题(编译时Java版本太高)的包是org.eclipse.core.runtime,版本是3.31.100,那么就需要降低这个包的版本。大概有以下几种做法:

(1)如果项目中直接引用了这个包(比如在pom文件中定义了),那直接修改版本号就行(试着一点一点 降版本 -> 编译试试 -> 不行再降降版本 -> 再编译试试……)

(2)如果项目中没有直接引用这个包,那可以通过maven依赖树看下是哪个包引用的它,还是以我这个项目为例:

mvn dependency:tree -Dverbose 
[INFO] Scanning for projects...
[INFO] 
[INFO] ---------------------< org.jacoco:org.jacoco.core >---------------------
[INFO] Building JaCoCo :: Core 0.8.4
[INFO]   from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- dependency:2.2:tree (default-cli) @ org.jacoco.core ---
[INFO] org.jacoco:org.jacoco.core:jar:0.8.4
[INFO] +- org.ow2.asm:asm:jar:7.1:compile
[INFO] +- org.ow2.asm:asm-commons:jar:7.1:compile
[INFO] |  +- (org.ow2.asm:asm:jar:7.1:compile - omitted for duplicate)
[INFO] |  +- (org.ow2.asm:asm-tree:jar:7.1:compile - omitted for duplicate)
[INFO] |  \- org.ow2.asm:asm-analysis:jar:7.1:compile
[INFO] |     \- (org.ow2.asm:asm-tree:jar:7.1:compile - omitted for duplicate)
[INFO] +- org.ow2.asm:asm-tree:jar:7.1:compile
[INFO] |  \- (org.ow2.asm:asm:jar:7.1:compile - omitted for duplicate)
[INFO] +- org.eclipse.jdt:org.eclipse.jdt.core:jar:3.19.0:compile
[INFO] |  +- org.eclipse.platform:org.eclipse.core.resources:jar:3.20.200:compile
[INFO] |  |  +- org.eclipse.platform:org.eclipse.core.expressions:jar:3.9.400:compile
[INFO] |  |  |  \- (org.eclipse.platform:org.eclipse.core.runtime:jar:3.31.100:compile - omitted for duplicate)
[INFO] |  |  +- (org.eclipse.platform:org.eclipse.core.filesystem:jar:1.10.400:compile - omitted for duplicate)
[INFO] |  |  +- (org.eclipse.platform:org.eclipse.core.runtime:jar:3.31.100:compile - omitted for duplicate)
[INFO] |  |  \- org.eclipse.platform:org.eclipse.osgi:jar:3.20.0:compile
[INFO] |  +- org.eclipse.platform:org.eclipse.core.runtime:jar:3.31.100:compile
[INFO] |  |  +- (org.eclipse.platform:org.eclipse.osgi:jar:3.20.0:compile - omitted for duplicate)
[INFO] |  |  +- org.eclipse.platform:org.eclipse.equinox.common:jar:3.19.100:compile
[INFO] |  |  |  \- (org.eclipse.platform:org.eclipse.osgi:jar:3.20.0:compile - omitted for duplicate)
[INFO] |  |  +- org.eclipse.platform:org.eclipse.core.jobs:jar:3.15.300:compile
[INFO] |  |  |  +- (org.eclipse.platform:org.eclipse.equinox.common:jar:3.19.100:compile - omitted for duplicate)
[INFO] |  |  |  \- (org.eclipse.platform:org.eclipse.osgi:jar:3.20.0:compile - omitted for duplicate)
[INFO] |  |  +- org.eclipse.platform:org.eclipse.equinox.registry:jar:3.12.100:compile
[INFO] |  |  |  \- (org.eclipse.platform:org.eclipse.equinox.common:jar:3.19.100:compile - omitted for duplicate)
[INFO] |  |  +- org.eclipse.platform:org.eclipse.equinox.preferences:jar:3.11.100:compile
[INFO] |  |  |  +- (org.eclipse.platform:org.eclipse.equinox.common:jar:3.19.100:compile - omitted for duplicate)
[INFO] |  |  |  +- org.osgi:org.osgi.service.prefs:jar:1.1.2:compile
[INFO] |  |  |  |  \- org.osgi:osgi.annotation:jar:8.0.1:compile
[INFO] |  |  |  \- (org.eclipse.platform:org.eclipse.osgi:jar:3.20.0:compile - omitted for duplicate)
[INFO] |  |  +- org.eclipse.platform:org.eclipse.core.contenttype:jar:3.9.400:compile
[INFO] |  |  |  +- (org.eclipse.platform:org.eclipse.equinox.preferences:jar:3.11.100:compile - omitted for duplicate)
[INFO] |  |  |  +- (org.eclipse.platform:org.eclipse.equinox.registry:jar:3.12.100:compile - omitted for duplicate)
[INFO] |  |  |  +- (org.eclipse.platform:org.eclipse.equinox.common:jar:3.19.100:compile - omitted for duplicate)
[INFO] |  |  |  \- (org.eclipse.platform:org.eclipse.osgi:jar:3.20.0:compile - omitted for duplicate)
[INFO] |  |  \- org.eclipse.platform:org.eclipse.equinox.app:jar:1.7.100:compile
[INFO] |  |     +- (org.eclipse.platform:org.eclipse.equinox.registry:jar:3.12.100:compile - omitted for duplicate)
[INFO] |  |     \- (org.eclipse.platform:org.eclipse.equinox.common:jar:3.19.100:compile - omitted for duplicate)
[INFO] |  +- org.eclipse.platform:org.eclipse.core.filesystem:jar:1.10.400:compile
[INFO] |  |  +- (org.eclipse.platform:org.eclipse.equinox.common:jar:3.19.100:compile - omitted for duplicate)
[INFO] |  |  +- (org.eclipse.platform:org.eclipse.equinox.registry:jar:3.12.100:compile - omitted for duplicate)
[INFO] |  |  +- (org.eclipse.platform:org.eclipse.osgi:jar:3.20.0:compile - omitted for duplicate)
[INFO] |  |  \- (org.eclipse.platform:org.eclipse.core.runtime:jar:3.31.100:compile - omitted for duplicate)
[INFO] |  \- org.eclipse.platform:org.eclipse.text:jar:3.14.100:compile
[INFO] |     +- org.eclipse.platform:org.eclipse.core.commands:jar:3.12.100:compile
[INFO] |     |  \- (org.eclipse.platform:org.eclipse.equinox.common:jar:3.19.100:compile - omitted for duplicate)
[INFO] |     +- (org.eclipse.platform:org.eclipse.equinox.common:jar:3.19.100:compile - omitted for duplicate)
[INFO] |     +- (org.eclipse.platform:org.eclipse.equinox.preferences:jar:3.11.100:compile - omitted for duplicate)
[INFO] |     \- (org.eclipse.platform:org.eclipse.core.runtime:jar:3.31.100:compile - omitted for duplicate)
[INFO] \- org.eclipse.jgit:org.eclipse.jgit:jar:5.5.0.201909110433-r:compile
[INFO]    +- com.jcraft:jsch:jar:0.1.55:compile
[INFO]    +- com.jcraft:jzlib:jar:1.1.1:compile
[INFO]    +- com.googlecode.javaewah:JavaEWAH:jar:1.1.6:compile
[INFO]    +- org.slf4j:slf4j-api:jar:1.7.2:compile
[INFO]    +- org.bouncycastle:bcpg-jdk15on:jar:1.61:compile
[INFO]    |  \- (org.bouncycastle:bcprov-jdk15on:jar:1.61:compile - omitted for duplicate)
[INFO]    +- org.bouncycastle:bcprov-jdk15on:jar:1.61:compile
[INFO]    \- org.bouncycastle:bcpkix-jdk15on:jar:1.61:compile
[INFO]       \- (org.bouncycastle:bcprov-jdk15on:jar:1.61:compile - omitted for duplicate)
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  1.700 s
[INFO] Finished at: 2024-07-18T22:08:14+08:00
[INFO] ------------------------------------------------------------------------

通过依赖树可以发现,在项目(pom文件)中是org.eclipse.jdt.core引用了它,并且org.eclipse.jdt.core的版本是3.19.0,那可以试着降低org.eclipse.jdt.core的版本号,比如3.18.0、3.17.0……

但是,也有可能org.eclipse.jdt.core很多个版本依赖的都是同一个有问题的版本,比如3.19.0和3.18.0这两个版本的org.eclipse.jdt.core 依赖的org.eclipse.core.runtime的版本是号都是3.31.100的,这时也可以直接用依赖管理dependencyManagement和依赖排除来强制指定org.eclipse.core.runtime的版本,比如在pom文件中强制指定org.eclipse.core.runtime的版本(我在https://mvnrepository.com/中把org.eclipse.core.runtime所有的版本号都试了一下,最终找到3.22.0版本是Java 8编译的):

直接用依赖管理强制指定版本:

<dependencies>
    <dependency>
        <groupId>org.eclipse.jdt</groupId>
        <artifactId>org.eclipse.jdt.core</artifactId>
        <version>3.19.0</version>
    </dependency>
</dependencies>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.eclipse.platform</groupId>
            <artifactId>org.eclipse.core.runtime</artifactId>
            <version>3.22.0</version>
        </dependency>
    </dependencies>
</dependencyManagement>

或者先排除,再引入:

<dependencies>
    <dependency>
        <groupId>org.eclipse.jdt</groupId>
        <artifactId>org.eclipse.jdt.core</artifactId>
        <version>3.19.0</version>
        <exclusions>
            <exclusion>
                <groupId>org.eclipse.platform</groupId>
                <artifactId>org.eclipse.core.runtime</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.eclipse.platform</groupId>
        <artifactId>org.eclipse.core.runtime</artifactId>
        <version>3.22.0</version>
    </dependency>
</dependencies>

四、总结


上面的包名长得都很像,写的我都晕了,画个图总结下。假如用B来表示一个maven依赖,编译时,如果报错信息提示编译B的java版本太高(假如B就是文章开头图中提示报错的包org.eclipse.core.runtime)
(1)如果项目中直接引用了B,可以直接降低B的版本
在这里插入图片描述

(2)如果项目中是有一个依赖A引用了B
可以试着一点一点降低A的依赖:
在这里插入图片描述

也可以直接用依赖管理dependency management和依赖排除来强制指定B的版本:
在这里插入图片描述

转载请注明出处《错误的类文件: *** 类文件具有错误的版本 61.0, 应为 52.0 请删除该文件或确保该文件位于正确的类路径子目录中 》 https://blog.csdn.net/huyuyang6688/article/details/140532981

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2275189.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【大模型入门指南 07】量化技术浅析

【大模型入门指南】系列文章&#xff1a; 【大模型入门指南 01】深度学习入门【大模型入门指南 02】LLM大模型基础知识【大模型入门指南 03】提示词工程【大模型入门指南 04】Transformer结构【大模型入门指南 05】LLM技术选型【大模型入门指南 06】LLM数据预处理【大模型入门…

在线工具箱源码优化版

在线工具箱 前言效果图部分源码源码下载部署教程下期更新 前言 来自缤纷彩虹天地优化后的我爱工具网源码&#xff0c;百度基本全站收录&#xff0c;更能基本都比较全&#xff0c;个人使用或是建站都不错&#xff0c;挑过很多工具箱&#xff0c;这个比较简洁&#xff0c;非常实…

@LocalBuilder装饰器: 维持组件父子关系

一、前言 当开发者使用Builder做引用数据传递时&#xff0c;会考虑组件的父子关系&#xff0c;使用了bind(this)之后&#xff0c;组件的父子关系和状态管理的父子关系并不一致。为了解决组件的父子关系和状态管理的父子关系保持一致的问题&#xff0c;引入LocalBuilder装饰器。…

C 语言内存探秘:数据存储的字节密码

文章目录 一、数据在内存中的存储1、基本数据类型存储2、数组存储3、结构体存储1、基本存储规则2、举例说明3、查看结构体大小和成员偏移量的方法 二、大小端字节序三、字节序的判断 一、数据在内存中的存储 1、基本数据类型存储 整型&#xff1a;如int类型&#xff0c;通常在…

双因素身份验证技术在NPI区域邮件安全管控上的解决思路

在制造业中&#xff0c;NPI&#xff08;New Product Introduction&#xff0c;新产品导入&#xff09;区域是指专门负责新产品从概念到市场推出全过程的部门或团队。NPI 的目标是确保新产品能够高效、高质量地投入生产&#xff0c;并顺利满足市场需求。在支撑企业持续创新和竞争…

浙江安吉成新的分布式光伏发电项目应用

摘 要&#xff1a;分布式光伏发电站是指将光伏发电组件安装在用户的建筑物屋顶、空地或其他适合的场地上&#xff0c;利用太阳能进行发电的一种可再生能源利用方式&#xff0c;与传统的大型集中式光伏电站相比&#xff0c;分布式光伏发电具有更灵活的布局、更低的建设成本和更高…

更新Office后,LabVIEW 可执行程序生成失败

问题描述&#xff1a; 在计算机中&#xff0c;LabVIEW 开发的源程序运行正常&#xff0c;但在生成可执行程序时提示以下错误&#xff1a; ​ A VI broke during the build process from being saved without a block diagram. Either open the build specification to include…

mysql-operator容器化部署mysql8

基础组件容器化 前一段时间容器化了容器的s3和pika。由于已经有开源方案&#xff0c;本次mysql直接以operator容器化。使用的是[presslabs的mysql-operator]https://github.com/presslabs/mysql-operator。 主要特征 presslabs/mysql-operator自动化搭建主从集群。使用XtraBack…

web-app uniapp监测屏幕大小的变化对数组一行展示数据作相应处理

web-app uniapp监测屏幕大小的变化对数组一行展示数据作相应处理 1.uni.getSystemInfoSync().screenWidth; 获取屏幕宽度 2.uni.onWindowResize&#xff08;&#xff09; 实时监测屏幕宽度变化 3.根据宽度的大小拿到每行要展示的数量itemsPerRow 4.为了确保样式能够根据 items…

[OPEN SQL] 限定选择行数

本次操作使用的数据库表为SCUSTOM&#xff0c;其字段内容如下所示 航班用户(SCUSTOM) 该数据库表中的部分值如下所示 指定查询多少行数据&#xff0c;我们可以使用语法UP TO n ROWS来实现对数据前n项的查询 语法格式 SELECT * FROM <dbtab> UP TO n ROWS 参数说明 db…

金融项目实战 02|接口测试分析、设计以及实现

目录 ⼀、接口相关理论 二、接口测试 1、待测接口&#xff1a;投资业务 2、接口测试流程 3、设计用例理论 1️⃣设计方法 2️⃣工具 4、测试点提取 5、测试用例&#xff08;只涉及了必测的&#xff09; 1️⃣注册图⽚验证码、注册短信验证码 2️⃣注册 3️⃣登录 …

74 mysql having 的实现

前言 这里 我们主要是 看一下 having 的相关实现 having 经常是配合 group by 这边进行使用, 进行一个基于 group by 之后的结果的一个, 条件限定 我们这里 以最简单的 group by having 来进行调试, 他会分为 两个阶段, 一个阶段是 group by 之后的结果输出到临时表, 另外…

Google发布图像生成新工具Whisk:无需复杂提示词,使用图像和人工智能将想法可视化并重新混合

Whisk 是 Google Labs 的一项新实验&#xff0c;可使用图像进行快速而有趣的创作过程。Whisk不会生成带有长篇详细文本提示的图像&#xff0c;而是使用图像进行提示。只需拖入图像&#xff0c;即可开始创建。 whisk总结如下&#xff1a; Whisk 是 Google 实验室最新的生成图像实…

K8s Pod OOMKilled,监控却显示内存资源并未打满

1. 问题现象 pod一直重启&#xff0c;通过grafana查看&#xff0c;发现内存使用率并没有100%。 2. 排查过程 2.1 describe查看pod最新一次的状态 可以明显看到&#xff0c;最近一次的重启就是因为内存不足导致的。 2.2 describe 查看node节点状态 找到原因了&#xff0c;原来…

33.3K 的Freqtrade:开启加密货币自动化交易之旅

“ 如何更高效、智能地进行交易成为众多投资者关注的焦点。” Freqtrade 是一款用 Python 编写的免费开源加密货币交易机器人。它就像一位不知疲倦的智能交易助手&#xff0c;能够连接到众多主流加密货币交易所&#xff0c;如 Binance、Bitmart、Bybit 等&#xff08;支…

vscode开启调试模式,结合Delve调试器调试golang项目详细步骤

1.前期准备 (1).在vs code中的扩展程序中搜索并安装Go扩展程序 (2).安装 Delve 调试器 go install github.com/go-delve/delve/cmd/dlvlatest (3).打开vs code的命令面板&#xff0c;输入Go: Install/Update Tools&#xff0c;并单击该命令执行&#xff0c;安装或更新Go语…

Postman接口测试03|执行接口测试、全局变量和环境变量、接口关联、动态参数、断言

目录 七、Postman 1、安装 2、postman的界面介绍 八、Postman执行接口测试 1、请求页签 3、响应页签 九、Postman的环境变量和全局变量 1、创建环境变量和全局变量可以解决的问题 2、postman中的操作-全局变量 1️⃣手动设置 2️⃣代码设置 3️⃣界面获取 4️⃣代…

Python Matplotlib教程-Matplotlib 多子图布局

Python Matplotlib 多子图布局 Matplotlib 是 Python 中最常用的数据可视化库&#xff0c;它提供了强大的功能来绘制不同类型的图表。在实际应用中&#xff0c;通常需要将多个图表绘制在同一个画布上&#xff0c;这就需要用到 多子图布局。本篇文章将详细介绍如何使用 Matplot…

【Java项目】基于SpringBoot的【校园新闻系统】

【Java项目】基于SpringBoot的【校园新闻系统】 技术简介&#xff1a;本系统使用采用B/S架构、Spring Boot框架、MYSQL数据库进行开发设计。 系统简介&#xff1a;主要包括二大功能模块&#xff0c;即用户功能模块和管理员功能模块。系统中的核心用户是管理员&#xff0c;管理员…

c++入门之 命名空间与输入输出

1、命名空间 1.1使用命名空间的原因 先看一个例子&#xff1a; #include <iostream>int round 0;int main() {printf("%d", round);return 0; }请问&#xff0c;这个程序能跑起来吗&#xff1f; 答案是否定的 原因是&#xff0c;当我们想创建一个全局变量 …