java.lang.IllegalArgumentException: javax.faces.context.ExceptionHandlerFactory

java.lang.IllegalArgumentException: javax.faces.context.ExceptionHandlerFactory

проблема

В Eclipse IDE при развертывании веб-приложения JSF 2.0 в Tomcat 6.0.26 возникает следующее исключение и не удается запустить сервер Tomcat.

P.S Both jsf-api-2.1.0-b03.jar and jsf-impl-2.1.0-b03.jar libraries are included in the project classpath.

INFO: Unsanitized stacktrace from failed start...
java.lang.IllegalArgumentException: javax.faces.context.ExceptionHandlerFactory
    at javax.faces.FactoryFinder.validateFactoryName(FactoryFinder.java:630)
    at javax.faces.FactoryFinder.setFactory(FactoryFinder.java:287)
    ...
SEVERE: Critical error during deployment:
com.sun.faces.config.ConfigurationException:
CONFIGURATION FAILED! javax.faces.context.ExceptionHandlerFactory
    ...
Caused by: java.lang.IllegalArgumentException: javax.faces.context.ExceptionHandlerFactory
    at javax.faces.FactoryFinder.validateFactoryName(FactoryFinder.java:630)
    ...

Решение

В режиме отладки Eclipse загляните в исходный код и выясните, чтоIllegalArgumentException выбрасывается методомgetFactory() FactoryFinder.

FactoryFinder.java

 /*
 * @throws IllegalArgumentException if factoryName does not
 *                                  identify a standard JavaServer Faces factory name
 * @throws IllegalStateException    if there is no configured factory
 *                                  implementation class for the specified factory name
 * @throws NullPointerException     if factoryname
 *                                  is null
 */

 public static Object getFactory(String factoryName)
         throws FacesException {

        validateFactoryName(factoryName);
        //...
 }

Исключение IllegalArgumentException задокументировало, что средство поиска факторов не распознает новое имя фабрики JSF2.0ExceptionHandlerFactory.

После тысячи раз тестирования и попыток, наконец, я выяснил, что основная причина - вjavaee.jar, который включен в мой путь класса проекта. Загляните внутрьjavaee.jar, он также содержит набор JSF 1.2 api, похоже, Tomcat выбирает этот JSF 1.2 api вместо моего нового JSF 2.0 api.

После удаленияjavaee.jar из пути к классам проекта веб-приложение JSF 2.0 может запускаться и нормально работать на Tomcat.