最近在學習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">