jar包JDK版本降级

jar包JDK版本降级


当我们引入的jar包和本地的jdk版本有冲突的情况下,会报一下错误:

java.lang.UnsupportedClassVersionError:com/sun/tools/javac/Main : 
Unsupported major.minor version 51.0  //证明这个jar包是jdk7编译的,和本地jdk不兼容

我们知道Java是支持向后编译的,也就是说,在低版本(如JDK6)上编译的class文件或者jar文件可以在高版本上(如JDK8)上编译通过,但这并不意味着在JDK7上编译的class文件就可以在JDK5上顺利通过编译。为什么?因为高版本通常有很多低版本不支持的新特性。想想看,你能够在JDK5上编译含有lambda表达式或者Stream API的代码吗?当然不行。即便你没有使用那些低版本不支持的新特性,每个class文件都有一个major或者minor版本号,这是存在于Java编译器中的,并且和JDK的版本号是对应的,下面我们列出对应JRE的major版本号:

Java SE 8 = 52,
Java SE 7 = 51,
Java SE 6.0 = 50,
Java SE 5.0 = 49,
JDK 1.4 = 48,
JDK 1.3 = 47,
JDK 1.2 = 46,
JDK 1.1 = 45

我们可以发现Java8的major版本号是52,这就意味着如果你使用JDK8执行javac命令,将会默认生成一个major版本号为52的class文件,如果你使用JDK7运行这个class文件,你就会收到"Unsupported major.minor version 52.0"。

以上部分只是大概解释了,为什么会出现这样的错误,那么现在重点来了,实际的解决方案如下:
公司现有的项目是JDK6,我们需要导入新的jar包,但是它会与jdk6不兼容,所以要强制给jar依赖的jdk版本进行降级。使用一个工具Retrotranslator进行降级操作。
使用方法,如下所示,在dos窗口下执行命令

java -jar D:\retrotranslator-transformer-1.2.7.jar -srcjar F:\jar\jsoup\jsoup-1.11.1.jar -destjar F:\new-jsoup-jdk1.5.jar -embed com.cn.internal -target 1.5
要确定某个 JAR 所使用的 JDK 版本,可以通过多种方法进行检查,具体取决于 JAR 的类型和其含的内容。以下是几种常见的方法: ### 方法一:使用 `javap` 查看类文件的版本 JAR 中的 `.class` 文件含了 Java 字节码,其版本号与编译时所使用的 JDK 版本相关。可以使用 `javap` 工具来查看类文件的版本信息。执行以下命令: ```bash javap -v <类文件路径> | grep "major version" ``` 例如: ```bash javap -v MyClass.class | grep "major version" ``` 输出的 `major version` 对应 JDK 版本如下: | Major Version | JDK Version | |---------------|-------------| | 45 | 1.1 | | 46 | 1.2 | | 47 | 1.3 | | 48 | 1.4 | | 49 | 5.0 | | 50 | 6.0 | | 51 | 7.0 | | 52 | 8.0 | | 53 | 9.0 | | 54 | 10.0 | | 55 | 11.0 | | 56 | 12.0 | | 57 | 13.0 | | 58 | 14.0 | | 59 | 15.0 | | 60 | 16.0 | | 61 | 17.0 | | 62 | 18.0 | | 63 | 19.0 | | 64 | 20.0 | | 65 | 21.0 | ### 方法二:查看 `MANIFEST.MF` 文件 JAR 的 `MANIFEST.MF` 文件中可能含编译时使用的 JDK 信息。解压 JAR 文件后,进入 `META-INF` 目录并查看 `MANIFEST.MF` 文件。部分构建工具(如 Maven 或 Gradle)可能会在该文件中添加 `Build-Jdk` 字段,例如: ```plaintext Build-Jdk: 17.0.3 ``` 如果该字段存在,则可以直接从中获取 JDK 版本。 ### 方法三:使用 `jarsigner` 查看签名信息(适用于签名 JAR) 对于签名的 JAR 文件,可以使用 `jarsigner` 工具查看其签名信息,其中可能含编译环境的 JDK 版本: ```bash jarsigner -verify -verbose <JAR文件路径> ``` 在输出中查找 `Timestamp` 或 `Signer` 信息,有时可以找到 JDK 版本相关的线索。 ### 方法四:使用第三方工具 可以使用一些第三方工具(如 [JD-GUI](http://java-decompiler.github.io/) 或 [CFR Decompiler](https://www.benf.org/other/cfr/))反编译 JAR ,并查看其生成的源码中是否含特定的 JDK 特性,例如 `var` 关键字(JDK 10 引入)或 `switch` 表达式(JDK 12 引入)。通过这些特性可以推断出大致的 JDK 版本。 ### 方法五:运行 JAR 文件并查看运行时版本 如果 JAR 文件是一个可执行文件,可以通过以下命令运行它,并查看运行时使用的 JDK 版本: ```bash java -version ``` 然后运行 JAR 文件: ```bash java -jar yourfile.jar ``` 注意,这种方法只能确认 JAR 文件是否兼容当前运行的 JDK 版本,不能直接确认其编译时使用的 JDK 版本。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值