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

2024-01-02 16:46:06 浏览数 (3)

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

java.lang.UnsupportedOperationException: PermittedSubclasses requires

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

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

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

排除旧依赖

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

代码语言:javascript复制
<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的编译插件版本过时导致。具体从哪个版本过时的没搞清楚,下面是我正常的配置。

依赖配置:

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

插件配置

代码语言:javascript复制
<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

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

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

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

代码语言:javascript复制
<configuration status="WARN" monitorInterval="30" shutdownHook="disable">

0 人点赞