如何禁用Servlet 3.0扫描和自动加载组件

ben*_*rre 2 java spring tomcat servlets servlet-3.0

我们有一个应用程序,它继续从我们的第三方库中加载ServletContainerInitializer的实例.

一个实例是JerseyServletContainerInitializer,另一个是SpringServletContainerInitializer.来自Jersey和Spring的这些类似乎"接管"了我们的servlet上下文,弄乱了我们的映射和过滤器等等.

我们确实需要显式配置我们的servlet容器的web.xml,这种自动扫描让我们疯狂.通过简单地在pom.xml中引入依赖项,我们的运行时ServletContext配置(如Servlets/Filters/ContextListeners)会发生变异,因为servlet容器会在类路径中找到这些库.

有没有办法使用Servlet 3但禁用其恼人的自动类路径扫描"功能"?

Leo*_*ngs 10

来自https://wiki.apache.org/tomcat/HowTo/FasterStartUp

您可以在WEB-INF/web.xml文件中指定两个选项:

  • 在<web-app>元素上设置metadata-complete ="true"属性.
  • 添加一个空的<absolute-ordering />元素.

设置metadata-complete ="true"将禁止扫描Web应用程序及其库,以便使用注释来定义Web应用程序的组件(Servlet等).元数据完成选项不足以禁用所有注释扫描.如果存在带有@HandlesTypes注释的SCI,则Tomcat必须扫描应用程序以查找使用该注释中指定的注释或接口的类.

<absolute-ordering>元素指定必须扫描哪些Web片段JAR(根据其WEB-INF/web-fragment.xml文件中的名称)的SCI,片段和注释.空元素配置不扫描任何元素.

在Tomcat 7中,绝对排序选项会影响Web应用程序提供的SCI和容器提供的SCI(即$ CATALINA_HOME/lib中的库)的发现.在Tomcat中8的选项只影响Web应用程序的,而容器提供的SCI总是发现,无论绝对排序的.在这种情况下,单独的绝对排序选项不会阻止扫描注释,但是要扫描的JAR列表将为空,因此扫描将很快完成.无论绝对排序如何,始终扫描WEB-INF/classes中的类.

扫描Web应用程序资源和TLD扫描不受这些选项的影响.

  • 如果我禁用扫描,我可以明确指定运行我的WebApplicationInitializer类吗? (3认同)