クラスファイルが変更されるたびにTomcatサーバーを再起動する必要があるのはなぜですか?他に方法はありませんか?
Tomcatを構成して、Webアプリケーションを「リロード可能」にすることができます。これを行うには、Webアプリのreloadable=true
要素に<Context>
を追加します。 reloadable
属性について、 documentation は次のように述べています。
Catalinaで
/WEB-INF/classes/
と/WEB-INF/lib
のクラスの変更を監視し、変更が検出された場合はWebアプリケーションを自動的に再読み込みする場合は、true
に設定します。この機能はアプリケーション開発中に非常に役立ちますが、実行時にかなりのオーバーヘッドが必要になるため、デプロイされた本番アプリケーションでの使用はお勧めしません。そのため、この属性のデフォルト設定はfalseです。ただし、 Manager Webアプリケーションを使用して、デプロイされたアプリケーションのリロードをオンデマンドでトリガーできます。
確かにあります! Tomcatを開発モードで起動すると、各Webアプリケーションは再デプロイされると自動的に再起動します。
Tomcatのドキュメントから:
Jasperを実装するサーブレットは、グローバル$ CATALINA_BASE/conf /web.xmlのinitパラメーターを使用して構成されます。
.。
開発-Jasperは開発モードで使用されていますか(アクセスごとにJSPの変更をチェックします)? trueまたはfalse、デフォルトはtrue。
更新を確認するためにTomcatが正確に何を検索するかを調整するために変更できる設定があります。私は通常、個々のクラスファイルをWEB-INF/classes
の下の適切なディレクトリにデプロイしてから
touch WEB-INF/web.xml
アプリケーションの再起動を開始します。 web.xml
は、Tomcatがデフォルトでチェックするファイルの1つだと思います。
より一般的な注意点として、これを行う必要がある理由は、Javaでは、クラスローダーがクラスをロードするときに、クラスをアンロードできないためです。 Tomcatがしなければならないことは、新しいクラスローダーを使用して、必要なすべてのクラスをリロードすることです。
チェックアウト JRebel 。
開発する場合、IDEは、適切なサーバー上でこれを透過的に実行できるはずです。たとえば、Eclipseの動的Webプロジェクトは、Tomcatとの通信方法を知っています。
デプロイする場合は、WARファイルを作成してデプロイします。 Tomcatは、WARファイルを再デプロイする方法を知っています。
Server.confでautoDeploy = trueを設定することに加えて、共有クラスローダーにクラスを配置しないように注意する必要があります。共有クラスローダーによってロードされたクラスは、再ロードできません。
あなたの質問は、あなたが本番のダウンタイムを心配しているのか(つまり、クラスをリロードすることによってそれを減らすのか)、それともノンストップの開発が必要なのかを実際には述べていません。そこで、以下の点を使って明確にしようと思います。
1)<Context reloadable=true...
ディレクトリでcatalina.home/conf
を使用すると、クラスが変更されたときにWebアプリが確実に再ロードされます。 <WatchedResources>
要素にリソース変更ウォッチリストを追加できます。
2)ただし、これによりコンテキストが再ロードされ、クラスローダーが再初期化され、キャッシュが空になり、すべてがWebアプリケーションが開始されたばかりのようになります。
このアプローチでは、サーブレットのコンテキストをリロードしたため、サーバーは引き続き使用できなくなります。本当の「リロード」は
1)クラスのバイトコードを交換しますが、いくつかの制限があります。2)そのクラスローダーに対して「loadClass()」が呼び出されると、JVMはそのクラスを返します。
これはJavaインストルメンテーションです。開始時または実行中にJVMにフックできる独自のエージェントを作成できます。ただし、新しいメソッドを定義したり、静的変数を変更したりすることはできません。これらはJVMです。ネイティブ制限(私が知っているOracle HotSpot JVMの場合)別のJVM、たとえばそのような制限のないDCEVMを使用できます。したがって、問題をどのように処理するかはあなた次第です。何をしているのかがわかっている場合(!)、クラスを1つずつ置き換えることで回避できます。また、「真新しいクラス」を定義し、既存の/ロードされたクラスでそのクラスオブジェクト/メソッドを参照し、変更を取得するためにインストルメント化することもできます。
これがお役に立てば幸いです。ここでのすべての答えは、あなたがあなたの決定をするために必要なものです。
WARファイルを使用してデプロイしている場合は、Tomcat構成でautoDeploy=true
を設定できます。これにより、TomcatはWebアプリケーションルート(デフォルトでは「webapps」)で新しいまたは変更されたWARファイルを監視します。そのようなファイルが見つかると、自動的に展開されます。
ただし、Pascal Thiventが言ったように、Tomcat Managerアプリケーション(/ manager/html)を使用して、特定のアプリケーションを開始、停止、デプロイ、およびアンデプロイできます。変更するファイルが特定のアプリケーションにある場合、これはTomcatに変更を認識させるための良い方法です。