2007年11月27日
罠 in tomcat
ある日、いきなり作成中のWebプログラム(Struts使用)が以下のエラーメッセージともに起動しなくなった。
致命的: サーブレット XXXXX がload()例外を投げました
javax.servlet.UnavailableException: パス jndi:/localhost/XXXXX/WEB-INF/struts-config.xml に対するリソース読み込みエラー
ネットで調べても原因がよくわからず、struts-config.xmlのフォーマットエラーだの、メッセージリソースがないからだの、何回か再起動したらそのうち直っただの謎だった。
設定ファイルを眺めても特にエラーがあるわけではなく、原因は不明だ。読み込みエラーと書かれているがもちろんそのファイルはある。と言うか昨日までちゃんと動いていた。
とりあえずtomcatとStrutsを最新にしても同じエラー。
結構悩んだ末に仕方なくtomcatとstrutsのソースコードを落としてきてステップ実行することに。
するとDirContextURLConnectionのconnectメソッドで失敗しているようだ。
注意深く見てみるとなんとコンテキスト名の先頭に/が無いとStrutsの初期化に失敗する模様・・・。
あれ、そんな仕様あったっけ・・・、と言うか/が無いなら補完してくれよ!
俺の3時間返してくれ!
ここまで悩んだのはエラーの原因が"ファイルが見つからないこと"とはわからなかったことだ。
例外を見てもUnavailableExceptionだし、ファイルが見つからないときのIOExceptionはチェーンされていなかった。
UnavailableExceptionの例外をnewする部分を見ると、なんとファイルが見つからないときの例外を無視し、設定ファイルのパースエラー時のメッセージとともにUnavailableExceptionを作成していた。設定ファイルパース時に何かエラーがあったら全部同じエラーメッセージ同じ例外かよ・・・。
例外は飲み込まずにチェーンしろよ!!と思ったがなんとUnavailableExceptionにはチェーン用のコンストラクタがなかった!!なんでやねん!!
ちなみになぜ前日まで動いていてソースいじってないのに動かなくなってしまったのかというと、おそらくEclipseのTomcatによる自動server.xml書き換えを実行するためにいったんTomcatプロジェクトの指定を外した事による再設定時の/付け忘れが原因だろう。
ネットでの情報が少なかったので俺のようなうっかりさんが今後参考になれば嬉しいなと言うことでメモを残す。
Trackback on "罠 in tomcat"
このエントリーのトラックバックURL:
"罠 in tomcat"へのトラックバックはまだありません。
"罠 in tomcat"へのコメントはまだありません。