当我从头开始创建 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 留在类路径中,即 web-inf 中的 faces-config.xml。
什么仍在触发初始化?
最佳答案
它是通过 Servlet 3.0 加载的 ServletContainerInitializer
JSF 实现 JAR 文件中的实现(对于 Mojarra,它是 com.sun.faces.config.FacesInitializer
)。它将自动注册 FacesServlet
关于 URL 模式 *.jsf
, *.faces
和 /faces/*
(JSF 2.3 会将 *.xhtml
添加到 URL 模式列表中)。最新的 JSF 2.1 实现和所有 JSF 2.2 实现都将在部署到 Servlet 3.0 兼容容器时执行此操作。有关此新 Servlet 3.0 的详细信息 ServletContainerInitializer
事情,前往这个答案:ServletContainerInitializer vs ServletContextListener .
停止它的正确方法是从依赖项中删除 JSF 实现(请注意,您不需要也删除 JSF API)。您似乎没有以任何方式使用它。毕竟,正确设计的 Web 应用程序不应该具有任何 JSF 实现特定的依赖项。我只是想知道,为什么要保留 JSF API?将第三方基于 JSF 的库用于非 JSF 目的?这可能表明并最终导致其他(架构)问题。
停止它的另一种方法是通过编辑 <web-app>
将您的 Web 应用程序降级为 Servlet 2.5 目标web.xml
中的根声明相应地遵守那个版本。但这会产生许多其他副作用,当打算开发与 Servlet 3.0 兼容的 Web 应用程序时,这些副作用可能是不可取的。
您所指的“监听器”实际上不是必需的,它只是为了解决在解析 TLD 文件时出现时间错误的错误容器,例如早期的 GlassFish v3 和 Jetty 版本。另见 a.o. Configuration of com.sun.faces.config.ConfigureListener .
关于jsf - 如何防止 JSF 自动初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30642575/