質問
⚠️ この事例は公開されてから1年以上経過しています。 情報が古い可能性がありますので、ご注意ください。
🕓 事例公開日 : 2024-04-02
【背景】
独自開発したプログラムをimmファイル形式でパッケージ化し、WARファイルとして組み込む作業を実施した。契約時に提供されたjugglingプロジェクトをベースに、ユーザーモジュールでimmファイルをインポートしてWARファイルを生成した。1. 事象
エラーメッセージ・スタックトレース:
java.lang.RuntimeException: Storage root directory could not make.at jp.co.intra_mart.system.service.client.file.StorageLocalFileImpl.(StorageLocalFileImpl.java:79)at jp.co.intra_mart.system.service.client.file.ExternalStorageLocalFileImpl.(ExternalStorageLocalFileImpl.java:56)at jp.co.intra_mart.system.service.client.file.ExternalStorageLocalFileImpl.(ExternalStorageLocalFileImpl.java:45) javax.servlet.ServletException: java.lang.NoClassDefFoundError: org/apache/poi_v3_8/openxml4j/exceptions/InvalidFormatException
at com.caucho.server.dispatch.FilterManager.createFilter(FilterManager.java:234)
at com.caucho.server.dispatch.FilterManager.init(FilterManager.java:105)
at com.caucho.server.webapp.WebApp.startImpl(WebApp.java:3911)
Caused by: java.lang.NoClassDefFoundError: org/apache/poi_v3_8/openxml4j/exceptions/InvalidFormatException
at java.base/java.lang.Class.getDeclaredMethods0(Native Method)
at java.base/java.lang.Class.privateGetDeclaredMethods(Class.java:3166) Caused by: java.lang.ClassNotFoundException: org.apache.poi_v3_8.openxml4j.exceptions.InvalidFormatException
症状の説明:
運用管理サイトでWARファイルをアップロードすると、モジュール反映実行履歴のステータスが「異常終了」と表示され、WARファイル適用状況が「失敗」となる。詳細欄には「お客様環境のログ情報とWARファイル確認の上~」というメッセージが表示される。2. 発生条件
・運用管理サイトのモジュール反映機能を使用してWARファイルをアップロード・契約時はTERASOLUNAの利用なしで申し込んだため、jugglingファイルのベースモジュールにTERASOLUNA Server Frameworkが含まれていない
・TERASOLUNAにチェックを入れたものと入れていない初期設定のもの、両方でデプロイを試行したが、どちらも失敗
回答
1. 原因
技術的な原因:
WARファイル内のstorage-config.xmlに記述されたストレージルートパスが、ローカル開発環境のパス(C:\storage_mssql)のままになっており、Accel-Mart Plus環境の正しいパス(/opt/accel-mart/iap_storage)に修正されていなかったことが主な原因です。さらに、Apache POIライブラリの依存関係に問題があり、必要なクラスが見つからない状態でした。技術的要因の分析:
・ローカル開発環境のストレージパスがそのまま残存 → Accel-Mart Plus環境でストレージディレクトリの作成に失敗・WARファイル内の設定ファイルが環境に適合していない → アプリケーションの初期化処理が中断
・Apache POI v3.8のクラスパスが正しく解決されない → フィルター初期化時にClassNotFoundExceptionが発生
・依存ライブラリの不整合 → Web APIルーティングモジュールの読み込みが失敗
・複数の設定不備が重なった状態 → モジュール反映プロセス全体が異常終了
根本的な要因:
ローカル開発環境で作成したWARファイルを、Accel-Mart Plus環境向けに適切に調整せずにデプロイしようとしたことが根本原因です。特に環境依存の設定ファイル(storage-config.xml)の修正漏れと、ライブラリ依存関係の不整合が問題を引き起こしました。2. 対応方法
根本解決方法:
1. WARファイル内のstorage-config.xmlを開き、<root-path-name>タグの値を以下に修正してください修正前:
<root-path-name>/C:\storage_mssql</root-path-name>
修正後:
<root-path-name>/opt/accel-mart/iap_storage</root-path-name>
2. Apache POIライブラリの依存関係を確認し、必要なクラスが正しく含まれているか検証してください
3. 修正後のWARファイルを再作成し、運用管理サイトから再度モジュール反映を実行してください
参考ドキュメント:
・ストレージ設定ファイル:https://document.intra-mart.jp/library/iap/public/configuration/im_configuration_reference/texts/im_core/storage-config/index.html3. 原因究明に至るまでの調査方法
1. 運用管理サイトのモジュール反映実行履歴で「異常終了」ステータスを確認 2. Resin JVMログ(jvm-app-*.log)を取得し、エラー発生時のスタックトレースを確認ログ取得方法:https://cloud.intra-mart.support/hc/ja/articles/16597104254873
3. スタックトレースから「Storage root directory could not make」エラーを特定し、ストレージ設定の問題を推測
4. お客様からstorage-config.xmlを取得し、設定内容を確認(初回は問題なし)
5. お客様にWARファイルをストレージ領域にアップロードいただき、ファイル内容を直接検証アップロード方法:https://aws.accel-mart.com/startup_guide/texts/03_startup/06_sftp_login/02_access_storage.html
6. WARファイル内のstorage-config.xmlを展開して確認し、ローカル環境のパス(C:\storage_mssql)が残っていることを発見
7. 修正後も失敗が続いたため、再度JVMログを分析し、Apache POIライブラリのClassNotFoundExceptionを特定
8. 開通時に提供したWARファイルと現在のWARファイルの差分確認を案内し、お客様側で最終的な修正を実施
調査時に参照したドキュメント:
・お問い合わせガイド(各種ログの確認):https://aws.accel-mart.com/support_inquiry_guide/texts/inquiry_process/support_category_decision/failure_analysis.html#root-cause-analysis・ログ仕様書:https://document.intra-mart.jp/library/iap/public/im_core/im_log_specification/index.html