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

問題

Eclipse IDEでは、JSF 2.0 WebアプリケーションをTomcat 6.0.26にデプロイするときに、次の例外が発生し、Tomcatサーバーの起動に失敗しました。

__P.Sプロジェクトクラスパスに jsf-api-2.1.0-b03.jar jsf-impl-2.1.0-b03.jar ライブラリが含まれています。

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 がFactoryFinderの getFactory() メソッドによってスローされることを確認します。

/**
 **  @throws IllegalArgumentException if <code>factoryName</code> 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 <code>factoryname</code>
 **                                   is null
 ** /
 public static Object getFactory(String factoryName)
         throws FacesException {

        validateFactoryName(factoryName);
       //...
 }

IllegalArgumentExceptionは、ファクタファインダが新しいJSF2.0 ExceptionHandlerFactory ファクトリ名を認識しないことを文書化しました。

何千回ものテストと試しの後、最終的に、私のプロジェクトクラスパスに含まれている javaee.jar からの根本的な原因がわかります。

  • javaee.jar ** の内部を見ると、JSF 1.2 APIのセットも含まれています。Tomcatが新しいJSF 2.0 APIではなくこのJSF 1.2 APIを選択しているようです。

プロジェクトのクラスパスから javaee.jar を削除した後、JSF 2.0 WebアプリケーションはTomcatでうまく起動して実行できます。