問題
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でうまく起動して実行できます。
リファレンス
2.0.3リリースノート]
リンク://タグ/jsf2/[jsf2]