您的当前位置:首页正文

关于32.0.0-jre版本的Guava版本是否兼容1.8版本的jdk问题

2024-11-22 来源:个人技术集锦

在个依赖升级的过程中,snyk建议我将guava升级到32.0.0-jre这个版本,最后测试出来这个版本的guava只能部分兼容jdk1.8;

查看guava版本兼容jdk的版本,可以通过以下方式

1.windows下,按win+r输入cmd进入;

cd C:\path\to\your\jar

C:\path\to\your\jar 替换为包含 Guava JAR 文件的实际路径。

3.解压 JAR 文件: 使用 jar 命令(Java SDK 自带)解压 JAR 文件:

jar xf guava-32.0.0-jre.jar

注意:确保你已经安装了 Java JDK,并且 jar 命令可以在命令提示符中使用;

4.在第三步完成之后,需要去检查类文件版本;去验证其中的类文件是否是用 JDK 11 或更高版本编译的;

方法如下:

com/google/common/util/concurrent/SettableFuture.class

2.运行javap命令:使用 javap -verbose 查看该类文件的版本信息。在命令行中执行以下命令:

javap -verbose com/google/common/util/concurrent/SettableFuture.class | findstr "major version"

需要注意的是,路径需要换成你的实际路径;

其中

  • javap -verbose:反编译类文件并显示详细信息。
  • findstr "major version":过滤输出,只显示类文件的 "major version"

3.输出的版本号

ps:这个是我在确认32.0.0-jre时得到的结果,结合我的实际情况表明,

Guava 库中部分类保持了向后兼容:Guava 库可能将一些类(特别是核心工具类或不依赖新特性或模块的类)编译为 JDK 8 兼容的字节码(major version 52),以便与更广泛的 Java 版本兼容。这意味着 Guava 的一部分代码仍然可以在 JDK 8 上运行。

 minor version: 0
  major version: 52
  • major version 52:表示类文件是用 JDK 8 编译的,兼容 JDK 1.8。
  • major version 55:表示类文件是用 JDK 11 编译的,不兼容 JDK 1.8。
  • major version 57:表示类文件是用 JDK 13 编译的,依此类推。

最后我将guava 32.0.0-jre回退到了guava 30.1.1-jre版本;

@data 2024-11-12

如果是引入guava中的一个依赖项,可以这么做

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>listenablefuture</artifactId>
    <version>9999.0-empty-to-avoid-conflict-with-guava</version>
</dependency>

其中,9999.0-empty-to-avoid-conflict-with-guava这个是guava的特殊空版本只包含 listenablefuture,这样可以避免引入整个 Guava 库的其他功能,同时保留 listenablefuture

还有一个就是引入所需要的guava版本,然后排除不需要的依赖项,这样也是可以的;

ps:自己学习的一些记录,为自己参考;

显示全文