目前我正在開發一個使用 repast java 庫(repast.jar、colt.jar 和 trove.jar)的 java 專案。該專案在 jdk-11 上運行良好,但目前,我正在嘗試遷移到 jdk-17,但由于下一個例外,我無法運行該專案:
Exception in thread "main" java.lang.IllegalAccessError: class com.go.trove.classfile.AccessFlags tried to access private method 'void java.lang.reflect.Modifier.<init>()' (com.go.trove.classfile.AccessFlags is in unnamed module of loader 'app'; java.lang.reflect.Modifier is in module java.base of loader 'bootstrap')
at com.go.trove.classfile.AccessFlags.<init>(AccessFlags.java:75)
at com.go.trove.classfile.ClassFile.<init>(ClassFile.java:160)
at com.go.trove.classfile.ClassFile.<init>(ClassFile.java:138)
at uchicago.src.sim.util.ByteCodeBuilder.generateBasicAction(Unknown Source)
at uchicago.src.sim.engine.ActionUtilities.createActionFor(Unknown Source)
at uchicago.src.sim.engine.ScheduleBase.scheduleActionBeginning(Unknown Source)
at uchicago.src.sim.engine.ScheduleBase.scheduleActionBeginning(Unknown Source)
我記得讀到在最新版本的 java 中,反射 API 發生了一些變化。這會是一個可能的原因嗎?
知道如何解決它嗎?很難解決嗎?
非常感謝!
uj5u.com熱心網友回復:
是的 ...
Tea / Trove 專案是原始開發人員(迪士尼公司!)尚未維護的古老代碼。在https://github.com/teatrove/teatrove上的 Github 上有分叉......但自 2013 年以來也沒有任何活動。不樂觀。
至于你的問題。那么它似乎最初設計者決定把org.teatrove.trove.classfile.Modifiers的子類java.lang.reflect.Modifier。
問題是Modifier曾經有一個默認 public建構式……但在 Java 14 中,他們棄用了這個建構式(javadoc)。在 Java 17 中,現在有一個private無引數建構式。這意味著當 Trove 嘗試Modifiers在 Java 17 上創建實體時,它會因二進制兼容性錯誤而失敗。
解決此問題的一種方法是修改 Trove,使其Modifiers不再是Modifier. 我不知道這有多可行。可行性將取決于代碼庫是否利用Modifiers作為Modifier. 那是讓你去調查...
如果您采用這種方法,請做好公民并將您的更改作為針對 Github 上的“TeaTrove”代碼庫的拉取請求提交。
另一種方法是在您的應用程式中尋找 Trove 依賴項的替代品。同樣,在不知道您如何/為什么使用 Trove 的情況下,很難提出替代方案。
您的應用程式的依賴性可能是由于您使用了舊版本的 Repast。我找不到有關舊 Repast 版本的任何資訊……但這表明另一種方法是升級到較新的 Repast 版本(希望是1)避免對 Trove 的依賴。
最后,鑒于 Repast 開發人員仍然推薦 Java 11 用于最新版本的 Repast,您可以堅持下去。
1 - Repast 代碼庫不使用像 Maven 或 Gradle 這樣的現代構建工具,它們對依賴項采用宣告式方法2。相反,他們竊取了依賴 JAR 的副本并將它們放入他們的源代碼庫中。這使得依賴性分析變得困難。
2 - 見https://github.com/Repast/repast.simphony/issues/4
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/392761.html
標籤:爪哇 openjdk-17
