免責事項: 私は JRebel の開発に携わっているため、私の回答は少し偏っているように見えるかもしれませんが、説明するために最善を尽くします。
この質問に答えるために、最初にリストした名前の主な違いの 1 つは、アプリケーションの設計を変更する必要があるソリューションとそうでないソリューションがあるという事実に注意を向けたいと思います。
OSGiやJBoss モジュールなどのモジュール化ソリューションは、正しい道をたどってアプリケーションをモジュール化する場合にメリットをもたらします。それ以外の場合、1 つのサイロ バンドルを展開すると、基本的にアプリケーション全体を再起動/再展開することになり、このアプローチから得られるメリットが減少します。
Play フレームワークは、実際にはホット デプロイメント機能を備えたフルスタック フレームワークです。これらの機能は、使用するフレームワークのバージョンによって異なります。ただし、モジュール性と同じ話です。フレームワークは特定のプログラミング モデルを強制します。
Apache Commons JCIは、実際にはコードをホット アップデートするためのソリューションではありません。私の知る限り、新しいクラスローダーを介してクラスをコンパイルしてロードするだけです。これには、上記の場合と同様に、アプリケーション コードの変更も含まれます。それが良いか悪いかはよくわかりません。欠点は、この方法ではエコシステムとの広範な統合がほとんどできないことです。このアプローチは、この機能を利用する自作のフレームワークにはかなり適しています。私自身、Groovy、JRuby、JavaScript などのスクリプト言語を使用して同じことを達成したいと考えています。たとえば、このようなもの。
JRebel、Fakereplace、およびDCEVM - それらの人はプログラミング モデルを気にしません。しかし、違いは非常に大きいです:
DCEVMは JVM にパッチを適用します。その目標は、完全なホットスワップ ソリューションを提供することです。
JRebelは Java エージェント (-javaagent VM 引数でフック) であり、アプリケーション コードを計測し、バージョン管理によって新しいバージョンのクラスをロードします。JRebel の主な価値は、膨大な量のフレームワーク固有の統合とともに柔軟な構成を提供するため、Java クラスのホットスワップ以上のことができることです。たとえば、Spring アプリケーション コンテキストに新しい Bean を追加してオートワイヤし、その場で新しい EJB を追加し、新しい Struts アクションなどを追加します。
Fakereplaceは、 JRebelのような計測エージェントでもありますが、Java コードの変更に対するサポートははるかに少なく (私は推測します)、サポートされるフレームワークの数はそれほど印象的ではありません。
Feenixは、Java Instrumentation API で可能な限り多くのことを実行できます。これは基本的に、JVM の標準 HotSwap に加えて、実際には価値を追加しないことを意味します。エージェントスミスも同様
更新: この回答により、Feenix の作成者は、JRebelがクラスで動作する方法に似たFeenix 2.0という新しいバージョンを作成するようになりました。しかし、著者自身が言うように、Feenix は依然として JRebel に大きく劣っています。HotswapAgentやSpring Loadedなど、同様のソリューションもいくつかあります。これらのツールも同様の機能を提供しますが、独自の方法で制限されています。
あなたの特定の問題について少し、JRebelでどのように解決できるか:
アプリケーションのすべてのモジュールには、独自の構成ファイルrebel.xmlが必要です。モジュールとは、EAR、WAR、またはWEB-INF/lib(あなたの場合のように)またはサーバー固有のライブラリのJAR依存関係のいずれかを意味します。コンパイルされたクラスがあるディレクトリを指す構成ファイルと、JRebel はその場所からクラスを直接ロードします。つまり、Java クラスに変更を加えたら、JAR 全体をアセンブルする必要はありません。代わりに、変更を加えてソースをコンパイルします (ビルド スクリプトの代わりに IDE を活用します)。コンパイルされたクラスは、クラスがアプリケーション コード内で呼び出されると、JRebel によって再ロードされます。