2

わかりました、ここに状況があります:

3 つのファイルがあります。 1. TScan.java 2. Test.java 3. ScanServlet.java

TScan.java ファイルにメール クラス TScan を記述します。そのクラス内には、TEntry というネストされたクラス (サブクラスではない) があります。TScan には、テストに使用される main() と、ネストされた TEntry クラスを問題なく使用するその他のメソッドがあります。

また、Test.java は、TScan および TEntry クラスを含む TScan.java の項目を問題なく使用する、より洗練されたテスト プログラムです。TScan.java と Test.java は Eclipse で開発およびテストされました (コマンド ラインからも正常にコンパイル/実行されます)。

そのため、TScan は有用な点まで機能しており、私はそれを Web アプリケーションに含めたいと考えていました。Jetty をインストールし、Jetty で実行される ScanServlet.java を作成しましたが、問題はありませんでした。

TScan の参照を開始すると、TScan に対して上記のエラーが発生し始めました。TScan.class ファイルを含めるように ClassPath を変更してもうまくいかなかったので、JAR ファイルを作成して WebApp の WEB-INF/lib/ フォルダーに貼り付けたところ、ScanServlet は filen をコンパイルし、実行時に TScan を見つけたようです-time ですが、実行時に NoClassDefFounfError TScan$TEntry が発生します。以下の理由から、これは私には意味がありません。 TScan を除いて直接参照)、スタンドアロン モードで正常に動作します! 3. TEntry を公開しましたが、まだ動作しません。

NoClassDefFoundError に関する多くの質問を見つけましたが、ネストされたクラス、特に Jetty を扱っているものはありません。

私は、コンパイルすれば実行される Delphi に慣れていることを覚えておいてください。(そして多かれ少なかれ同じであるABAP)。

誰かが解決策を持っている場合、私はわくわくします。そうでない場合は、次のことを検討しています:

  • TScan 全体を ScanServlet にコピーして貼り付けます (同じファイル内にある場合は、問題なく見つけることができるはずです!) (あまりモジュール化されていません)
  • TEntry を別の .java ファイル内の別のクラスに移動しますか? (きれいに抽出するのは面倒かもしれません)。
  • ScanServlet で TScan.Java をコマンド ライン プログラムとして呼び出します。(遅い...)
4

2 に答える 2

3

jar ファイルをどのように作成し、TScan$TEntry.class が正しいフォルダーに含まれていますか?
内部またはネストされたクラスは、出荷する必要がある .class ファイルを生成します

于 2012-07-01T13:27:43.857 に答える
0

厳密さと慣習を開発に適用する正式なビルドツールを使用していないため、足を引きずっているように見えます。少数のクラスを管理する場所と方法をいじる前に、必要なものを含む jar ファイルを生成する実際のビルド システムの使用を開始します。Maven、Ant、Buildr など、なんらかの規則や構成を適用するもの。実行可能であると想定されているものをコンパイルまたはエクスポートするという点で、IDE が提供するものを活用しないでください...その寝台を信頼することはできません。

適切なビルド メカニズムと、理想的には宣言的な依存関係などを使用すると、反復的な方法で問題に対処して NCDFE を解決できます。少なくとも私の2セント

[編集] 特定の問題については、webapp クラスローダの設定に問題があると思われます。デフォルトでは、/lib のクラスは webapp コンテキストに公開されません。webapp コンテキストで ParentLoaderPriority を true に設定するか、クラスを war ファイルとしてバンドルする必要があります。また、cli で --dry-run を使用して、jetty によってロードされている jar ファイルを整理します。

于 2012-07-02T13:16:27.243 に答える