【问题标题】:Maven - JSF 2.0 doesn't work on embedded tomcatMaven - JSF 2.0 不适用于嵌入式 tomcat
【发布时间】:2014-03-07 13:32:36
【问题描述】:

我使用 JSF 2.2、Primefaces、Tomcat 7 依赖项创建了一个 Maven Web 应用程序。

我的 JSF 的实现是 Mojarra 2.2.4,我在我的 POM 上添加了这个依赖:

    <dependency>
        <groupId>com.sun.faces</groupId>
        <artifactId>jsf-api</artifactId>
        <version>2.2.4</version>
        <scope>compile</scope>
    </dependency>

    <dependency>
        <groupId>com.sun.faces</groupId>
        <artifactId>jsf-impl</artifactId>
        <version>2.2.4</version>
        <scope>compile</scope>
    </dependency>

但不幸的是,tomcat7-maven-plugin 及其嵌入式 tomcat 存在问题。如果我使用 tomcat7:run 命令,我的 webapp 启动没有问题,但是当它尝试加载托管 bean 时,我收到此错误:

目标不可达,标识符“testBean”解析为空

这表明 web 应用正在使用 JSF 1.x 而不是 JSF 2.xJSF 1.x 的配置器无法识别 @ManagedBean 注释,这将导致它们不会自动加载/初始化而无需 faces-config.xml。

我使用的是tomcat嵌入式7.0.50,使用它配置:http://tomcat.apache.org/maven-plugin-trunk/tomcat7-maven-plugin/adjust-embedded-tomcat-version.html

但尽管我不认识 @ManagedBean 注释,但它只能在 faces-config.xml 上使用 managedbean 标记。

有没有办法将 JSF 2.x 支持包含到 Tomcat Embedded for maven7-tomcat-plugin

PS:tomcat7:run-war 有效,但我不喜欢,因为它显然是静态运行,不可能动态更改 xhtml 代码(例如)。

【问题讨论】:

  • 我不明白这个问题。 JSF 是与您的应用程序一起部署的,不是吗?
  • 是的,我的 POM 上有 JSF 依赖项,但问题是 Maven Tomcat Embedded。它不识别 JSF 2.X。事实上,如果我构建 WAR 并将其部署在外部 Tomcat 上,webapp 就可以工作。
  • 顺便说一句,永恒“目标无法到达,标识符 [beanname] 解析为 null”的有趣原因。我以前看到过有关此问题的问题,但没有明显的原因。我想知道 Maven+Embedded-Tomcat 到底在这里做什么。
  • 问题是由于插件的影响(它没有在 WAR 或目录中运行 webapp),注释扫描算法无法正常运行。如果您使用的是 MyFaces,请尝试设置 org.apache.myfaces.annotation.SCAN_PACKAGES 参数,以指示扫描所选包的算法。
  • 这是一个你应该放在 web.xml 上的参数。我不知道 Mojarra 背后的细节,但我想它存在一个类似的参数但我不知道它是否会起作用,因为我们必须做一些特殊的东西来让它在很久以前就可以工作,与默认算法不同规范提出的。我可以告诉你的是,在 MyFaces 中添加的参数正是为了解决这些情况。切换到 MyFaces 很简单,会让您的生活更轻松。尝试 2.2.0 工件。

标签: java maven jsf-2 plugins embedded-tomcat-7


【解决方案1】:

我按照以下步骤解决了从 Mojarra 2.2.4 切换到 MyFaces 2.2.0 的问题:

  1. 删除我的 POM 中的 Mojarra 依赖项
  2. 在我的 POM 中添加 MyFaces 依赖项:

    <dependency>
        <groupId>org.apache.myfaces.core</groupId>
        <artifactId>myfaces-api</artifactId>
        <version>2.2.0</version>
        <scope>compile</scope>
    </dependency>
    
    <dependency>
        <groupId>org.apache.myfaces.core</groupId>
        <artifactId>myfaces-impl</artifactId>
        <version>2.2.0</version>
        <scope>compile</scope>
    </dependency>
    
  3. 更改我的 web.xml 上的侦听器类

    <listener>
    <listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>
    

  4. 在我的 web.xml 中添加上下文参数

    <context-param>
         <description>Defines which packages to scan for beans, separated by commas.
             Useful for when using maven and jetty:run (version 6) or tomcat:run
        </description>
        <param-name>org.apache.myfaces.annotation.SCAN_PACKAGES</param-name>
        <param-value>eu.dedalus</param-value>
    

.5 从 WEB-INF/lib 中删除 jsf-api 和 jsf-impl。

.6 [ECLIPSE ONLY] 使用 M2REPO 变量在 Build Path 中添加 myfaces.api 和 myfaces-impl 库,并删除 jsf-api 和 jsf-impl 库。

感谢https://stackoverflow.com/users/814956/lu4242

【讨论】:

  • 我知道你早就解决了这个问题,但是我找到了一个快速的解决方案,使用 Jetty 插件而不是 Tomcat。
猜你喜欢
  • 2019-03-23
  • 2015-06-21
  • 2010-11-25
  • 1970-01-01
  • 2018-10-10
  • 2017-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多