サービス全体を再起動せずにTomcat Webアプリケーションを更新するにはどうすればよいですか?


93

私は初めてですTomcat。約5つのアプリが実行されている開発マシンがあります。devですが、テスト中にクライアントがかなり頻繁に使用しています。

したがって、1つのクラスファイルに1つの小さな変更を加える必要があるとしましょう。現在、Tomcatをシャットダウンし(他の4つのアプリに影響を与えます)、WARファイル(およびWebアプリディレクトリ)を削除し、新しいWARファイルを再デプロイしてを再起動する必要がありTomcatます。

もちろん、これはすべてのアプリのすべてのログインセッションを破棄するため、一部の人を混乱させます。

これを行うより良い方法はありますか?つまり、開発マシン上のすべてではなく、変更されたクラスのみをリロードする方法はありますか?

ありがとう。


セッション管理をファイルに残るものに変更しますか?申し訳ありませんが、抵抗できませんでした:)
rogerdpack

1
@rogerdpack 6年以上前にこの質問をして以来、Tomcatについて多くのことを学びました。とにかくありがとう。
cbmeeks 2017年

クラスのみのホットスワップについては、stackoverflow.com
questions / 32459047 /…を

回答:


59

TomcatのManagerアプリケーションを使用しようとしましたか?Tomcatをシャットダウンせずにwarファイルをアンデプロイ/デプロイできます。

Managerアプリケーションを使用しない場合は、webappsディレクトリからwarファイルを削除することもできます。Tomcatは、しばらくするとアプリケーションをアンデプロイします。その後、warファイルをディレクトリにコピーして戻すと、Tomcatがwarファイルをデプロイします。

WindowsでTomcatを実行している場合は、さまざまなファイルをロックしないようにコンテキストを構成する必要があります。

ダウンタイムが絶対にない場合は、Tomcat 7の並列デプロイメントを確認することをお勧めします 。同じコンテキストパスを使用して、Webアプリケーションの複数のバージョンを同時にデプロイできます。リクエストをコンテキストバージョンに一致させるために使用されるルールは次のとおりです。

  • リクエストにセッション情報が含まれていない場合は、最新バージョンを使用してください。
  • リクエストにセッション情報が含まれている場合は、各バージョンのセッションマネージャで一致するセッションを確認し、見つかった場合はそのバージョンを使用します。
  • リクエストにセッション情報が含まれているが、一致するセッションが見つからない場合は、最新バージョンを使用してください。

それも良い提案です。今日まで、マネージャーアプリについて聞いたことがありません。はい、Windowsを使用しています。私がWARファイルを削除して待機していることに関する1つの懸念は、クライアントが頻繁に「小さな修正」を期待していることです。それらの提案はそのシナリオで機能しますか?
cbmeeks

1
@cbmeeks-これらの小さな修正が発生する頻度と、誰かが気付くまでの時間によって異なります。どちらの場合も、アプリケーションが利用できない時間が少しあります。それはあなたのハードウェア/アプリケーションにどのくらいの時間がかかるかによります。しかし、それは秒単位で測定され、私は通常、アプリケーションで5〜10と言います。しかし、マイレージは異なる場合があります:)
Steve K

1
ワオ。この質問をして以来、多くのことを学びました。はい、Tomcatを完全に停止することなく、Tomcatアプリをデプロイできるようになりました。私がしたことの1つは、すべてのログ(アプリとTomcat)がwebapps / applicationフォルダー内のログを記録しないことを確認することでした。または、ロックしないようにTomcatを構成することもできます。そのため、ログはTomcatのフォルダーの外の中央の場所に配置しました。夢のように機能します。しかし、あなたの答えが最も役に立ちました。ありがとう!
cbmeeks 2013年

5
再起動せずに再デプロイする場合は、メモリリークに注意する必要があります。多くの場合、クラスローダーが参照をリークし、古いバージョンのアプリケーションからメモリを解放するためにTomcatプロセス全体を再起動する必要があります。LiveRebel(別の回答で言及)は、それらすべてを自動化できます。
Neeme Praks 2013年

3
再デプロイするためにwarを削除する必要はありません。古い戦争をコピーして数秒待ちます。
peceps 2014年

30

複数の簡単な方法があります。

  1. 任意のwebappのweb.xmlをタッチするだけです。

    touch /usr/share/tomcat/webapps/<WEBAPP-NAME>/WEB-INF/web.xml
    

WARファイル全体をビルドして再度デプロイするのではなく、WEB-INF / lib内の特定のjarファイルを更新してからweb.xmlを操作することもできます。

  1. webapps / YOUR_WEB_APPディレクトリを削除すると、Tomcatは5秒以内にwarの展開を開始します(warファイルがwebappsフォルダーにまだ存在していると想定しています)。

  2. 通常、warファイルを新しいバージョンで上書きすると、tomcatによって自動的に再デプロイされます。そうでない場合は、上で説明したようにweb.xmlを変更できます。

  3. 既に展開されている「ディレクトリ」をwebappsフォルダーにコピーします


1
'touch'メソッドはクラスを再ロードしないことを知るのに役立ちます。IOW、それはwebappのクラスローダー階層をパージしてリロードしません
Rondo

2
この作品はで読むことができる理由を見て$CATALINA_BASE/conf/context.xml。WEB-INF / web.xmlは変更が監視されます。他のリソースは、必要に応じて簡単にリストできます。
Kevin

21

Apache Tomcatのconfディレクトリに、context.xmlファイルがあります。その編集タグで< Context reloadable = "true" >として。これで問題が解決し、サーバーを再起動する必要はありません


代わりにマネージャアプリケーションを使用してください。これは、RAMにとってコストのかかる操作です。
ソーター、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.