写点什么

Java、Groovy 项目升级 JDK 21 ASM9 报错

作者:FunTester
  • 2023-12-27
    河北
  • 本文字数:2065 字

    阅读完需:约 7 分钟

最近在学习 Java 虚拟线程,打算深挖一下性能测试方面的潜力。不过在升级 JDK 的过程中遇到了一些意外情况。遇到了一个比较难缠的问题,报错信息如下:


java.lang.UnsupportedOperationException: PermittedSubclasses requires


看报错信息,应该缺少了一些依赖包。通过查证,改异常表示项目使用的库中需要使用了一个需要支持 JDK 9 的 ASM 版本,但是现在没有。


ASM 是一个 Java 字节码操作和分析库,它用于在 Java 字节码级别操作类文件。通常情况下,这种异常可能是由于库的兼容性问题造成的,其中使用了不匹配的 ASM 版本。


有了问题的原因,我们来一步步排除问题。

排除旧依赖

首先我们得排除旧版本的依赖。我是用的 Maven-helper 插件,通过搜索 asm 相关依赖,然后再使用 excludes 语法排除旧版本的依赖。如果这个办法奏效,那么太恭喜了。否则你还需要引入新版本的依赖:


<dependency>    <groupId>org.ow2.asm</groupId>    <artifactId>asm</artifactId>    <version>9.2</version> <!-- 使用一个支持的 ASM 版本 --></dependency>
复制代码


根据我自己的经验,不是必须的,我猜是一些依赖的库已经包含了相关的依赖,所以不用我再重新添加依赖配置。

升级相关库版本

这个步骤依然是为了解决版本的问题,因为我发现自己用到的 JsonPath 库用了一个非常早版本的 ASM 版本。按照上面步骤操作之后依然无法解决,所以升级了最新版本。然后再使用 Maven-helper 查看 ASM 依赖包的时候就发现已经没有问题了。

检查 Groovy 及插件

当我感觉要成功的时候,发现还是不行。当我仔细检查了所有配置发现还是不行。只能继续去互联网求助了,当我把搜索关键字加上 Groovy 之后有了收获,原来是我 Groovy SDK 版本以及 Maven-Groovy 的编译插件版本过时导致。具体从哪个版本过时的没搞清楚,下面是我正常的配置。


依赖配置:


        <dependency>            <groupId>org.codehaus.groovy</groupId>            <artifactId>groovy</artifactId>            <version>3.0.19</version>        </dependency>
复制代码


插件配置


<plugins>            <plugin>                <groupId>org.apache.maven.plugins</groupId>                <artifactId>maven-dependency-plugin</artifactId>                <version>3.0.1</version>                <executions>                    <execution>                        <id>copy-dependencies</id>                        <phase>package</phase>                        <goals>                            <goal>copy-dependencies</goal>                        </goals>                        <configuration>                            <outputDirectory>${project.build.directory}/lib</outputDirectory>                            <overWriteReleases>false</overWriteReleases>                            <overWriteSnapshots>false</overWriteSnapshots>                            <overWriteIfNewer>true</overWriteIfNewer>                        </configuration>                    </execution>                </executions>            </plugin>
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.4</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <filters> <filter> <artifact>*:*</artifact> <excludes> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> <exclude>META-INF/*.RSA</exclude> </excludes> </filter> </filters> </configuration> </execution> </executions> </plugin>
</plugins>
复制代码

log4j shutdownHook error

当我终于要完成任务的时候,发现了一个额外的报错:


WARN StatusConsoleListener Unable to register Log4j shutdown hook because JVM is shutting down. Using SimpleLogger
复制代码


经过一些搜索,发现这是一个不必要处理的异常,因为是升级之后才有的,所以也归于 JDK 升级的坑里面。解决方法 log4j2 配置文件中增加属性即可,如下:


<configuration status="WARN" monitorInterval="30" shutdownHook="disable">
复制代码


发布于: 刚刚阅读数: 5
用户头像

FunTester

关注

公众号:FunTester,800篇原创,欢迎关注 2020-10-20 加入

Fun·BUG挖掘机·性能征服者·头顶锅盖·Tester

评论

发布
暂无评论
Java、Groovy项目升级JDK 21 ASM9报错_FunTester_InfoQ写作社区