3

なぜ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/。ご協力ありがとうございました!

4

3 に答える 3

7

Webアプリケーションで必要なクラスは、Webアプリケーション内のWEB-INF / classesフォルダーに配置するか、WEB-INF/libにあるJARファイルにパックする必要があります。試みているように見えるので、通常、これにはサーブレットコンテナの汎用クラスパス設定を使用しないでください。

于 2009-10-23T11:50:45.597 に答える
7

Tomcat のクラスパスは で始まるべきではありません.。実際、クラスパスへの追加は、コマンドラインで使用するときに使用すること.なく、現在のディレクトリでクラスを探すように Java に指示する便利な方法です。-cp

実際、ほとんどの場合、Tomcat のクラスパスを微調整する必要はありません。Tomcat がクラスを見つけられるようにするには、特定のレイアウトを持つ標準化された WAR (Web アーカイブ) としてアプリケーションをデプロイする必要があります。そんな感じ:

.
|-- WEB-INF
|   |-- classes
|   |   `-- com
|   |       `-- mycompany
|   |           `-- MyServlet.class
|   |-- lib
|   |   |-- bar.jar
|   |   `-- foo.jar
|   `-- web.xml
|-- application.jsp
|-- image.gif
`-- index.html

ディレクトリは、WEB-INF/classesコンパイルされたクラスが必要な場所であり、Tomcat がそれらを探す場所です。クラスを に配置するWEB-INF/classes/controllerscontrollers、 はパッケージ名の一部と見なされます (これはおそらく望ましくありません)。したがって、次の 2 つのオプションがあります。

  1. controllersそのディレクトリを削除します
  2. またはパッケージ名に追加します。

しかし、それらは相互に排他的であり、両方を持つことはできません。

于 2009-10-23T13:05:28.070 に答える
2

CLASSPATHで始まることは「想定」されていません"."。その目的はランタイムの構成であるため、選択した任意の値を自由に取ることができます。CLASSPATHまた、環境変数の使用は、Java 1.1 (1997 年初頭にリリース) から少なくとも 12 年間推奨されていないことに注意してください。

一方、Web アプリケーションのクラスパスは明確に指定されています。ディレクトリ (およびその他の無効なサブディレクトリ)の内容を に移動して、パッケージ ディレクトリが の直接の子になるようにします。controllersWEB-INF/classes/classes

于 2009-10-23T14:40:09.157 に答える