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