java.lang.classnotfoundexception:升级库后的java.lang.constant.constable

70gysomp  于 2021-09-13  发布在  Java
关注(0)|答案(2)|浏览(435)

我有一个应用程序运行在Tomcat9.0.45和JDK11(OpenJDK11.0.11)中。
使用maven升级某些库(spring 4.3.30至5.3.9)后,应用程序会引发以下异常:

java.lang.NoClassDefFoundError: java/lang/constant/Constable
    at my.app.SomeClass.process(SomeClass.java:123) ~[classes/:?]
    at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) [spring-context-5.3.9.jar:5.3.9]
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) [?:?]
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) [?:?]
    at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) [?:?]
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) [?:?]
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [?:?]
    at java.base/java.lang.Thread.run(Thread.java:829) [?:?]
Caused by: java.lang.ClassNotFoundException: java.lang.constant.Constable
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1364) ~[catalina.jar:9.0.45]
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1187) ~[catalina.jar:9.0.45]
    ... 11 more

显然,它试图在jre 11环境中运行jre 12代码。
由于在更新库之前没有发生异常,我猜使用jre 12代码的项目中存在某种依赖性。
如何找出导致问题的库/依赖项?
webappclassloaderbase调试日志未提供任何新信息:

org.apache.catalina.loader.WebappClassLoaderBase.loadClass loadClass(java.lang.constant.Constable, false)
org.apache.catalina.loader.WebappClassLoaderBase.loadClass   Searching local repositories
org.apache.catalina.loader.WebappClassLoaderBase.findClass     findClass(java.lang.constant.Constable)
org.apache.catalina.loader.WebappClassLoaderBase.findClass     --> Returning ClassNotFoundException

奇怪的是,这个异常并没有发生在我的开发机器上,所以我也无法调试。
任何想法都非常感谢。

mctunoxg

mctunoxg1#

这个 Constable 接口(javadoc)仅在Java12中添加。
因此,您认为异常/堆栈跟踪是由尝试在Java11上运行Java12+代码引起的理论是正确的。
目前还不完全清楚为什么会发生这种情况。虽然spring的最新版本与Java16兼容。。。它们还应该在Java11(实际上是Java8)上运行。可能是spring团队搞砸了,运送了一些错误制造的jar。但我对此表示怀疑。
我怀疑您在构建代码时犯了错误。也许您使用Java12+工具链编译,而JavaSE12+运行时使用的是Java11的目标版本?

mpbci0fu

mpbci0fu2#

@斯蒂芬c指出了正确的方向——有些东西就是这样编译的。
结果表明,编译代码的机器没有安装Java11,而是安装了Java16。(尽管如此,它为Spring4.3.30编译了完全可运行的Java11代码。)
我已经从机器上删除了Java16,只安装了Java11。代码现在运行时不会抛出 ClassNotFoundException .
至于为什么会这样,我仍然不知道。

相关问题