[英]IllegalAccessError on jdk-17 in a project using repast
currently I am working on a java project that uses the repast java library (repast.jar, colt.jar and trove.jar). 该项目适用于 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 年以来也没有任何活动。 没有希望。
至于你的问题。 看来最初的设计者决定将java.lang.reflect.Modifier
org.teatrove.trove.classfile.Modifiers
的子类。
问题是Modifier
曾经有一个默认的public
构造函数……但在 Java 17 中,他们声明了一个私有的无参数构造函数……因此默认构造函数不再存在。 这意味着当 Trove 尝试创建一个Modifiers
实例时,它会失败。
解决此问题的一种方法是修改 Trove,使Modifiers
不再是Modifier
的子类。 我不知道这有多可行。 可行性将取决于代码库是否利用Modifiers
是Modifier
的子类型这一事实。 那是让你去调查...
如果您采用这种方法,请做一个好公民,并将您的更改作为拉取请求提交给 Github 上的“TeaTrove”代码库。
另一种方法是在您的应用程序中寻找 Trove 依赖项的替代品。 同样,在不知道您如何/为什么使用 Trove 的情况下,很难提出替代方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.