Tomcat6.07β

まあβなので仕方が無いのだが、備忘の為にもメモ。

アプリケーションのデプロイは成功する(これだけでも嬉しい)のだが、その後起動すると以下の例外を吐く。

java.lang.NoClassDefFoundError: javax/servlet/Filter
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
         : 略

もしくは

ava.lang.NoClassDefFoundError: javax/servlet/ServletContextListener
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
         : 略

servlet-api.jarは%CATALINA_HOME%/Libにあるのだが、デフォルトでは全くパスが通っていないようだな。

追記:

私は新たなサーバを試す時には"jar-hell"を避ける為に、CLASSPATH変数の見直しと、全ての不要なjarを削除するので該当しないはずだが、こんなFAQもある。

Why do I get java.lang.NoClassDefFoundError: javax/servlet/Filter? / Tomcat FAQ

特にservlet.jarやj2ee.jarは到るところにコピーされているし、javaxの名前空間もいろいろなjarにあったりするので、非常に注意が必要だ。アーカイブが使える分、"DLL-Hell"よりやっかいかもしれない。

追記:
やはりおかしい。根本的に何かを間違っている気がする。

Tomcatのクラスローダは6.xの場合

  • Bootstrap
  • System
  • Common
  • WebappX

という階層であり、上位への委譲は行われない。その上でデプロイされたWebアプリケーションには、

1. JVM のブートストラップクラス 
2. System クラスローダの各クラス 
3. Webアプリケーションの /WEB-INF/classes 
4. Webアプリケーションの /WEB-INF/lib/*.jar 
5. $CATALINA_HOME/lib/
6. $CATALINA_HOME/lib/*.jar 

という順に見えているはずなのだが。何が間違っているのだろう。