JDK17 Groovy Caffeine 模塊化報錯分享

最近在升級各種依賴包的過程之總是能遇到一些Java模塊化的問題。Java模塊化是Java 9引入的一種新的特性,它將Java類庫劃分爲若干個模塊,每個模塊都具有自己的包和類。模塊化可以提高Java程序的安全性、可維護性和可移植性。

雖說如此,但是在升級JDK版本的過程中,總是會遇到各類相關的程序報錯。已經完成模塊化改造的依賴,無法兼容舊的項目,需要添加配置或者增加JVM啓動參數。

今天在使用Caffeine異步緩存的過程中遇到一個無法訪問匿名模塊的問題。

Caused by: java.lang.IllegalAccessException: module jdk.proxy2 does not open jdk.proxy2 to unnamed module @6107227e

下面發生問題的腳本內容:

static void main(String[] args) {  
    LoadingCache<String, String> cache = Caffeine.newBuilder()  
            .build(key -> {  
                return "FunTester";  
            });  
    String value = cache.get("FunTester");  
  
    System.out.println("緩存: " + value);  
}

詳細的報錯信息如下:

Caused by: java.lang.reflect.InvocationTargetException
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.codehaus.groovy.vmplugin.v9.Java9.of(Java9.java:160)
	... 23 more
Caused by: java.lang.IllegalAccessException: module jdk.proxy2 does not open jdk.proxy2 to unnamed module @6107227e
	at java.base/java.lang.invoke.MethodHandles.privateLookupIn(MethodHandles.java:259)
	... 28 more

按照報錯信息找到的解決方案是要麼進行模塊化改造,增加模塊配置信息,要麼增加JVM啓動參數類似:--add-opens jdk.proxy2/java.lang=ALL-UNNAMED 但是已經是匿名的了,實在找不到啓動命令改增加什麼。

然後就是升級依賴包,但當我把 Caffeine 升級到最新版之後發現依舊無用。然後就利用排除法鎖定了 Groovy 的版本,由於上次的 BUG 緣故,我停留在了 3.0.9 ,搜了一圈資料,決定升級新版本:

        <dependency>
            <groupId>org.apache.groovy</groupId>
            <artifactId>groovy</artifactId>
            <version>5.0.0-alpha-3</version>
        </dependency>

直接一步到位,升級到最新版本,沒想到都已經是5.x了。

真是虐我千百遍。Groovy多適合用來作爲腳本語言,真寫項目還是Java穩定。

去搜官網資料確認的時候發現,其實這個問題很早就被發現了,官方給的缺錢命名是非法方法動態代理(# [JDK16] Illegal access to dynamic proxy):https://issues.apache.org/jira/browse/GROOVY-10137。

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