简体   繁体   中英

Maven - JSF 2.0 doesn't work on embedded tomcat

I created a Maven Web Application using JSF 2.2 , Primefaces, Tomcat 7 dependencies.

My JSF's implemention is Mojarra 2.2.4, I added this dependecies on my 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>

But unfortunately, I have problem with tomcat7-maven-plugin and its embedded tomcat. If I use tomcat7:run command, my webapp starts without problem, but when it try to load managed bean I receive this error:

Target Unreachable, identifier 'testBean' resolved to null

This is a sign that the webapp is using JSF 1.x instead of JSF 2.x . The configurator of JSF 1.x does not recognize @ManagedBean annotations which will cause that they're not loaded/initialized automagically without the need for faces-config.xml.

I'm using tomcat embedded 7.0.50, configured using it: http://tomcat.apache.org/maven-plugin-trunk/tomcat7-maven-plugin/adjust-embedded-tomcat-version.html

But despite I doesn't recognize @ManagedBean annotaions, it works only using managedbean tag on faces-config.xml .

Is there a way to include JSF 2.x support to Tomcat Embedded for maven7-tomcat-plugin ?

PS: tomcat7:run-war works, but I don't like because obviously it a static run, without any possibility to change xhtml code (eg) on fly.

I resolved switched from Mojarra 2.2.4 to MyFaces 2.2.0 following these steps:

  1. remove Mojarra dependecies in my POM
  2. add MyFaces dependecies in my POM:

     <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. change listener-class on my web.xml

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

  4. add context-param on my 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 remove jsf-api e jsf-impl from WEB-INF/lib.

.6 [ECLIPSE ONLY] add myfaces.api and myfaces-impl libraries in Build Path using M2REPO variable and remove jsf-api and jsf-impl libraries.

Thanks to https://stackoverflow.com/users/814956/lu4242 !

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM