使用 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
的子类。我不知道这有多可行。可行性将取决于代码库是否利用了 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
目前我正在开发一个使用 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
的子类。我不知道这有多可行。可行性将取决于代码库是否利用了 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