【エラー解決方法】Tomcat起動時に「重大: 以前のエラーのためにコンテキストの起動が失敗しました」が発生したときの対処法
目次
こんにちは。飯塚です。
社内の新人研修用プロジェクトを作っていたときにエラーが発生しました。いきなりたくさんのプログラムを読むと混乱するので、共通部のコアなプログラムはMavenプロジェクトとしてではなくjarファイルとして切り出す方針にしたのが原因でした。解決に少し手間取ったので今回まとめました。
エラー再現環境
項目 | 詳細 |
---|---|
OS | Windows 11 |
言語 | Java 11 |
IDE | Eclipse 2023-12 (4.30.0) |
Webサーバー | Tomcat 9 |
プロジェクト管理ツール | Maven |
エラー詳細:「重大: 以前のエラーのためにコンテキストの起動が失敗しました」
Mavenを使用したWebアプリケーションをTomcatで起動したときに、下記のエラーが発生しました。
(省略) 情報: コマンドライン引数: -Dwtp.deploy=C:\Users\xxx\Documents\GitHub\amg-training-java\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps [土 6月 08 18:05:02 GMT+09:00 2024] (省略) 重大: フィルタ [SecureResponseHeaderFilter] の起動中の例外です [土 6月 08 18:05:12 GMT+09:00 2024] 重大: 1つまたは複数のフィルタを開始できませんでした。完全な詳細は適切なコンテナログファイルにあります。 [土 6月 08 18:05:13 GMT+09:00 2024] 重大: 以前のエラーのためにコンテキストの起動が失敗しました [/training-web-api] [土 6月 08 18:05:13 GMT+09:00 2024]
Tomcat起動時のエラーで読むべきポイントは「重大」で始まる行です。ログを上から順番に読むと「SecureResponseHeaderFilter」というfilterクラスの起動中に発生した例外が原因だと分かります。
解決法:Webデプロイメント・アセンブリーにパスを追加する
先に結論から書くと、今回のエラーはWebデプロイメント・アセンブリーにパスを追加することで解決します。
まずプロジェクトを右クリック、プロパティ>デプロイメント・アセンブリーを開き、「追加」をクリックします。
フォルダーを選択して、「次へ」をクリックします。
lib を選択して、「完了」をクリックします。
デプロイ・パスは変更する必要があるので、修正します。
デプロイ・パスに WEB-INF/lib を指定して「適用して閉じる」をクリックすれば完了です。Tomcatサーバーを再起動すれば、エラーが解消します。
エラー解消の確認:Tomcatを再起動してログを確認する
解消後のTomcat起動ログは下記です。「重大」なエラーが消えて、正常にサーバーが起動したことが分かります。
2024-06-09 13:13:57.812 [INFO] [accountId=] Root WebApplicationContext: initialization started [org.springframework.web.context.ContextLoader::initWebApplicationContext] 2024-06-09 13:13:58.886 [INFO] [accountId=] Root WebApplicationContext initialized in 1051 ms [org.springframework.web.context.ContextLoader::initWebApplicationContext] 情報: Initializing Spring DispatcherServlet 'dispatcherServlet' [日 6月 09 13:13:59 GMT+09:00 2024] 2024-06-09 13:13:59.177 [INFO] [accountId=] Initializing Servlet 'dispatcherServlet' [org.springframework.web.servlet.DispatcherServlet::initServletBean] 2024-06-09 13:14:01.073 [INFO] [accountId=] HV000001: Hibernate Validator 5.4.1.Final [org.hibernate.validator.internal.util.Version::<clinit>] 2024-06-09 13:14:01.307 [INFO] [accountId=] HV000007: META-INF/validation.xml found. Parsing XML based configuration. [org.hibernate.validator.internal.xml.ValidationXmlParser::unmarshal] 2024-06-09 13:14:02.395 [INFO] [accountId=] HV000004: Using com.codematic.fw.core.web.validation.interpolator.CodematicMessageInterpolator as message interpolator. [org.hibernate.validator.internal.xml.ValidationBootstrapParameters::setMessageInterpolator] 2024-06-09 13:14:03.342 [INFO] [accountId=] HV000007: META-INF/validation.xml found. Parsing XML based configuration. [org.hibernate.validator.internal.xml.ValidationXmlParser::unmarshal] 2024-06-09 13:14:03.349 [INFO] [accountId=] HV000004: Using com.codematic.fw.core.web.validation.interpolator.CodematicMessageInterpolator as message interpolator. [org.hibernate.validator.internal.xml.ValidationBootstrapParameters::setMessageInterpolator] 2024-06-09 13:14:04.901 [INFO] [accountId=] Completed initialization in 5723 ms [org.springframework.web.servlet.DispatcherServlet::initServletBean] 情報: プロトコルハンドラー ["http-nio-8080"] を開始しました。 [日 6月 09 13:14:04 GMT+09:00 2024] 情報: サーバーの起動 [18694] ミリ秒 [日 6月 09 13:14:05 GMT+09:00 2024]
原因調査1:今回のプロジェクト構成の確認と整理
「SecureResponseHeaderFilter」というfilterクラスがどこで使用されているかをGrepして調べます。すると、web.xmlで下記のように指定されていることが分かります。
web.xml
<filter> <filter-name>SecureResponseHeaderFilter</filter-name> <filter-class>com.codematic.fw.core.web.filter.SecureResponseHeaderFilter</filter-class> </filter>
今回のサンプルプロジェクト「training-web-api」の構成
training-web-api | +---.settings | org.eclipse.wst.common.component | +---lib | codematic-fw-core-web-1.0.0.jar | +---src +---main +---webapp +---WEB-INF web.xml
「org.eclipse.wst.common.component」はeclipse上でデプロイメント・アセンブリーの設定を管理するためのファイルです。
「codematic-fw-core-web-1.0.0.jar」というjarの中に「SecureResponseHeaderFilter」クラスが存在します。
pom.xml
<dependency> <groupId>com.codematic.fw.core</groupId> <artifactId>codematic-fw-core-web</artifactId> <version>${codematic.core.web.version}</version> <scope>system</scope> <systemPath>${project.basedir}/lib/codematic-fw-core-web-1.0.0.jar</systemPath> </dependency>
原因調査2:デプロイされたパスに対象のjarが存在するか確認する
Tomcatの起動ログには下記のようにデプロイするファイルのパスが出力されます。
-Dwtp.deploy=C:\Users\xxx\Documents\GitHub\amg-training-java\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps
Windowsエクスプローラーで「【デプロイパス】/training-web-api/WEB-INF/lib」調べると、「codematic-fw-core-web-1.0.0.jar」が存在しないことが分かります。jarが存在しないので、Tomcat起動時に「com.codematic.fw.core.web.filter.SecureResponseHeaderFilter」というクラスが読み込めないわけです。
補足:Eclipseのデプロイメント・アセンブリーとは
プロジェクト内のフォルダーやファイルを、Webアプリケーションのどの部分にデプロイするかを指定するのがデプロイメント・アセンブリーです。Eclipse上で操作したデプロイメント・アセンブリーの設定はファイルで管理されます。今回の設定した値も「wb-resource」として1行分追加されました。
/.settings/org.eclipse.wst.common.component
まとめ
いかがでしょうか。
今回のエラーは「org.eclipse.wst.common.component」を正しく設定して、Gitでも共有しておけば本来起きません。ただ環境構築では似たようなTomcat起動時のエラーはつきものです。この記事の調査や解決までのアプローチが似たようなエラーの解決に役立てば幸いです。
《関連記事》