ひよっこ。

I want to…

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時間を使うことになった昔の自分が恨めしい。

コメントを残す