Tomcat5.5.27のServletContext
Posted by hikaruworld : 2008 11月 11
Tomcat5.5.25までは、javax.servlet.ServletContextクラスの次のメソッドに関しては、
サーブレット仕様に完全に準拠していないらしい。
ServletContext.getResource()
ServletContext.getResourceAsStream()
上記のjavadocでは以下のように記述されている。
指定されたパスにマップされたリソースへの URL を返します。パスは “/” で始まる必要があり、現在のコンテキストルートへの相対パスとして解釈されます。
つまり、web.xmlに以下のような記述をした場合はNGになるはずである。
※velocity-propertiesの設定をしているのは、業務でこの部分ではまったためで特別な意味はない。
<web-app> <!-- 省略 --> <context-param> <param-name>velocity-properties</param-name> <param-value>WEB-INF/classes/velocity.properties</param-value> </context-param> <!-- 省略 --> </web-app>
しかしながら、Tomcat5.5.25であれば起動時に警告すら出ずに問題なく起動してしまう。
2008/11/04 14:11:57 org.apache.catalina.storeconfig.StoreLoader load
情報: Find registry server-registry.xml at classpath resource
2008/11/04 14:11:57 org.apache.catalina.startup.Catalina start
情報: Server startup in 11479 ms
この問題は、Tomcatでも5.5.23の時点で、bugとしてBugzillaに報告されている。
ただ、たいしたバグじゃなかったためか(そりゃ、基本的にみんな仕様にのっとって実装しているはずだからさ(-)、
5.5.24、5.5.25では修正されなかったようだが、5.5.26でfixされているのだ。
これではまる。
新規環境をTomcat5.5.27で環境構築して起動したところ、こんなエラーでアプリケーションが起動しない。
致命的: Error listenerStart
2008/11/10 19:47:37 org.apache.catalina.core.StandardContext start
致命的: 以前のエラーのためにコンテキストの起動が失敗しました [/trunk]
2008/11/10 19:47:37 org.springframework.context.support.AbstractApplicationContext close
情報: Closing application context [Root WebApplicationContext]
それで設定ファイル周りを見ていると、/がもれていることに気がつき、
以下のように修正を行う。
<web-app> <!-- 省略 --> <context-param> <param-name>velocity-properties</param-name> <param-value>/WEB-INF/classes/velocity.properties</param-value> </context-param> <!-- 省略 --> </web-app>
結局は、これで無事起動した。
単純なミスだったんだけど、めちゃくちゃ長いweb.xmlからこの設定漏れに気がつくのは苦労した。
Tomcatのこのバグははじめて知ったんだけど、もしかして周知のネタなんだろうか。。。
以下、余談。
「誰が犯人だ、くそぅ!!」と思って履歴をたどってみると、昔の自分だった。涙目。
今日の2時間を使うことになった昔の自分が恨めしい。
コメントを残す