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
という順に見えているはずなのだが。何が間違っているのだろう。