web-dev-qa-db-ja.com

eclipse / Tomcat:デプロイが機能しなくなった(ClassNotFoundException)

Linux Ubuntu Natty NarwhalでTomcat 7.0.12を使用してEclipse Helios Service Release 1を実行しています。

明らかに理由もなく動作が停止するまで、webappを再デプロイして喜んで熱心に取り組んできました。次の例外が表示されます。

SEVERE: Allocate exception for servlet Index
Java.lang.ClassNotFoundException: obliquid.servlet.Index
    at org.Apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.Java:1676)
    at org.Apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.Java:1521)
  • [Servers]タブで、[ローカルホストのTomcat v7.0サーバー[開始済み、同期済み]
  • 私のプロジェクトはTomcat v7.0サーバーの子として表示されます
  • プロパティでは、Java Build Path、Source I'veProject/srcSource folder
  • [プロパティ]、[Web Deployment Assembly]に、次のマッピングがあります:/ WebContent->// src->/ WEB-INF/classes/ test->/ build/classes
  • 私のsrcディレクトリには、obliquid/servlet/Index.Javaにサーブレットが含まれています
  • モジュール作業ディレクトリのクリーン...およびPublish
  • Eclipse Serversタブ内からサーバーを停止および起動しようとしました

他に何を確認する必要がありますか?ありがとうございました。

[〜#〜] update [〜#〜]新しいプロジェクトで作業しているにもかかわらず、古いプロジェクトをチェックするために戻ってきましたが、不思議なことに今は動作しています。私は何が起こったのか見つけることができないと思います。

しかし、今日の新しいプロジェクトでは、明確な理由もなく404エラーが発生したため、Tomcatサーバーを右クリックして[クリーン...]を選択すると便利であることがわかりました。たぶん助けたかもしれません。

「クリーン...」を選択すると、「クリーンするとすべての公開状態が破棄され、最初から再公開されます。公開されたすべてのリソースを削除してもよろしいですか?」はいを選択して、問題を解決しました

PDATE 2新しいプロジェクトで再び起こりました。 404エラー、今度は消えません。

Stop -> Clean... -> Start (404)
Stop -> Clean Tomcat Work Directory... -> Start (404)
Stop -> Clean Tomcat Work Directory... -> Clean... -> Start (404)
Stop -> Remove on the application ->  Clean... -> Run As -> Run on Server -> (404)  
Exit Eclipse, Start Eclipse
Start the server -> (404)

PDATE今回は、起動時のリスナークラスに起因する例外に気付かなかったことが判明しました。問題を解決した後、機能しました。午前3時に仕事をやめるべきだと思います。

22
stivlo

Tomcat 6とEclipse Ganymedeで、次のようなチェーンがチャームのように機能することがわかりました。

1停止サーバー

2プロジェクト->クリーン

3プロジェクトビルド(自動ビルドを無効にしました)

4サーバーの削除

5サーバーフォルダーの削除

6 Eclipseを再起動します

7新しいサーバーを作成し、プロジェクトを追加して開始:)

時間がかかりますが、魅力のように働きました。私の問題は、刺激的なリスナー起動の問題でしたが、これは似たようなもののようです:Tomcatのプロパティ。 Btw:最近はGlassfishの大ファンでもあります。

37
mico

私はこの手順が役立つことがわかりました:

  • Serversタブをクリックし、実行中のサーバーを停止します
  • サーバーをもう一度右クリックして、Clean ...を選択します
  • もう一度右クリックして、Tomcat Work Directory ...を選択します

うまくいけば、ClassNotFoundExceptionが消えるはずです。

サーバーの起動時に起動されるクラス、リスナークラス(ServletContextListener)の例外で問題が発生しました。 ServletContextListenerが起動中に例外を発生させると、アプリケーションのデプロイメントが中止されるため、404エラーが発生します。その場合、例外の原因となった問題を修正して、アプリケーションを再び動作させました。

[〜#〜] edit [〜#〜]:この短い手順はほとんどの場合うまくいきましたが、今日は機能せず、Micoの拡張手順に従う必要がありました。同様の問題がある場合は、まずこの短い手順を試してください。問題が解決しない場合は、Micoで試してください。

12
stivlo

Tomcatサーバーを停止してから再起動することをお勧めします。ホットデプロイは永久に機能しません。いくつかの再デプロイ後に再起動する必要がある問題がいくつかあります。

2
duffymo

accepted+ 25と答えるのは本当にそれなのか正確な

最初にサーバーを削除する場合、次にそれをクリーニングするポイントは何ですか?それは不必要に時間をかけるであり、有用なものは何も得られません。

だから私はちょうど言う5、6、7ステップは魔法を行う必要があります

5サーバーフォルダーの削除

6 Eclipseを再起動します

7新しいサーバーを作成し、プロジェクトを追加して開始

これは con-fess 2011 で学んだことかもしれません。私にとって、これはクラスローダーの問題のように聞こえます。

背後にある理論:

  • Javaは、クラスの型だけでなく、クラスのインスタンスを識別するためにそれをロードしたクラスローダーも使用します。これは、単純な操作が失敗する可能性があることを意味します。

    ClassA a1 = new a1; ClassA a2 = SomeOtherClass.giveMeInstanceOfA(); a1 = a2;

SomeOtherClassが異なるクラスローダーを使用している場合、Javaはそれらが同じではないと言うため、この例は失敗します。

  • スピーカーは、一部のサーバーがデフォルトで約45の異なるクラスローダーを使用することにも言及しました。

これは実際にはどういう意味ですか:

Webアプリケーションをサーバーにデプロイすると、すべてが正常に実行されます。サーバーは、クラスと、それらをどこかにロードするために必要なすべてをキャッシュします。ホットデプロイメンを作成すると、サーバーは新しい(または異なる)クラスローダーで新しいクラスをロードできます。これは、これから同じメモリに2つの異なるクラスがあるため、危険になり始めるポイントです。キャスト(ClassA a =(ClassA)new ClassA())などの単純な操作は失敗し、クラス内の新しいメソッドは見つかりません(サーバーはこのメソッドなしでキャッシュバージョンを取得するため)。

これが、サーバーを再起動し、作業ディレクトリを消去して(キャッシュされたバージョンを削除する)ポイントであり、ホットデプロイメントを重要なものとして考え始めます。

Mikkosプロシージャを試してみて問題を解決できる場合は、この説明が原因を理解するのに役立ちます。

これはあなたの問題を解決するものではないことを知っていますが、おそらく何が起こったのかというヒントを与えてくれるかもしれません。

1
monty

プログラミングに関する新しい経験を積んだので、EclipseとTomcatの組み合わせに飢えていることはもうありません。ここでいくつかの方法が、その組み合わせの使用の必要性からあなたを助けることができます:

まず第一に、それらを一緒に使用しないでください!

  • 他の利用可能なIDEを使用できます。 IntellijIdea(これは無料ではありませんが、投資する価値があります)には、Javaコードをデバッグするときにコードをオンザフライで変更し、Javaファイルを1つずつコンパイルできるプロパティがありますサーバー上で更新するかどうかを提案します。再起動はほとんど必要ありません(もちろん、時々失われますが、主に動作します)。

  • Eclipse/IDE内ではなく、スタンドアロンのTomcatサーバーを使用します。この最初のトリックは、外部サーバーをデバッグするときにのみ機能し、IDE内では何もしません。 2番目のヒントがあります:jspまたはhtmlコンテンツのみを変更する場合、unix cpまたはwindows copyコマンドを使用してTomcatのwebappフォルダ内の適切な場所にそれらのファイルをコピーし、同じフォルダで長時間ファイルを開発する場合、フォルダコンテンツ(myFolder/*。jspなど)を何度でもコピーでき、再起動はまったく必要ありません。 webappsフォルダー内のweb.xmlファイルをタッチまたは編集して保存し、その後ブラウザーの表示ページを更新すると、変更が表示されます。おそらく、CTRL + F5によるハードリフレッシュが最善の方法です。

彼のコメントについての@Verdanのおかげで、そうでなければ私は再び答えに戻ってこなかっただろう。

1
mico

私は現在、同じ問題に苦しんでいますが、ここで言及したことは何も助けにはなりません。とにかく、もし私が:

  1. eclipseでサーバーを停止する
  2. 他の場所でTomcatを実行します(私の場合はxampディストリビューション)
  3. 現在実行中のTomcatを停止します
  4. eclipseでTomcatを起動します

もちろん、コード内の何かを変更して、もう一度テストするまで、すべてが正常に機能します。

0
vanomart

Mavenの性質を無効にすることでこれを解決できました(プロジェクト>> maven >> Mavenの性質を無効にする)。その後、再度有効にします(プロジェクトを右クリック>>構成>> Mavenプロジェクトに変換)。上記の他のすべてのヒントとコツを試しましたが、これが最終的に機能しました。

0
Bobby King

Tomcatのホットデプロイメントといえば、実際にはさまざまな問題が発生しますが、その少なくともメモリリークは、アプリケーションを再起動する必要がある理由です。 「変更を加えて保存し、ブラウザを更新してすぐに変更を確認する」という迅速な対応のためにJRebelを試すことをお勧めします。 JRebelハンズオンラボは、TomcatおよびEclipseで使用する方法を示しています。 http://www.javapassion.com/rebels/jrebel_basics/

0
Sang Shin

私は同じ問題に直面していました-上記のすべてを試してみました。サーバーをすべて起動しようとすると、Eclipseは常にフリーズしました。すべてのサーバー設定を削除し、新しくダウンロードしたTomcatインスタンスで新しい設定を作成した後でもです。とにかく、新しいワークスペースに移動してプロジェクトを再インポートし、新しいサーバーを作成するまで、問題は解決しませんでした。私にはEclipseのバグのようです...だから何も機能しない場合、これは行く方法です...

0
user871784