【问题标题】:Spring Boot Run Configuration IssuesSpring Boot 运行配置问题
【发布时间】:2015-06-08 07:08:44
【问题描述】:

我正在尝试在 STS 上的 tomcat8 容器中运行我的 Spring Boot 应用程序(通过 Run As -> Spring Boot Application),我收到以下错误:

Caused by: java.lang.IllegalStateException: Expected method not found: java.lang.NoSuchMethodException: org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedContext.addApplicationListener(org.apache.catalina.deploy.ApplicationListener)
at org.springframework.util.ClassUtils.getMethod(ClassUtils.java:627)
at org.springframework.boot.autoconfigure.websocket.TomcatWebSocketContainerCustomizer.addListener(TomcatWebSocketContainerCustomizer.java:85)
at org.springframework.boot.autoconfigure.websocket.TomcatWebSocketContainerCustomizer.access$100(TomcatWebSocketContainerCustomizer.java:36)
at org.springframework.boot.autoconfigure.websocket.TomcatWebSocketContainerCustomizer$1.customize(TomcatWebSocketContainerCustomizer.java:50)
at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.configureContext(TomcatEmbeddedServletContainerFactory.java:355)
at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.prepareContext(TomcatEmbeddedServletContainerFactory.java:184)
at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.getEmbeddedServletContainer(TomcatEmbeddedServletContainerFactory.java:154)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:157)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:130)
... 7 more

我已经搜索了很多,但几乎没有发现可以指导我找出问题所在。在调试器中查看 Spring Boot 代码后,我看到 TomcatWebSocketContainerCustomizer.addListener() 中引用的名为“instance”的对象使用反射来检索它的句柄。此对象与 tomcat 7.0.53 jar ($HOME/.m2/repository/org/apache/tomcat/tomcat-catalina/7.0.53/tomcat-catalina-7.0.53.jar) 相关联。我在我的任何 maven 依赖项中都没有看到这一点,并且尝试了几种技术来强制它到 tomcat 8.0.20,似乎没有任何效果。

敲了一阵子后,我开始在 STS 中查看项目的运行配置(通过运行方式 -> 运行配置)。我发现 Source 选项卡显示了高于版本 8.0.20 的 tomcat 7.0.53 以及 maven 中未引用的几个依赖项。我不知道这些值的来源,也不知道如何编辑它。出于某种原因,当我尝试手动删除这些遗留 jar 文件时,STS 不允许我删除它们中的任何一个。

是否有人知道这些依赖项可能来自何处以及如何删除它们?

它们确实引用了我的 $HOME/.m2/path/to/tomcat-catalina/<version> 目录,所以我可以简单地将它们从我的 .m2 中删除,理论上它可能会起作用,但如果我不必这样做,我宁愿不这样做。

我用的是spring boot 1.2.x,全都有这个问题。

谢谢。

【问题讨论】:

    标签: maven spring-boot m2e spring-tool-suite


    【解决方案1】:

    我有两个想法你可以试试。

    1) 这可能是 STS 3.6.4 中此错误的表现:https://issuetracker.springsource.com/browse/STS-4085

    您不希望看到的依赖可能来自 maven 的“测试”范围。 (该错误明确提到了“srt/test”,但 jar 依赖项也是如此)。您可以通过在主类上使用常规的“Run As Java Application”来验证此错误是否是原因。

    如果可行,那么几乎可以肯定是这个错误。如果它也因类似的错误而失败,那么它是别的东西......然后尝试:

    2) 您一定是从某个地方获取了不需要的 tomcat 版本,可能是间接依赖于其他东西。

    尝试使用 m2e 的“依赖层次”来查找它的来源,如下所示:

    • 打开 pom.xml
    • 单击“依赖层次结构”选项卡。
    • 在“过滤器”框中输入“tomcat”。

    【讨论】:

    • 我已经查看了所有的 maven 层次结构,除了 8.0.20(预期)之外,我没有看到对任何其他 tomcat 版本的引用。这个工作区非常老旧,可能有一些非常旧的配置正在导致这种情况,因为除了 tomcat 7.0.53 之外,我在该运行配置视图中看到了许多其他源依赖项。这些都没有在 Maven 中引用。我只是不知道在哪里可以弄清楚这些是从哪里来的。我尝试了很多递归 grep 都找不到。
    • 如果您认为运行配置是“旧垃圾”,不妨尝试将其删除。这并没有太大的危害,因为当您执行“运行方式>>启动应用程序”时它会再次创建。值得一试。
    • 您是否排除了它是 STS-4085 错误? (我无法从您的 cmets 看出您是否尝试过)。
    • 我会删除它,但我不确定配置的确切位置。我假设它存在于工作区中的某个地方,但是没有重新生成我的整个工作区,我不知道在哪里删除它。我试图删除运行配置并重新生成它,但这并没有摆脱这些讨厌的依赖关系。
    • 抱歉,忘记提及 STS-4085。我很确定情况并非如此,因为我的 Spring Boot 应用程序非常基础。我只有一个测试,唯一具有测试范围的 maven dep 是 spring-boot-starter-test。
    【解决方案2】:

    我终于明白了。

    在我的 $WORKSPACE/.metadata/.plugins/org.eclipse.m2e.core/workspacestate.properties 中,它列出了我使用 maven 插件构建的工作区中的所有 pom、jar 和 war。我注意到文件中的一个 pom 指向了我的 spring boot 项目中正在加载的确切版本的 tomcat。一旦我从我的 STS 中删除了这些项目,我就可以成功启动 spring boot 应用程序:-)

    当我将 maven 项目重新导入 STS 时,错误再次出现,然后在我删除它们时消失。

    这些项目与我尝试启动的项目无关。因此,我认为该错误在 m2e 中。

    我会提交一个错误并在完成后更新这篇文章。

    感谢@Kris 与我一起完成它。

    【讨论】:

    • 酷,您找到了解决方案。忽略我在另一个线程中发布的最后一个 cmets。当我写它们时,我还没有看到你找到解决方案。
    • 仅适用于任何登陆这里的人,他们可能通过固定的 STS 发现同样的问题。我们发现这里有一个 API 模块,它声明了我们的 Web 应用程序和 Spring Boot 应用程序之间的接口。主应用程序设置为部署到 STS 的 tcServer,然后出现在 API 模块的类路径中,然后由 Boot 应用程序继承,导致与上述相同的症状。解决方法是从共享模块的 Java 构建路径中删除 tcServer。
    猜你喜欢
    • 2017-12-01
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    • 1970-01-01
    • 2023-01-02
    • 1970-01-01
    • 2020-09-23
    • 2019-12-01
    相关资源
    最近更新 更多