【问题标题】:How to prevent JSF from initializing automatically?如何防止 JSF 自动初始化?
【发布时间】:2015-08-18 23:45:40
【问题描述】:

当我从头开始创建 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)中定义它来声明式地启动它。所以我已经将它们注释掉并将“元数据完成”设置为“真”(这甚至会停止类路径扫描吗?),但它仍在加载。

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

什么还在触发初始化?

【问题讨论】:

    标签: jsf tomcat mojarra


    【解决方案1】:

    它是通过 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 vs 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 版本。另见 a.o. Configuration of com.sun.faces.config.ConfigureListener.

    【讨论】:

    • 好的,第一点,即使我真的不喜欢我的应用程序自动配置,因为类路径的结构。对于第二点,我确实删除了 impl。谢谢,但我确实想保留 api,因为不应删除应用程序的 Ithe Jsf 部分。我想在 JSF 和不同的 UI 框架之间切换,使用配置。
    • 好的,然后最终用户应该自己提供 JSF impl - 毕竟这在这个结构中也是一个更好的主意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    • 2014-10-07
    • 2016-08-02
    • 2019-06-04
    相关资源
    最近更新 更多