当我从头创建一个Web应用程序并将jsf-api-2.2.11.jar和jsf-impl-2.2.11.jar添加到pom.xml(将它们添加到apps类路径)并将其部署到Tomcat 7时, JSf正在自动初始化:
=IF(INDIRECT("'Form Responses 1'!B"&Row(A1)+X) = "dog","1",IF(INDIRECT("'Form Responses 1'!B"&Row(A1)+X)="Cat","2",IF(INDIRECT("'Form Responses 1'!B"&Row(A1)+X)="Frog","3",IF(INDIRECT("'Form Responses 1'!B"&Row(A1)+X)="Bird","4"))))
在旧版本中,我曾经通过在web.xml(listener + servlet)中定义它来声明地启动它。所以我已经对它们进行了评论并设置了#34; metadata-complete"到"真" (这甚至会阻止类路径扫描吗?),但它仍在加载。
在这种情况下,我不希望它加载,同时将Jars留在类路径中,即在web-inf中的faces-config.xml。
什么仍在触发初始化?
答案 0 :(得分:2)
它是通过JSF实现JAR文件中的Servlet 3.0 ServletContainerInitializer
实现加载的(在Mojarra的情况下,它是com.sun.faces.config.FacesInitializer
)。它会在网址格式FacesServlet
,*.jsf
和*.faces
上自动注册/faces/*
(JSF 2.3会将*.xhtml
添加到网址格式列表中)。最新的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应用程序降级为Servlet 2.5,方法是在<web-app>
中编辑web.xml
根声明,以符合该版本。但是,当意图开发兼容Servlet 3.0的Web应用程序时,这会产生许多其他副作用。
您所指的“监听器”实际上并不是必需的,它只是解决在解析TLD文件时出现时序错误的错误容器,例如早期的GlassFish v3和Jetty版本。另见a.o. Configuration of com.sun.faces.config.ConfigureListener