[英]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(listener + servlet)中进行定义来声明地启动它。 因此,我已经将它们注释掉,并将“元数据完成”设置为“ true”(这是否甚至停止了类路径扫描?),但是它仍在加载。
在这种情况下,我不想加载它,而将Jars保留在classpath中,即将faces-config.xml保留在web-inf中。
什么仍然触发初始化?
它是通过JSF实现JAR文件中的Servlet 3.0 ServletContainerInitializer
实现加载的(对于Mojarra,它是com.sun.faces.config.FacesInitializer
)。 它将在URL模式*.jsf
, *.faces
和/faces/*
上自动注册FacesServlet
(JSF 2.3会将*.xhtml
添加到URL模式列表中)。 最新的JSF 2.1实现和所有JSF 2.2实现将在部署到Servlet 3.0兼容容器中时实现。 有关这个新的Servlet 3.0 ServletContainerInitializer
的详细信息,请转到此答案: ServletContainerInitializer与ServletContextListener 。
停止它的正确方法是从依赖项中删除JSF实现(请注意,您也不需要删除JSF API)。 您似乎没有以任何方式使用它。 毕竟,正确设计的Web应用程序不应具有任何JSF实现特定的依赖关系。 我只想知道,为什么还要保留JSF API? 将基于第三方JSF的库用于非JSF用途? 这可能表明并最终导致其他(建筑)问题。
阻止它的另一种方法是通过相应地编辑web.xml
的<web-app>
根声明来将您的Web应用程序降级为Servlet 2.5。 但是,这还有许多其他副作用,如果要开发与Servlet 3.0兼容的Web应用程序,这可能是不希望的。
实际上,您所指的“侦听器”不是必需的,仅用于解决在解析TLD文件(例如早期的GlassFish v3和Jetty版本)中出现时间错误的有问题的容器。 另请参阅com.sun.faces.config.ConfigureListener的配置 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.