查找哪个依赖项包含Spring WebApplicationInitializer

时间:2018-06-13 03:54:05

标签: java spring tomcat

我有一个包含各种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源代码中的消息匹配。从该源代码和文档中可以看出,

  • Tomcat将扫描类路径以查找实现WebApplicationInitializer的非抽象可构造类,并且SpringServletContainerInitializer将创建找到的每个类的实例。
  • 某些库或依赖项可能包含找到并实例化的WebApplicationInitializer。
  • Spring本身包含WebApplicationInitializers,但它们看起来都是抽象的。

我的代码没有WebApplicationInitializer。

问题:我想找到某个库中包含的初始化程序,以了解哪个库包含它。

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

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

  2. 破解项目,取消依赖项,直到WebApplicationInitializer消失。 (复)

  3. 是不是有更好(更快)的方式,即开启一定程度的日志记录?

    我已经尝试过Tomcat和Spring文档的一些详细的日志记录指令但没有成功。

    我将获得Tomcat源代码。当然,我会学到一些东西。

1 个答案:

答案 0 :(得分:0)

两种方法都有效。

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

    • Tomcat从Jasper,Tomcat自己的Websockets服务和public class HttpFactory : DefaultHttpClientFactory { public override HttpMessageHandler CreateMessageHandler() { return new CustomMessageHandler(); } } public class CustomMessageHandler : DelegatingHandler { protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { var content = await request.Content.ReadAsByteArrayAsync(); return await base.SendAsync(request, cancellationToken); } } FlurlHttp.Configure(settings => { settings.HttpClientFactory = new HttpFactory(); }); 处理了ServletContainerInitializers。 (预期/记录)
    • Tomcat从Jersey传递给SpringServletContainerInitializer一个名为SpringServletContainerInitializer的WebApplicationInitializer,假设你的类路径中有一个applicationContext.xml。
  2. 这给了我正在寻找的信息。

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

      • 这无需进一步准备,因为IntelliJ的全局搜索使用反射和Java反编译器的某种组合来读取库jar并查找用法,然后显示结果的反编译源代码。
      • 第一次显示反编译源时弹出的警告消息清除。
    2. 据我所知,Netbeans没有这种自动扫描加反编译选项来搜索依赖关系罐。

      如果你有IntelliJ,最快的答案是全局搜索。