使用 repast 的项目中 jdk-17 上的 IllegalAccessError

IllegalAccessError on jdk-17 in a project using repast

目前我正在开发一个使用 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 发生了一些变化。这可能是原因吗?

知道如何解决吗?很难解决吗?

非常感谢!

是的...

Tea / Trove 项目是原始开发人员(迪士尼公司!)未维护的古老代码。在 https://github.com/teatrove/teatrove 的 Github 上有分叉……但自 2013 年以来也没有 activity。没前途。

关于你的问题。好吧,最初的设计者似乎决定让 org.teatrove.trove.classfile.Modifiers 成为 java.lang.reflect.Modifier.

的子类

问题是 Modifier 曾经有一个 default public 构造函数...但是在 Java 14 他们弃用了这个构造函数(javadoc)。在 Java 17 中现在有一个 private 无参数构造函数。这意味着当 Trove 尝试在 Java 17 上创建一个 Modifiers 实例时,它会因二进制兼容性错误而失败。

解决这个问题的一种方法是修改 Trove,使 Modifiers 不再是 Modifier 的子类。我不知道这有多可行。可行性将取决于代码库是否利用了 ModifiersModifier 的子类型这一事实。那将供您调查...

如果您采用这种方法,请做一个好公民并将您的更改作为对 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