web-dev-qa-db-ja.com

IntelliJおよびTomcat ....変更されたファイルはTomcatによって自動的に認識されません

TomcatでIntellij Ultimateを実行し、戦争を展開しています。すべてがTomcatのwebappディレクトリに正常にデプロイされます。

Xhtmlファイルのようなファイルを変更するとき、Tomcatがその変更を自動的に取得する方法はありますか?現時点では、intellijからファイルをコピーし、Tomcat webappディレクトリ内のディレクトリにコピーする必要があります。再コンパイルが必要な特定のファイルがあることは知っていますが、xhtmlはそれらの1つではありません。

124
Peter

IntelliJ IDEAで戦争を展開する場合、これは実行できません。ただし、expanded warを展開する場合、canになります。 IDEAの場合:

  1. tomcatの実行/デバッグ構成を開きます(Run> Edit Configurations
  2. 「展開」タブに移動します
  3. [サーバーの起動時に展開]セクションで、アーティファクトmy-webapp-name:warを削除します(存在する場合)
  4. 追加アイコンをクリックし、「アーティファクト」を選択してからmy-webapp-name:war explodedを選択します
  5. [OK]をクリックします([展開するアーティファクトの選択]ダイアログで)
  6. 実行/デバッグ構成ウィンドウで、「サーバー」タブを選択します
  7. そのタブの中央で、[オンフレームの非アクティブ化]設定を[リソースの更新]または[クラスとリソースの更新]に変更します
    • リソースの更新:変更されたすべてのリソース(つまり、クラス以外のすべてのアプリケーションコンポーネント)が更新されます。
    • クラスとリソースの更新:変更されたすべてのリソースが更新されます。変更されたクラスは再コンパイルされます。実際のクラスが更新されるかどうかは、機能Webサーバーに依存することに注意してください。私が思い出すと、Tomcatはhtml/xhtmlおよびjspファイルをリロードしますが、JSPまたはサーブレットが使用するサーブレットまたはクラスはリロードしません。そのために動的クラスローダーを使用するには、Tomcatを変更する必要があります。
  8. また、「On 'update'」アクションを上記で選択したアクションに設定することもできます。
    • これにより、更新を押すとどうなるかが決まりました Update icon アイコン(または Ctrl+F10)[実行]ウィンドウで。
    • 「ダイアログを表示」は、更新アイコンを押すたびにIDEAプロンプトを表示するかどうかを決定します
  9. OKをクリックします。

これで、変更を加えるときはいつでも、IDEAはIDEAのフレームが非アクティブ化された(つまり、フォーカスを失った)ときに変更されたファイルを再デプロイします。これには1〜2秒かかります。IDEAの下部のステータスバーに表示されます。明らかに。 Webブラウザーを更新して新しいファイルを取得する必要があります(もちろん、ページに取得のようなajaxの自動更新がある場合を除きます)。

Tomcatとの適切な組み合わせは、「On frame deactivation」を「Update Resources」に設定し、「On 'update」アクションを「Redeploy」または「Restart Server」に設定することです。 「更新」アクションを介して更新されたクラス。

ZeroTurnaroundという名前の会社は、動的クラスローダーソリューションである JRebel を販売しています。また、 テーマに関する5つのパートシリーズ もあり、これは非常に優れています。

269
Javaru

スクリーンショットを使用してアクションのシーケンスを説明します。

  1. Tomcat実行/デバッグ構成を開きます(実行>構成の編集)

enter image description here

  1. 追加アイコンをクリックし、「アーティファクト」を選択してからpizza_mvc:war explodedを選択します: enter image description here

  2. 「更新アクション時」および「フレームのアクティベーション時」を変更します: enter image description here

  3. リソースを更新するたびに、<Ctrl> + F10を押します

17
Lord Nighton

クラスとリソースを更新する場合は、デバッグモードTomcatを実行します。このモードでは、IntelliJクラスとリソースを問題なく更新します(ホットスワップ)。

同じ問題になりました。 IntelliJは、「実行モード」として実行するため、プロジェクトを更新しませんでした。 デバッグモードで実行して Ctrl+F10、クラスとリソースを更新します。

11

もっと良い方法を見つけました。

Eclipseでは、静的ファイルを自動的にビルド、コンパイル、リロードします。実際には、静的ファイルはsrc/main/webappから直接提供されます。

IntelliJでは、src/main/webappから直接提供する代わりに、ターゲットに作成されたフォルダーで、src/main/webappのコピーとその他のコンテキスト関連の.. web-inf /があります。クラス/ lib。

ターゲットの代わりに展開されたアーティファクトの出力をsrc/main/webappに配置すると、ソースファイルは上書きされず、直接提供されます、あなたはヒットする必要はありません-リソースの更新/リソースとクラスの更新

したがって、IntelliJで行う必要があるのは

  1. 展開されたアーティファクトの出力ディレクトリをsrc/main/webappに変更します enter image description here
  2. ダーティクラスを保存および再コンパイル/コンパイルするためのマクロを作成します(cmd + shift + f9) enter image description hereenter image description here
  3. レジストリと設定を編集して、自動的にビルドし、アプリの実行中にビルドします(cmd + shift + a-レジストリ)。 enter image description hereenter image description here

この後、IntelliJの外部から静的ファイルを変更するジョブがある場合、IntelliJに移動せずにすぐに変更が表示され、リソースを更新します、およびクラス保存してコンパイルするマクロがあります(注:Compile/Recompileを押すこともできます:cmd + shift + F9/cmd + F9-開いているエディターが複数ある場合、ダーティー*エディターはダーティーではないことがわかります。変更(クラス)がリロードされます)

1
Radu Toader