4.3.6. Seam 2.2 Booking アーカイブのデプロイメントエラーや例外のデバッグおよび解決
重要
手順4.16 デプロイメントエラーや例外のデバッグおよび解決
- 問題 - java.lang.ClassNotFoundException: javax.faces.FacesExceptionアプリケーションをデプロイする場合に、ログに以下のエラーが含まれます。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ログの解説ClassNotFoundException は見つからない依存関係があることを示しています。この例では、クラス
javax.faces.FacesException
が見つからないため、依存関係を明示的に追加する必要があります。解決方法見つからないクラスと一致するパスを探し、
EAP6_HOME/modules/system/layers/base/
ディレクトリー内でそのクラスのモジュール名を見つけます。この例では、以下の 2 つのモジュールが見つかります。両モジュールのモジュール名は同じjavax/faces/api/main javax/faces/api/1.2
javax/faces/api/main javax/faces/api/1.2
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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
ファイルを作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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アプリケーションをデプロイする場合に、ログに以下のエラーが含まれます。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ログの解説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"/>
<module name="org.apache.commons.logging" export="true"/>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow jboss-deployment-structure.xml
の内容は以下のようになります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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]
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]
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ログの解説ClassNotFoundException
は見つからない依存関係があることを示しています。この例では、クラスorg.dom4j.DocumentException
が見つかりません。解決方法org/dom4j/DocumentException
を探して、EAP6_HOME/modules/system/layers/base/
ディレクトリーを見つけます。モジュール名は、“org.dom4j” です。モジュール依存関係をファイルのデプロイメントセクションに追加するようjboss-deployment-structure.xml
ファイルを変更します。jboss-deployment-structure.xml ファイルの内容は以下のようになります。<module name="org.dom4j" export="true"/>
<module name="org.dom4j" export="true"/>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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]
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]
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ログの解説ClassNotFoundException
は見つからない依存関係があることを示しています。この例では、クラスorg.hibernate.validator.InvalidValue
が見つかりません。解決方法モジュール「org.hibernate.validator」は存在しますが JAR に
org.hibernate.validator.InvalidValue
クラスが含まれていないため、モジュールの依存関係を追加してもこの問題は解決しません。この例では、クラスが含まれる JAR は JBoss Enterprise Application Platform 5.1 デプロイメントの一部になります。EAP5_HOME/seam/lib/
ディレクトリーに不明なクラスが含まれている JAR を探します。これを実行するには、コンソールを開いて以下の内容を入力します。結果は以下のようになります。cd EAP5_HOME/seam/lib grep 'org.hibernate.validator.InvalidValue' `find . -name '*.jar'
$ cd EAP5_HOME/seam/lib $ grep 'org.hibernate.validator.InvalidValue' `find . -name '*.jar'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow この場合は、Binary file ./hibernate-validator.jar matches Binary file ./test/hibernate-all.jar matches
$ Binary file ./hibernate-validator.jar matches $ Binary file ./test/hibernate-all.jar matches
Copy to Clipboard Copied! Toggle word wrap Toggle overflow hibernate-validator.jar
をjboss-seam-booking.ear/lib/
ディレクトリーにコピーします。cp EAP5_HOME/seam/lib/hibernate-validator.jar jboss-seam-booking.ear/lib
$ cp EAP5_HOME/seam/lib/hibernate-validator.jar jboss-seam-booking.ear/lib
Copy to Clipboard Copied! Toggle word wrap Toggle overflow EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed
ファイルを削除して同じディレクトリーに空のjboss-seam-booking.ear.dodeploy
ファイルを作成し、アプリケーションを再デプロイします。 - 問題 - java.lang.InstantiationException: org.jboss.seam.jsf.SeamApplicationFactoryアプリケーションをデプロイする場合に、ログに以下のエラーが含まれます。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ログの解説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.FacesException
ClassNotFoundException
の場合と同様、メインディレクトリーの JSF 2.0 バージョンではなく JFS 1.2 バージョンを使用したいため、使用したい方を指定し、使用したくない方を除外します。ファイルのデプロイメントセクションにモジュールの依存関係を追加するようjboss-deployment-structure.xml
を変更する必要があります。また、WAR のサブデプロイメントに追加し、JSF 2.0 モジュールを除外する必要もあります。ファイルの内容は次のようになるはずです。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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]
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]
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ログの解説ClassNotFoundException
は見つからない依存関係があることを示しています。この例では、クラスorg.apache.commons.collections.ArrayStack
が見つかりません。解決方法org/apache/commons/collections
パスを探して、EAP6_HOME/modules/system/layers/base/
ディレクトリーを見つけます。モジュール名は、“org.apache.commons.collections” です。モジュール依存関係をファイルのデプロイメントセクションに追加するよう jboss-deployment-structure.xml を変更します。jboss-deployment-structure.xml ファイルの内容は以下のようになります。<module name="org.apache.commons.collections" export="true"/>
<module name="org.apache.commons.collections" export="true"/>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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 ]"]}}}
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 ]"]}}}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ログの解説「Services with missing/unavailable dependencies」(見つからない/使用できない依存関係を持つサービス) のエラーが発生したら、「missing」の後の括弧内にある文字を確認してください。この場合は、次のようになります。
“/em” は、Entity Manager とデータソースの問題を示します。missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".AuthenticatorAction.\"env/org.jboss.seam.example.booking.AuthenticatorAction/em\" ]
missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".AuthenticatorAction.\"env/org.jboss.seam.example.booking.AuthenticatorAction/em\" ]
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 解決方法JBoss Enterprise Application Platform 6 ではデータソースの設定が変更になったため、
EAP6_HOME/standalone/configuration/standalone.xml
ファイルに定義する必要があります。JBoss Enterprise Application Platform 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>
<!-- <jta-data-source>java:/bookingDatasource</jta-data-source> --> <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed
ファイルを削除して同じディレクトリーに空のjboss-seam-booking.ear.dodeploy
ファイルを作成し、アプリケーションを再デプロイします。 - 問題 - java.lang.ClassNotFoundException: org.hibernate.cache.HashtableCacheProviderアプリケーションをデプロイする場合に、ログに以下のエラーが含まれます。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ログの解説ClassNotFoundException
は見つからない依存関係があることを示しています。この例では、クラスorg.hibernate.cache.HashtableCacheProvider
が見つかりません。解決方法“org.hibernate.cache” のモジュールは存在しません。この例では、クラスが含まれる JAR は JBoss Enterprise Application Platform 5.1 デプロイメントの一部になります。
EAP5_HOME/seam/lib/
ディレクトリーに不明なクラスが含まれている JAR を探します。これを実行するには、コンソールを開いて以下の内容を入力します。結果は以下のようになります。cd EAP5_HOME/seam/lib grep 'org.hibernate.validator.InvalidValue' `find . -name '*.jar'`
$ cd EAP5_HOME/seam/lib $ grep 'org.hibernate.validator.InvalidValue' `find . -name '*.jar'`
Copy to Clipboard Copied! Toggle word wrap Toggle overflow この場合は、Binary file ./hibernate-core.jar matches Binary file ./test/hibernate-all.jar matches
Binary file ./hibernate-core.jar matches Binary file ./test/hibernate-all.jar matches
Copy to Clipboard Copied! Toggle word wrap Toggle overflow hibernate-core.jar
をjboss-seam-booking.ear/lib/
ディレクトリーにコピーします。cp EAP5_HOME/seam/lib/hibernate-core.jar jboss-seam-booking.ear/lib
cp EAP5_HOME/seam/lib/hibernate-core.jar jboss-seam-booking.ear/lib
Copy to Clipboard Copied! Toggle word wrap Toggle overflow EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed
ファイルを削除して同じディレクトリーに空のjboss-seam-booking.ear.dodeploy
ファイルを作成し、アプリケーションを再デプロイします。 - 問題 - java.lang.ClassCastException: org.hibernate.cache.HashtableCacheProviderアプリケーションをデプロイする場合に、ログに以下のエラーが含まれます。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ログの解説ClassCastException
は複数の問題が原因で発生する可能性があります。ログでこの例外を見てみると、クラスorg.hibernate.cache.HashtableCacheProvider
がorg.hibernate.cache.spi.CacheProvider
を拡張し、拡張するクラス以外のクラスローダーによってロードされたように見受けられます。org.hibernate.cache.HashtableCacheProvider
クラスはhibernate-core.jar
にあり、アプリケーションクラスローダーによってロードされます。このクラスを拡張するクラスであるorg.hibernate.cache.spi.CacheProvider
はorg/hibernate/main/hibernate-core-4.0.0.Beta1.jar
にあり、モジュールによって暗黙的にロードされます。これはあからさまではありませんが Hibernate 4 の変更が原因で、この問題はHashtableCacheProvider
クラスを他のパッケージへ移動したことによる後方互換性の問題が原因となっています。このクラスはorg.hibernate.cache
パッケージからorg.hibernate.cache.internal
パッケージに移動されました。persistence.xml
ファイルよりhibernate.cache.provider_class
プロパティーを削除しないと、Seam アプリケーションが以前の Hibernate ライブラリーをバンドルするよう強制されるため、ClassCastExceptions
が発生します。JBoss Enterprise Application Platform 6 では HashtableCacheProvider を使用せずに Infinispan を使用するようにしてください。解決方法JBoss Enterprise Application Platform 6 では、
jboss-seam-booking.jar/META-INF/persistence.xml
ファイルのhibernate.cache.provider_class property
を次のようにコメントアウトします。<!-- <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/> -->
<!-- <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/> -->
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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 Enterprise Application 6 への移行: 手順説明」をクリックしてください。