なぜjava.lang.NoClassDefFoundError
.
以下のコードを使用して、パス変数が保持するものを確認しました。
out.println("Classpath: '" + System.getProperty( "java.class.path" ) + "'" );
out.println("Ext dirs: '" + System.getProperty( "java.ext.dirs" ) + "'" );
out.println("Library path: '" + System.getProperty( "java.library.path" ) + "'" );
out.println("Path separator: '" + System.getProperty( "path.separator" ) + "'" );
出力は次のとおりです。
クラスパス: ':/usr/local/tomcat/bin/bootstrap.jar' 外部ディレクトリ: '/usr/lib/jvm/java-6-sun-1.6.0.16/jre/lib/ext:/usr/java/packages/lib/ext' ライブラリ パス: '/usr/lib/jvm/java-6-sun-1.6.0.16/jre/lib/i386/server:/usr/lib/jvm/java-6-sun-1.6.0.16/jre/lib/ i386:/usr/lib/jvm/java-6-sun-1.6.0.16/jre/../lib/i386:/usr/java/packages/lib/i386:/lib:/usr/lib' パス区切り: ':'
ご覧のとおり、クラスパスは "." で始まりません。それが想定されているとおりであり、それが私のプログラムが私の webapp のサブディレクトリからインポートしたクラスを見つけられない理由だと思います。
クラスパスがどこに設定されているかを確認するために、私はやったgrep -R bootstrap.jar /usr/local/tomcat/
、そしてこれに出くわした:(CLASSPATH="$CLASSPATH":"$CATALINA_HOME"/bin/bootstrap.jar
ファイル内/usr/local/tomcat/bin/catalina.sh
)
これは、何らかの理由で $CLASSPATH がここで空であると信じさせます。しかし、echo $CLASSPATH
正常に戻ります.:/usr/lib/jvm/java-6-sun/bin:/usr/local/tomcat/lib/servlet-api.jar
ここで問題を突き止めるのを手伝ってくれる人はいますか?
編集:すべてのサーブレット ファイルは にWEB-INF/classes/controllers/
あり、読み込もうとしているライブラリはサブディレクトリのクラス ファイルです。たとえば、ClassName.class
が WEB-INF/classes/controllers/packagename/ ディレクトリにある場合package packagename
、 の先頭に追加し、inClassName.java
を使用してインポートします。import packagename.*
someServlet.java
EDIT2:私は私の問題を解決しました。私の主な問題は、以下に示すように、正しいパッケージ名を使用していないことでした。また、からコンパイルするのでclasses/controllers/
はなく、ディレクトリ内からコンパイルしようとしていましたclasses/
。ご協力ありがとうございました!