JBoss 5.1.0.GAからJBoss 6.0.0-Finalに移行していますが、FacesServlerの初期化中に次の例外が発生します
2011-03-09 18:07:24,574 ERROR [org.Apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/].[Faces Servlet]] (http-0.0.0.0-8080-4) Allocate exception for servlet Faces Servlet: Java.lang.IllegalStateException: Application was not properly initialized at startup, could not find Factory: javax.faces.context.FacesContextFactory
at javax.faces.FactoryFinder$FactoryManager.getFactory(FactoryFinder.Java:725) [:1.2_15-20100816-SNAPSHOT]
at javax.faces.FactoryFinder.getFactory(FactoryFinder.Java:239) [:1.2_15-20100816-SNAPSHOT]
at javax.faces.webapp.FacesServlet.init(FacesServlet.Java:164) [:1.2_15-20100816-SNAPSHOT]
at org.Apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.Java:1208) [:6.0.0.Final]
at org.Apache.catalina.core.StandardWrapper.allocate(StandardWrapper.Java:955) [:6.0.0.Final]
at org.Apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.Java:188) [:6.0.0.Final]
at org.Apache.catalina.core.StandardContextValve.invoke(StandardContextValve.Java:191) [:6.0.0.Final]
at org.jboss.web.Tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.Java:181) [:6.0.0.Final]
at org.Apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.Java:501) [:6.0.0.Final]
at org.jboss.web.Tomcat.security.JaccContextValve.invoke(JaccContextValve.Java:88) [:6.0.0.Final]
at org.jboss.web.Tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.Java:100) [:6.0.0.Final]
at org.Apache.catalina.core.StandardHostValve.invoke(StandardHostValve.Java:127) [:6.0.0.Final]
at org.Apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.Java:102) [:6.0.0.Final]
at org.jboss.web.Tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.Java:158) [:6.0.0.Final]
at org.Apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.Java:109) [:6.0.0.Final]
at org.jboss.web.Tomcat.service.request.ActiveRequestResponseCacheValve.invoke(ActiveRequestResponseCacheValve.Java:53) [:6.0.0.Final]
at org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:362) [:6.0.0.Final]
at org.Apache.coyote.http11.Http11Processor.process(Http11Processor.Java:877) [:6.0.0.Final]
at org.Apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.Java:654) [:6.0.0.Final]
at org.Apache.Tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.Java:951) [:6.0.0.Final]
at Java.lang.Thread.run(Thread.Java:619) [:1.6.0_14]
コードを調べたところ、FactoryFinderは、現在のスレッドクラスローダーに基づいて、対応するFactoryManagerを検索することがわかりました。また、私のFactoryFinder.FACTORIES_CACHEには、2つのクラスローダーの2つのエントリが含まれていることもわかりました。
* BaseClassLoader which loads my EAR and
* WebCtxLoader.ENCLoader which is used during web app running and which was current context classloaded for failed thread.
私の展開構造は次のとおりです:
* deploy
o myapplication.ear
+ lib
# richfaces jars (3.3.1.GA)
# seam jars (2.2.1.Final)
# openfaces jar (2.0.0)
# other jars
+ META-INF
# jboss-app.xml
# application.xml
+ myapplication.war
# WEB-INF
* web.xml
* faces-config.xml
* components.xml
* deployers
o jbossweb.deployer
o jsf.deployer
o and others
Jjar実装としてMojarra-1.2を使用しています
<param-name>org.jboss.jbossfaces.JSF_CONFIG_NAME</param-name>
<param-value>Mojarra-1.2</param-value>
いくつかのデバッグの後、要約することができます:
1. all JSF initialization is made in BaseClassLoader thread, i.e. when javax.faces.FactoryFinder#setFactory(..) is invoked getClassLoader() returns EAR BaseClassLoader
2. A servlet thread (which cause exception) tries to look FactoryManager but his current classloader ( Thread.currentThread().getContextClassLoader()) is WebCtxLoader.ENCLoader. So nothing is returned and exception is thrown.
JBoss 5.1.0をチェックして、FactoryManagerの初期化とアクセスが同じクラスローダーを持つスレッドで行われるようにしました。
私は同じ問題を抱えている人について多くの情報を見つけられなかったのでググってみました-私の環境で何かがおかしいと思わせます.
誰かがこれにコメントしたり、これを手伝ったりできますか?
これはクラスパス汚染の兆候です。 JBossにはすでにJSFがバンドルされています。この例外は、JSFをWARにもバンドルしている場合に発生する可能性があります。衝突するだけです。
2つの解決策があります。
取り除く jsf-api
およびjsf-impl
WARのJAR(つまり、最終的に/WEB-INF/lib
ビルド/デプロイ後。
JBossが独自のバージョンのJSFを同梱して、JBossが独自のバージョンを使用しないことをJBossに伝えます。
<context-param>
<param-name>org.jboss.jbossfaces.WAR_BUNDLES_JSF_IMPL</param-name>
<param-value>true</param-value>
</context-param>
同じ問題がありましたが、GlassFish v3が組み込まれています。私はこれを追加し、うまくいきました:
<listener>
<listener-class>com.Sun.faces.config.ConfigureListener</listener-class>
</listener>
これは問題を説明するWebページです Google App EngineのFaceletsでJSF 1.2を使用 。
Jboss EAP 6.1および6.3でも同じ問題が発生していました。
私はMavenを使用していますが、私の問題はEARファイルの生成に関するものでした。Mavenを使用しているときに、依存関係が「展開」されている状態でEARファイルがデプロイされていることを発見しました。つまり、私のEARファイルはWARファイルやJARファイルではなく、プロジェクトのファイルを含むフォルダーでデプロイされました。
展開されたEARディレクトリとEARアーカイブの違いを調査したところ、表示されているものがMavenで取得したものとは異なることがわかりました。問題は、展開されたディレクトリを作成するときに、WARおよびEARビルド用のさまざまなMavenプラグインが適用されないことだと思います。
これを修正するために、EARのPOMから 'unpack'ディレクティブを削除しました。
<modules>
<webModule>
<groupId>br.web</groupId>
<artifactId>Web</artifactId>
<contextRoot>/project</contextRoot>
<unpack>false</unpack>
</webModule>
<ejbModule>
<groupId>br.ejb</groupId>
<artifactId>Ejb</artifactId>
<unpack>false</unpack>
</ejbModule>
</modules>
また、EARファイルで展開ディレクトリを使用することはお勧めしません。