Maven - JSF 2.0不适用于嵌入式tomcat

时间:2014-02-10 09:37:13

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

我使用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'已解析为空

这表示网络应用正在使用JSF 1.x而不是JSF 2.xJSF 1.x的配置程序无法识别@ManagedBean注释,这些注释会导致它们在没有faces-config.xml的情况下自动加载/初始化。

我正在使用tomcat embedded 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添加maven7-tomcat-plugin对Tomcat Embedded的支持?

PS:tomcat7:run-war有效,但我不喜欢,因为很明显它是静态运行,没有任何可能在飞行中更改xhtml代码(例如)。

1 个答案:

答案 0 :(得分:3)

我决定按照以下步骤从Mojarra 2.2.4切换到MyFaces 2.2.0:

  1. 删除我的POM中的Mojarra dependecies
  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-class

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

  4. 在我的web.xml上添加context-param

    <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. .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