JDK11 升级失败 - ClassNotFoundException jdk.internal.ref.Cleaner

Ish*_*raD 1 java jboss java-ee-6 java-11

我已将 Java EE 应用程序从 JDK 8 升级到 JDK 11。但是当我部署到 JBOSS EAP 7.3 服务器时,出现以下异常。

Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: jdk.internal.ref.Cleaner from [Module "deployment.DFNNTPOMS_X_X_3.003.000.00.0.ear" from Service Module Loader]
    at deployment.DFNNTPOMS_X_X_3.003.000.00.0.ear//net.openhft.chronicle.hash.impl.util.CleanerUtils.<clinit>(CleanerUtils.java:42)
    ... 63 more
Caused by: java.lang.ClassNotFoundException: jdk.internal.ref.Cleaner from [Module "deployment.DFNNTPOMS_X_X_3.003.000.00.0.ear" from Service Module Loader]
    at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:198)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:412)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:400)
    at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:116)
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Class.java:315)
    at deployment.DFNNTPOMS_X_X_3.003.000.00.0.ear//net.openhft.chronicle.hash.impl.util.CleanerUtils.<clinit>(CleanerUtils.java:35)
    ... 63 more
Run Code Online (Sandbox Code Playgroud)

有什么解决办法吗?

Ste*_*n C 5

您的代码应该使用java.lang.ref.Cleaner而不是jdk.internal.ref.Cleaner. 后者在 Java 9 中被删除:

如果“内部”类的使用Cleaner实际上来自第 3 方库代码,那么您需要将该库升级到 Java 11 兼容版本。

  • 框架作者似乎痴迷于使用内部 API。当我查看[此源代码](https://github.com/OpenHFT/Chronicle-Map/blob/23597364ba9b6c48055ba5fdbb5403d64d9f5dc1/src/main/java/net/openhft/chronicle/hash/impl/util/CleanerUtils.java# L33),我明白了,他们为 JDK 9+ 添加了一个分支。但他们并没有说“最后,我们有了一个官方 API,‘java.lang.ref.Cleaner’,我们可以使用”,而是说,“嘿,我发现我们仍然可以侵入一个内部非官方的东西”。但如果这有效,则表明该类并未真正被删除,这与错误报告相反。 (3认同)