首页 > 解决方案 > 查找包含 Spring WebApplicationInitializer 的依赖项

问题描述

我有一个包含各种 Spring 依赖项的项目。

    'org.springframework:spring-core:4.3.2.RELEASE',
    'org.springframework:spring-jdbc:4.3.2.RELEASE',
    'org.springframework:spring-beans:4.3.2.RELEASE',
    'org.springframework:spring-web:4.3.2.RELEASE'

...以及许多其他依赖项。

当我将它部署到 Tomcat 8.5.8 时,我看到了这条消息......

1 Spring WebApplicationInitializers detected on classpath

该消息与SpringServletContainerInitializer.java的 spring-framework 源代码中的消息相匹配从该源代码和文档看来,

我的代码没有 WebApplicationInitializer。

问题:我想找到某个库包含的 Initializer,以了解包含它的库。

想到的方法是......

  1. 获取 Spring-Framework 或 Tomcat 源代码。在 SpringServletContainerInitializer 或 Tomcat 的 ContextConfig 类中放置一个断点,并检查找到和使用了哪些类。

  2. 破解项目,移除依赖项,直到 WebApplicationInitializer 消失。(复杂的)

有没有更好(更快)的方法,即开启某种程度的日志记录?

我从 Tomcat 和 Spring 文档中尝试了一些详细的日志记录说明,但没有成功。

我将获得 Tomcat 源代码。我肯定会学到一些东西。

标签: javaspringtomcat

解决方案


有两种方法奏效。

  1. 获取tomcat、spring-framework、jersey的源码并在Netbeans中调试启动过程....发现

    • Tomcat 处理来自 Jasper 的 ServletContainerInitializers、Tomcat 自己的 Websockets 服务和SpringServletContainerInitializer. (预期/记录)
    • Tomcat 将来自 Jersey 的 WebApplicationInitializer 传递给 SpringServletContainerInitializer,org.glassfish.jersey.server.spring.SpringWebApplicationInitializer在我的例子中假设您的类路径中有一个 applicationContext.xml。

这给了我我正在寻找的信息。

  1. 根据 M Deinum 的评论,我尝试将我的项目导入 IntelliJ 并为 WebApplicationInitializer 进行全局搜索(Mac 上的 shift-shift)。

    • 这无需进一步准备即可工作,因为 IntelliJ 的全局搜索使用反射和它们的 Java 反编译器的某种组合来读取库 jar 并查找用法,然后显示结果的反编译源代码。
    • 第一次显示反编译源时弹出的警告信息很清楚。

据我所知,Netbeans 没有用于搜索依赖 jar 的自动扫描和反编译器选项。

如果你有 IntelliJ,最快的方法是全局搜索。


推荐阅读