25

現在、Java アプリケーションでホット クラス リロードを実装しようとしていますが、選択できるプラグインが非常に多く、オプション間の適切な比較が見つかりません。また、プラグインのウェブサイトでは、正確な機能とその使用方法について明確に説明されているわけではありません。

ClassLoader をリロードするカスタム ホット クラスを作成するオプションもありますが、仕事を行うことができるプラグインが既に非常に多くある場合、それは「車輪の再発明」に似ているように感じます..他の人はこれに同意しますか?

私が見つけたJavaプラグインは、仕事をすることができると思います:

では、プラグイン間の違いを知っている人はいますか? また、どのプラグインが最も直感的に使用できますか?

補足として: 私が実際にやりたいことは、Java アプリケーションの .jar ファイル依存関係をリロードすることです。非常に頻繁に自動的に再コンパイルされ、.jar ファイルに変換される Java コードがあります。これは私の Java アプリケーションの依存関係であり、私のアプリケーションは毎回この .jar ファイルの最新バージョンを使用する必要があります。

4

2 に答える 2

36

免責事項: 私は JRebel の開発に携わっているため、私の回答は少し偏っているように見えるかもしれませんが、説明するために最善を尽くします。

この質問に答えるために、最初にリストした名前の主な違いの 1 つは、アプリケーションの設計を変更する必要があるソリューションとそうでないソリューションがあるという事実に注意を向けたいと思います。

OSGiJBoss モジュールなどのモジュール化ソリューションは、正しい道をたどってアプリケーションをモジュール化する場合にメリットをもたらします。それ以外の場合、1 つのサイロ バンドルを展開すると、基本的にアプリケーション全体を再起動/再展開することになり、このアプローチから得られるメリットが減少します。

Play フレームワークは、実際にはホット デプロイメント機能を備えたフルスタック フレームワークです。これらの機能は、使用するフレームワークのバージョンによって異なります。ただし、モジュール性と同じ話です。フレームワークは特定のプログラミング モデルを強制します。

Apache Commons JCIは、実際にはコードをホット アップデートするためのソリューションではありません。私の知る限り、新しいクラスローダーを介してクラスをコンパイルしてロードするだけです。これには、上記の場合と同様に、アプリケーション コードの変更も含まれます。それが良いか悪いかはよくわかりません。欠点は、この方法ではエコシステムとの広範な統合がほとんどできないことです。このアプローチは、この機能を利用する自作のフレームワークにはかなり適しています。私自身、Groovy、JRuby、JavaScript などのスクリプト言語を使用して同じことを達成したいと考えています。たとえば、このようなもの。

JRebelFakereplace、および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 に大きく劣っています。HotswapAgentSpring Loadedなど、同様のソリューションもいくつかあります。これらのツールも同様の機能を提供しますが、独自の方法で制限されています。

あなたの特定の問題について少し、JRebelでどのように解決できるか:

アプリケーションのすべてのモジュールには、独自の構成ファイルrebel.xmlが必要です。モジュールとは、EAR、WAR、またはWEB-INF/lib(あなたの場合のように)またはサーバー固有のライブラリのJAR依存関係のいずれかを意味します。コンパイルされたクラスがあるディレクトリを指す構成ファイルと、JRebel はその場所からクラスを直接ロードします。つまり、Java クラスに変更を加えたら、JAR 全体をアセンブルする必要はありません。代わりに、変更を加えてソースをコンパイルします (ビルド スクリプトの代わりに IDE を活用します)。コンパイルされたクラスは、クラスがアプリケーション コード内で呼び出されると、JRebel によって再ロードされます。

于 2013-07-14T18:56:03.917 に答える
2

ブロックに新しい子供がいます。RelProxy です。これはオープン ソースであり、JRebel ほど高度ではありませんが、実行時にコードのサブセットを自由に変更し、パフォーマンスの低下やコンテキストの再読み込みをほとんど必要とせずに再読み込みするために使用できます。 (セッションが失われることはありません)必要に応じて、開発および本番環境で。

于 2015-01-30T11:54:08.343 に答える