我有一个包含各种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源代码中的消息匹配。从该源代码和docs看来,很明显
Tomcat将在类路径中扫描实现WebApplicationInitializer的非抽象可构造类,并且SpringServletContainerInitializer将为找到的每个类创建一个实例。
一些库或依赖项可能包括找到并实例化的WebApplicationInitializer。
Spring本身包含WebApplicationInitializers,但它们似乎都是Abstract。
我的代码没有WebApplicationInitializer。
问:我想找到某些库包含的Initializer,以了解包含哪个库。
我想到的方法是...
获取Spring-Framework或Tomcat源代码。在SpringServletContainerInitializer或Tomcat的ContextConfig类中放置一个断点,并检查找到并使用了哪些类。
修改项目,删除依赖项,直到WebApplicationInitializer消失。 (复杂)
是否有更好的(快速)方法,即打开某种级别的日志记录?
我尝试了一些来自Tomcat和Spring文档的详细日志记录说明,但均未成功。
我将获得Tomcat源。我一定会学到一些东西。
最佳答案
有两种方法有效。
获取tomcat,spring-framework,jersey的源代码并在Netbeans中调试启动过程....发现
Tomcat通过Jasper,Tomcat自己的Websockets服务和SpringServletContainerInitializer
处理了ServletContainerInitializers。 (预期/已记录)
Tomcat将来自泽西岛的WebApplicationInitializer传递给SpringServletContainerInitializer,该WebApplicationInitializer称为org.glassfish.jersey.server.spring.SpringWebApplicationInitializer
,在本例中,假定您的类路径上有applicationContext.xml。
这给了我我想要的信息。
基于M Deinum的评论,我尝试将项目导入IntelliJ并针对WebApplicationInitializer进行全局搜索(在Mac上为shift-shift)。
这不需要进一步准备,因为IntelliJ的全局搜索使用了反射和Java反编译器的某种组合来读取库jar和查找用法,然后显示结果的反编译源代码。
第一次显示反编译源时弹出的警告消息使其清晰可见。
据我所知,Netbeans没有此自动扫描加反编译器选项来搜索依赖项jar。
如果您拥有IntelliJ,最快的答案就是全局搜索。