如何防止 JSF 自动初始化?

How to prevent JSF from initializing automatically?

当我从头开始创建 Web 应用程序并将 jsf-api-2.2.11.jar 和 jsf-impl-2.2.11.jar 添加到 pom.xml(添加它们到应用程序类路径)并将其部署到 Tomcat 7,JSf 正在自动初始化:

INFO [j.e.r.w.j.config] - Mojarra 2.2.11 ( 20150505-0732 https://svn.java.net/svn/mojarra~svn/tags/2.2.11@14688) ..... initialized.

在旧版本中,我过去常常通过在 web.xml(侦听器+servlet)中定义它来声明地启动它。所以我已经将它们注释掉并将 "metadata-complete" 设置为 "true"(这甚至会停止类路径扫描吗?),但它仍在加载。

在这种情况下,我不想加载它,同时将 Jars 留在类路径中,即 faces-config.xml 在 web-inf.

什么仍在触发初始化?

它是通过 Servlet 3.0 加载的 ServletContainerInitializer implementation in the JSF implementation JAR file (in case of Mojarra, it's the com.sun.faces.config.FacesInitializer). It will auto-register the FacesServlet on the URL patterns *.jsf, *.faces and /faces/* (JSF 2.3 will add *.xhtml to the list of URL patterns). Latest JSF 2.1 implementations and all JSF 2.2 implementations will do it when deployed to a Servlet 3.0 compatible container. For detail about this new Servlet 3.0 ServletContainerInitializer thing, head to this answer: ServletContainerInitializer vs ServletContextListener

停止它的正确方法是从依赖项中删除 JSF 实现(请注意,您不需要也删除 JSF API)。您似乎没有以任何方式使用它。毕竟,正确设计的 Web 应用程序不应该具有任何 JSF 实现特定的依赖项。我只是想知道,你为什么要把 JSF API 留在里面?将第三方基于 JSF 的库用于非 JSF 目的?这可能表明并最终导致其他(架构)问题。

另一种阻止它的方法是将您的 Web 应用程序降级为 Servlet 2.5,方法是相应地编辑 web.xml 中的 <web-app> 根声明以符合该版本。但这有许多其他副作用,当打算开发与 Servlet 3.0 兼容的 Web 应用程序时,这些副作用可能是不可取的。


您提到的"listener"实际上不是必需的,它只是为了解决在解析TLD文件时出现时间错误的错误容器,例如早期的GlassFish v3和Jetty版本。另见 a.o。 Configuration of com.sun.faces.config.ConfigureListener.