【发布时间】:2021-11-22 16:59:34
【问题描述】:
我有一个 Spring Boot 应用程序在使用嵌入式 tomcat 运行时按预期工作,但我注意到如果我尝试从我在以前项目中使用的现有 tomcat 实例运行它,那么它会失败并出现 NoClassDefFoundError我在应用程序的任何地方都没有使用的类。
我注意到在 /lib 目录中我有一个包含几个 Spring 注释类的 jar,因此作为测试,我清理了 /lib 目录来解决问题。我的假设是 Spring 在类路径中看到了一些配置/beans/imports,因为它们存在于 /lib 目录中,并且要么尝试自行自动配置某些东西,要么实际上试图实例化其中的一些类。
那么我的问题是 - 假设我不能总是完全控制类路径上所有内容的内容,我该如何防止发生这样的错误?
编辑
更详细一点 - 未找到的类是 DefaultCookieSerializer,它是 spring-session-implementation 依赖项的一部分。它被拉入位于 /lib 的 jar 中的一个类中,但它不是我的应用程序的任何部分。
【问题讨论】:
-
完整的堆栈跟踪可能很有用...
-
@30thh - 当已知原因时,我看不出堆栈跟踪有什么帮助。 Spring 正在尝试基于在 tomcat /lib 目录中找到的类进行自动配置。这些类不是导致
NoClassDefFoundError的项目的依赖项。据我所知,我无法阻止 spring 从我的项目中拉入 tomcat /lib,我必须修改 tomcat 配置本身,导致这篇文章。 -
问题不是“是什么导致了这个问题”,而是“有什么好的解决方案可以防止这个问题的发生”。回顾我的帖子,这应该很明显,在这里为您粘贴相关的内容,希望您这次能阅读。
So then my question is - assuming I can't always fully control the contents of everything on the classpath, how can I prevent errors like this from occurring? -
对于 Spring 在服务器的类路径中拾取类没有通用的解决方案(参见例如 this question)。对于您的具体问题,可能有多种解决方案,但需要堆栈跟踪才能了解 Spring 为何尝试加载该类。
标签: java spring spring-boot spring-mvc tomcat