最近在学习 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">
复制代码
评论