4.3.6. Seam 2.2 Booking アーカイブのデプロイメントエラーや例外のデバッグおよび解決
重要
手順4.10 デプロイメントエラーや例外のデバッグおよび解決
- 問題 - java.lang.ClassNotFoundException: javax.faces.FacesExceptionアプリケーションをデプロイする場合に、ログに以下のエラーが含まれます。
ERROR \[org.jboss.msc.service.fail\] (MSC service thread 1-1) MSC00001: Failed to start service jboss.deployment.subunit."jboss-seam-booking.ear"."jboss-seam-booking.war".POST_MODULE: org.jboss.msc.service.StartException in service jboss.deployment.subunit."jboss-seam-booking.ear"."jboss-seam-booking.war".POST_MODULE: Failed to process phase POST_MODULE of subdeployment "jboss-seam-booking.war" of deployment "jboss-seam-booking.ear" (.. additional logs removed ...) Caused by: java.lang.ClassNotFoundException: javax.faces.FacesException from \[Module "deployment.jboss-seam-booking.ear:main" from Service Module Loader\] at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:191)ログの解説ClassNotFoundException は見つからない依存関係があることを示しています。この例では、クラス
javax.faces.FacesExceptionが見つからないため、依存関係を明示的に追加する必要があります。解決方法見つからないクラスと一致するパスを探し、
EAP6_HOME/modules/system/layers/base/ディレクトリー内でそのクラスのモジュール名を見つけます。この例では、以下の 2 つのモジュールが見つかります。javax/faces/api/main javax/faces/api/1.2
両モジュールのモジュール名は同じjavax.faces.apiですが、メインディレクトリーにあるモジュールは JSF 2.0 向けで、1.2 ディレクトリーにあるものは JSF 1.2 向けです。一致するモジュールが 1 つのみの場合、MANIFEST.MFファイルを作成し、モジュールの依存関係を追加します。この例では、メインディレクトリーにある 2.0 バージョンではなく JSF 1.2 バージョンを使用したいため、使用したい方を指定し、使用したくない方を除外します。これを行うには、EAR のMETA-INF/ディレクトリーに、次のデータが含まれるjboss-deployment-structure.xmlファイルを作成します。<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0"> <deployment> <dependencies> <module name="javax.faces.api" slot="1.2" export="true"/> </dependencies> </deployment> <sub-deployment name="jboss-seam-booking.war"> <exclusions> <module name="javax.faces.api" slot="main"/> </exclusions> <dependencies> <module name="javax.faces.api" slot="1.2"/> </dependencies> </sub-deployment> </jboss-deployment-structure>deploymentセクションで、JSF 1.2 モジュール用javax.faces.apiに対する依存関係を追加します。また、WAR のサブデプロイメントセクションで JSF 1.2 モジュール用依存関係を追加し、JSF 2.0 用モジュールを除外します。EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failedファイルを削除して同じディレクトリーに空のjboss-seam-booking.ear.dodeployファイルを作成し、アプリケーションを再デプロイします。 - 問題 - java.lang.ClassNotFoundException: org.apache.commons.logging.Logアプリケーションをデプロイする場合に、ログに以下のエラーが含まれます。
ERROR [org.jboss.msc.service.fail] (MSC service thread 1-8) MSC00001: Failed to start service jboss.deployment.unit."jboss-seam-booking.ear".INSTALL: org.jboss.msc.service.StartException in service jboss.deployment.unit."jboss-seam-booking.ear".INSTALL: Failed to process phase INSTALL of deployment "jboss-seam-booking.ear" (.. additional logs removed ...) Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.Log from [Module "deployment.jboss-seam-booking.ear.jboss-seam-booking.war:main" from Service Module Loader]ログの解説ClassNotFoundExceptionは見つからない依存関係があることを示しています。この例では、クラスorg.apache.commons.logging.Logが見つからないため、依存関係を明示的に追加する必要があります。解決方法見つからないクラスと一致するパスを探し、
EAP6_HOME/modules/system/layers/base/ディレクトリー内でそのクラスのモジュール名を見つけます。この例では、パスorg/apache/commons/logging/と一致するモジュールが 1 つあります。モジュール名は "org.apache.commons.logging"です。モジュール依存関係をファイルのデプロイメントセクションに追加するようjboss-deployment-structure.xmlファイルを変更します。<module name="org.apache.commons.logging" export="true"/>
jboss-deployment-structure.xmlの内容は以下のようになります。<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0"> <deployment> <dependencies> <module name="javax.faces.api" slot="1.2" export="true"/> <module name="org.apache.commons.logging" export="true"/> </dependencies> </deployment> <sub-deployment name="jboss-seam-booking.war"> <exclusions> <module name="javax.faces.api" slot="main"/> </exclusions> <dependencies> <module name="javax.faces.api" slot="1.2"/> </dependencies> </sub-deployment> </jboss-deployment-structure>EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failedファイルを削除して同じディレクトリーに空のjboss-seam-booking.ear.dodeployファイルを作成し、アプリケーションを再デプロイします。 - 問題 - java.lang.ClassNotFoundException: org.dom4j.DocumentExceptionアプリケーションをデプロイする場合に、ログに以下のエラーが含まれます。
ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/seam-booking]] (MSC service thread 1-3) Exception sending context initialized event to listener instance of class org.jboss.seam.servlet.SeamListener: java.lang.NoClassDefFoundError: org/dom4j/DocumentException (... additional logs removed ...) Caused by: java.lang.ClassNotFoundException: org.dom4j.DocumentException from [Module "deployment.jboss-seam-booking.ear.jboss-seam.jar:main" from Service Module Loader]ログの解説ClassNotFoundExceptionは見つからない依存関係があることを示しています。この例では、クラスorg.dom4j.DocumentExceptionが見つかりません。解決方法org/dom4j/DocumentExceptionを探して、EAP6_HOME/modules/system/layers/base/ディレクトリーを見つけます。モジュール名は、“org.dom4j” です。モジュール依存関係をファイルのデプロイメントセクションに追加するようjboss-deployment-structure.xmlファイルを変更します。<module name="org.dom4j" export="true"/>
jboss-deployment-structure.xmlファイルの内容は以下のようになります。<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0"> <deployment> <dependencies> <module name="javax.faces.api" slot="1.2" export="true"/> <module name="org.apache.commons.logging" export="true"/> <module name="org.dom4j" export="true"/> </dependencies> </deployment> <sub-deployment name="jboss-seam-booking.war"> <exclusions> <module name="javax.faces.api" slot="main"/> </exclusions> <dependencies> <module name="javax.faces.api" slot="1.2"/> </dependencies> </sub-deployment> </jboss-deployment-structure>EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failedファイルを削除して同じディレクトリーに空のjboss-seam-booking.ear.dodeployファイルを作成し、アプリケーションを再デプロイします。 - 問題 - java.lang.ClassNotFoundException: org.hibernate.validator.InvalidValueアプリケーションをデプロイする場合に、ログに以下のエラーが含まれます。
ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/seam-booking]] (MSC service thread 1-6) Exception sending context initialized event to listener instance of class org.jboss.seam.servlet.SeamListener: java.lang.RuntimeException: Could not create Component: org.jboss.seam.international.statusMessages (... additional logs removed ...) Caused by: java.lang.ClassNotFoundException: org.hibernate.validator.InvalidValue from [Module "deployment.jboss-seam-booking.ear.jboss-seam.jar:main" from Service Module Loader]ログの解説ClassNotFoundExceptionは見つからない依存関係があることを示しています。この例では、クラスorg.hibernate.validator.InvalidValueが見つかりません。解決方法モジュール「org.hibernate.validator」は存在しますが JAR に
org.hibernate.validator.InvalidValueクラスが含まれていないため、モジュールの依存関係を追加してもこの問題は解決しません。この例では、クラスが含まれる JAR は JBoss EAP 5.X デプロイメントの一部になります。EAP5_HOME/seam/lib/ディレクトリーに不明なクラスが含まれている JAR を探します。これを実行するには、コンソールを開いて以下の内容を入力します。$ cd EAP5_HOME/seam/lib $ grep 'org.hibernate.validator.InvalidValue' `find . -name '*.jar'`
結果は以下のようになります。$ Binary file ./hibernate-validator.jar matches $ Binary file ./test/hibernate-all.jar matches
この場合は、hibernate-validator.jarをjboss-seam-booking.ear/lib/ディレクトリーにコピーします。$ cp EAP5_HOME/seam/lib/hibernate-validator.jar jboss-seam-booking.ear/lib
EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failedファイルを削除して同じディレクトリーに空のjboss-seam-booking.ear.dodeployファイルを作成し、アプリケーションを再デプロイします。 - 問題 - java.lang.InstantiationException: org.jboss.seam.jsf.SeamApplicationFactoryアプリケーションをデプロイする場合に、ログに以下のエラーが含まれます。
INFO [javax.enterprise.resource.webcontainer.jsf.config] (MSC service thread 1-7) Unsanitized stacktrace from failed start...: com.sun.faces.config.ConfigurationException: Factory 'javax.faces.application.ApplicationFactory' was not configured properly. at com.sun.faces.config.processor.FactoryConfigProcessor.verifyFactoriesExist(FactoryConfigProcessor.java:296) [jsf-impl-2.0.4-b09-jbossorg-4.jar:2.0.4-b09-jbossorg-4] (... additional logs removed ...) Caused by: javax.faces.FacesException: org.jboss.seam.jsf.SeamApplicationFactory at javax.faces.FactoryFinder.getImplGivenPreviousImpl(FactoryFinder.java:606) [jsf-api-1.2_13.jar:1.2_13-b01-FCS] (... additional logs removed ...) at com.sun.faces.config.processor.FactoryConfigProcessor.verifyFactoriesExist(FactoryConfigProcessor.java:294) [jsf-impl-2.0.4-b09-jbossorg-4.jar:2.0.4-b09-jbossorg-4] ... 11 more Caused by: java.lang.InstantiationException: org.jboss.seam.jsf.SeamApplicationFactory at java.lang.Class.newInstance0(Class.java:340) [:1.6.0_25] at java.lang.Class.newInstance(Class.java:308) [:1.6.0_25] at javax.faces.FactoryFinder.getImplGivenPreviousImpl(FactoryFinder.java:604) [jsf-api-1.2_13.jar:1.2_13-b01-FCS] ... 16 more
ログの解説com.sun.faces.config.ConfigurationExceptionとjava.lang.InstantiationExceptionは依存関係の問題があることを示しています。この例では、原因は明らかではありません。解決方法com.sun.facesクラスが含まれるモジュールを探す必要があります。com.sun.facesモジュールは存在しませんが、com.sun.jsf-implモジュールが 2 つあります。1.2 ディレクトリーのjsf-impl-1.2_13.jarを確認すると、com.sun.facesクラスが含まれていることがすぐに分かります。javax.faces.FacesExceptionClassNotFoundExceptionの場合と同様、メインディレクトリーの JSF 2.0 バージョンではなく JFS 1.2 バージョンを使用したいため、使用したい方を指定し、使用したくない方を除外します。ファイルのデプロイメントセクションにモジュールの依存関係を追加するようjboss-deployment-structure.xmlを変更する必要があります。また、WAR のサブデプロイメントに追加し、JSF 2.0 モジュールを除外する必要もあります。ファイルの内容は次のようになるはずです。<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0"> <deployment> <dependencies> <module name="javax.faces.api" slot="1.2" export="true"/> <module name="com.sun.jsf-impl" slot="1.2" export="true"/> <module name="org.apache.commons.logging" export="true"/> <module name="org.dom4j" export="true"/> </dependencies> </deployment> <sub-deployment name="jboss-seam-booking.war"> <exclusions> <module name="javax.faces.api" slot="main"/> <module name="com.sun.jsf-impl" slot="main"/> </exclusions> <dependencies> <module name="javax.faces.api" slot="1.2"/> <module name="com.sun.jsf-impl" slot="1.2"/> </dependencies> </sub-deployment> </jboss-deployment-structure>EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failedファイルを削除して同じディレクトリーに空のjboss-seam-booking.ear.dodeployファイルを作成し、アプリケーションを再デプロイします。 - 問題 - java.lang.ClassNotFoundException: org.apache.commons.collections.ArrayStackアプリケーションをデプロイする場合に、ログに以下のエラーが含まれます。
ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/seam-booking]] (MSC service thread 1-1) Exception sending context initialized event to listener instance of class com.sun.faces.config.ConfigureListener: java.lang.RuntimeException: com.sun.faces.config.ConfigurationException: CONFIGURATION FAILED! org.apache.commons.collections.ArrayStack from [Module "deployment.jboss-seam-booking.ear:main" from Service Module Loader] (... additional logs removed ...) Caused by: java.lang.ClassNotFoundException: org.apache.commons.collections.ArrayStack from [Module "deployment.jboss-seam-booking.ear:main" from Service Module Loader]ログの解説ClassNotFoundExceptionは見つからない依存関係があることを示しています。この例では、クラスorg.apache.commons.collections.ArrayStackが見つかりません。解決方法org/apache/commons/collectionsパスを探して、EAP6_HOME/modules/system/layers/base/ディレクトリーを見つけます。モジュール名は、"org.apache.commons.collections" です。モジュール依存関係をファイルのデプロイメントセクションに追加するようjboss-deployment-structure.xmlを変更します。<module name="org.apache.commons.collections" export="true"/>
jboss-deployment-structure.xmlファイルの内容は以下のようになります。<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0"> <deployment> <dependencies> <module name="javax.faces.api" slot="1.2" export="true"/> <module name="com.sun.jsf-impl" slot="1.2" export="true"/> <module name="org.apache.commons.logging" export="true"/> <module name="org.dom4j" export="true"/> <module name="org.apache.commons.collections" export="true"/> </dependencies> </deployment> <sub-deployment name="jboss-seam-booking.war"> <exclusions> <module name="javax.faces.api" slot="main"/> <module name="com.sun.jsf-impl" slot="main"/> </exclusions> <dependencies> <module name="javax.faces.api" slot="1.2"/> <module name="com.sun.jsf-impl" slot="1.2"/> </dependencies> </sub-deployment> </jboss-deployment-structure>EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failedファイルを削除して同じディレクトリーに空のjboss-seam-booking.ear.dodeployファイルを作成し、アプリケーションを再デプロイします。 - 問題 - Services with missing/unavailable dependenciesアプリケーションをデプロイする場合に、ログに以下のエラーが含まれます。
ERROR [org.jboss.as.deployment] (DeploymentScanner-threads - 2) {"Composite operation failed and was rolled back. Steps that failed:" => {"Operation step-2" => {"Services with missing/unavailable dependencies" => ["jboss.deployment.subunit.\"jboss-seam-booking.ear\".\"jboss-seam-booking.jar\".component.AuthenticatorAction.START missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".AuthenticatorAction.\"env/org.jboss.seam.example.booking.AuthenticatorAction/em\" ]","jboss.deployment.subunit.\"jboss-seam-booking.ear\".\"jboss-seam-booking.jar\".component.HotelSearchingAction.START missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".HotelSearchingAction.\"env/org.jboss.seam.example.booking.HotelSearchingAction/em\" ]"," (... additional logs removed ...) "jboss.deployment.subunit.\"jboss-seam-booking.ear\".\"jboss-seam-booking.jar\".component.BookingListAction.START missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".BookingListAction.\"env/org.jboss.seam.example.booking.BookingListAction/em\" ]","jboss.persistenceunit.\"jboss-seam-booking.ear/jboss-seam-booking.jar#bookingDatabase\" missing [ jboss.naming.context.java.bookingDatasource ]"]}}}ログの解説「Services with missing/unavailable dependencies」(見つからない/使用できない依存関係を持つサービス) のエラーが発生したら、「missing」の後の括弧内にある文字を確認してください。この場合は、次のようになります。
missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".AuthenticatorAction.\"env/org.jboss.seam.example.booking.AuthenticatorAction/em\" ]
「/em」は、Entity Manager とデータソースの問題を示します。解決方法JBoss EAP 6 ではデータソースの設定が変更になったため、
EAP6_HOME/standalone/configuration/standalone.xmlファイルに定義する必要があります。JBoss EAP 6 には、すでにstandalone.xmlファイルに定義されているデータベースの例が含まれているため、 このアプリケーションでサンプルデータベースを使用するようpersistence.xmlファイルを変更します。standalone.xmlファイルを見るとサンプルデータベースのjndi-nameはjava:jboss/datasources/ExampleDSであることが分かります。jboss-seam-booking.jar/META-INF/persistence.xmlファイルを変更して既存のjta-data-source要素をコメントアウトし、以下のように置き換えます。<!-- <jta-data-source>java:/bookingDatasource</jta-data-source> --> <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failedファイルを削除して同じディレクトリーに空のjboss-seam-booking.ear.dodeployファイルを作成し、アプリケーションを再デプロイします。 - この時点で、アプリケーションはエラーを引き起こさずにデプロイされますが、ブラウザーで URL http://localhost:8080/seam-booking/ へアクセスし、アカウントへログインしようとするとランタイムエラー 「The page isn't redirecting properly」(ページが正しくリダイレクトしません) が発生します。次の手順でランタイムエラーのデバッグおよび解決方法について学びましょう。ランタイム問題のデバッグおよび解決方法については、「Seam 2.2 Booking アーカイブのランタイムエラーや例外のデバッグおよび解決」を参照してください。以前のトピックに戻るには、「Seam 2.2 Booking アーカイブの JBoss EAP 6 への移行: 手順説明」をクリックしてください。