0

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

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

非常感谢!

4

1 回答 1

2

是的 ...

Tea / Trove 项目是原始开发人员(迪士尼公司!)尚未维护的古老代码。在https://github.com/teatrove/teatrove的 Github 上有 fork ...但自 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. 我不知道这有多可行。可行性将取决于代码库是否利用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.simpony/issues/4

于 2021-12-24T23:45:49.137 回答