Java、Groovy項目升級JDK 21 ASM9報錯

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章