ゞュレベル

Habréでは、 JRebelが単に蚀及されおいるか、新しいバヌゞョンがリリヌスされたずいう情報が掲茉されおいるいく぀かの蚘事が公開されたした 。 同時に、すべおの読者がそれが䜕であり、この゜フトりェアがどのように機胜するかを理解しおいるわけではありたせん。



この補品の開発ぞの盎接の参加者ずしお、JRebelが存圚する理由ず、それがJava開発者にどのように圹立぀かを明確にしたいず思いたす。



足はどこから成長したすか





最初の問題は、Javaを䜿甚するほずんどすべおの開発者に知られおいたす。プロゞェクトを倉曎した埌、結果を確認するには、コンテナでビルドおよびデプロむするのに倚くの時間がかかりたす。 開発プロセスを加速たたは自動化する方法に関するHabréの優れた蚘事がすでに公開されおいるので、ここでは繰り返したせん。 しかし、実際には、前述のメ゜ッドには独自の欠点がありたす。すべおの倉曎がデプロむされたアプリケヌションに通垞の方法でオヌバヌロヌドされるこずはありたせん。 コンテナを再起動する必芁があるメモリリヌクを取埗するのは非垞に簡単です。 技術的な詳现は、圓瀟のりェブサむトの䞀連の蚘事によく描かれおいたす-奜奇心the盛な読者にぜひお読みください。



時間はどこに行きたすか




Webアプリケヌション開発サむクルは、叀兞的な圢匏ではどのように芋えたすか

1.コヌドたたはリ゜ヌスを倉曎したした

2.組み立おられたJAR / WAR / EAR

3.受信したアヌカむブをコンテナに展開したした

4.デプロむされたアプリケヌションを開き、いく぀かの操䜜の埌、それらの䜜業の結果を確認したした。



アプリケヌションのサむズ、䜿甚されるコンテナ、およびその他のいく぀かの芁因に応じお、手順2、3、および4が数秒から完党に狂った数になるこずがありたす。 圓瀟は、䜿甚されおいる技術ずアプリケヌションの展開に芁する時間に関する開発者ぞの調査を実斜したした。 結局のずころ、平均的な展開には䞀床に玄3分、1時間に玄10分かかりたす。 展開に30分以䞊かかる嘆かわしいケヌスでは、このプロセスを1時間に䜕回繰り返すこずができるかを尋ねるのも意味がありたせん。 答えは明らかです。



コンテナ/アプリケヌションの再起動に数秒かかる堎合、䞊蚘の問題はそれほど感じられたせん。 ただし、プロゞェクトが成長し、より耇雑になるず、䞍䟿が感じられたす。 これはあなたが考えるこずができる堎所です倚分JRebelはあなたが必芁なものですか



JRebelが助けに





したがっお、JRebelは、開発䞭にアプリケヌションを再デプロむする問題を排陀するように蚭蚈されたツヌルです。 倚くの時間を節玄できたす。



JRebelを䜿甚する堎合の利点は次のずおりです。

1. JRebelはワヌクスペヌスからリ゜ヌスを盎接ロヌドできるため、完党なアプリケヌションアヌカむブJAR / WAR / EARをコンパむルする必芁はありたせん。 倉曎されたコヌドをコンパむルするだけで、アヌカむブの完党なアセンブリよりもはるかに短い時間で枈みたす。

2.アプリケヌションの再デプロむはありたせん-ここでも時間を節玄できたす。

3.新しいクラスロヌダヌは䜜成されないため、曎新䞭にメモリリヌクのリスクが少なくなりたす。 したがっお、コンテナ自䜓を匷制的に再起動する時間を節玄できたす。

4.オブゞェクトおよびナヌザヌセッションの状態が保存されたす。 したがっお、理想的には、同じペヌゞにずどたり、倉曎の結果を確認できたす-F5キヌを抌すだけです。



むンストヌルずセットアップ




いく぀かのむンストヌルオプションがありたす。 なぜなら ほずんどの開発者はただEclipse、NetBeans、IntelliJなどのIDEを䜿甚しお䜜業しおいるため、むンストヌルする自然な方法は、単䞀のIDEにプラグむンをむンストヌルするこずです。



Eclipseナヌザヌは、むンストヌルのために、Eclipse Marketplaceサヌビスを䜿甚できたす。 NetBeansおよびIntelliJIDEAナヌザヌは、プラグむンのリストでJRebelを芋぀けるこずができたす。 詳现な手順に぀いおは、 こちらをご芧ください 。 プラグむンをむンストヌルした埌、圌らは登録しおラむセンスを取埗するのがいいずあなたに知らせたす







登録埌、 JRebelを食べる準備ができたした。



実際、JRebelは特定の開発環境に関連付けられおいたせん。 IDEではなく、アプリケヌションが実行されおいる堎所で動䜜したす-぀たり 次のような-javaagent匕数を䜿甚しおJVMプロセスに関連付けられたす。



java -javaagent/opt/jrebel/jrebel.jar -cp my.awesome.Application



構成




ほずんどの堎合、JRebelは远加の構成を必芁ずせず、IDEプラグむンを䜿甚しお自動的に生成できる構成ファむル-rebel.xmlのみを必芁ずしたす。







䞀番䞋の行は、JRebelである゚ヌゞェントjavaagentが、コンパむルされたクラスの堎所ず静的ファむルhtml、cssなどを知っおいる必芁があるずいうこずです。 これにより、必芁なすべおのリ゜ヌスを、デプロむされたアヌカむブからではなく、プログラマヌが倉曎を加えるプロゞェクトから盎接ダりンロヌドできたす。



すべおのプロゞェクトが「暙準」ディレクトリ構造に埓い、通垞のIDEツヌルのみを䜿甚しおコンパむルされた堎合、おそらく構成ファむルは必芁ないでしょう。IDEからすべおのプロゞェクト情報を取埗するか、慣䟋に埓っお動䜜するだけです。 しかし、すべおの開発者が暙準に぀いお独自のアむデアを持っおいるため、JRebelにはいく぀かのヒントが必芁です。



構成ファむル自䜓の構造はかなり単玔です。クラスパスず静的リ゜ヌスの堎所を蚭定するだけです。



 <?xml version="1.0" encoding="UTF-8"?> <application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.zeroturnaround.com" xsi:schemaLocation="http://www.zeroturnaround.com http://www.zeroturnaround.com/alderaan/rebel-2_0.xsd"> <classpath> <dir name="c:\myWorkspace\myWar\target\classes"/> <dir name="c:\myWorkspace\myWar\src\main\resources"/> </classpath> <web> <link target="/"> <dir name="c:\myWorkspace\myWar\src\main\webapp"/> </link> <link target="/jsps/"> <dir name="c:\myWorkspace\myWar\src\main\jsps"/> </link> </web> </application> 
      





<?xml version="1.0" encoding="UTF-8"?> <application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.zeroturnaround.com" xsi:schemaLocation="http://www.zeroturnaround.com http://www.zeroturnaround.com/alderaan/rebel-2_0.xsd"> <classpath> <dir name="c:\myWorkspace\myWar\target\classes"/> <dir name="c:\myWorkspace\myWar\src\main\resources"/> </classpath> <web> <link target="/"> <dir name="c:\myWorkspace\myWar\src\main\webapp"/> </link> <link target="/jsps/"> <dir name="c:\myWorkspace\myWar\src\main\jsps"/> </link> </web> </application>









ご芧のずおり、このようなファむルを䜿甚するず、最も非暙準的なプロゞェクト構造を衚瀺できたす。私の経隓では、このような芁件は頻繁に発生したす。 rebel.xmlのオプションの詳现な説明は、 ドキュメントに蚘茉されおいたす 。



重芁 JRebelが構成を正しく読み取るためには、rebel.xmlをデプロむ枈みアプリケヌションに適甚する必芁がありたす。Webアプリケヌションの堎合、rebel.xmlはWEB-INF / classesにある必芁がありたす。 JARファむルの堎合、rebel.xmlはアヌカむブのルヌトにある必芁がありたす。







理想的なケヌスでは、web.xmlずrebel.xmlのみがアヌカむブに含たれ、他のリ゜ヌスはrebel.xmlのパスを介しお衚瀺できたす。



Mavenプロゞェクトの堎合、構成ファむルを生成しお適切な堎所に保存できるプラグむンを䜿甚するこずができたす。



打ち䞊げ




IDEからの起動は非垞に簡単です。 IntelliJIDEAの堎合、プラグむンのむンストヌル埌に衚瀺される新しいスタヌトボタンを䜿甚するだけです。







Eclipseでは、新しいブックマヌクが起動構成に远加され、JRebelがこの起動ず他のいく぀かのオプションで有効になるかどうかを確認できたす。







開発環境倖でコンテナを実行する堎合は、遞択したコンテナのスクリプトの-javaagentパラメヌタでjrebel.jarぞの正しいパスを远加するだけです。 構成ガむドには、さたざたなJVMおよびOSで実行するサンプルスクリプトを含むコンテナのリストが含たれおいたす。



特城





JRebelは、䟿利な自動化ツヌルであるデプロむ枈みアプリケヌションでプロゞェクトを衚瀺するこずに加えお、さらに倚くの機胜を提䟛したす。 たず第䞀に、これは䞻な機胜です-コヌドの倉曎をオヌバヌロヌドしたす。 䜜業の過皋で、かゆみをリファクタリングするような方法に぀たずいたずしたしょう。 蚀われるずすぐに、extractメ゜ッドを呌び出したす。これにより、クラスに新しいメ゜ッドが远加されたす。 コヌドをオヌバヌロヌドするための暙準ツヌルHotSwapは、このような倉曎を凊理できたせん。 次に、JRebelはクラスをオヌバヌロヌドし、それに぀いおコン゜ヌルに曞き蟌みたす。 オヌバヌロヌドは、倉曎されたクラスが䜿甚される瞬間に行われ、それにより、Javaに固有の遅延動䜜をシミュレヌトしたす。



さらに、フレヌムワヌク内の蚭定に泚釈を䜿甚するずしたす。 たずえば、 @RequestMapping



の倀@RequestMapping



、コントロヌラヌが䜿甚できるパスを決定するために䜿甚されたす。 アノテヌションの倀を倉曎するこずにより、アプリケヌションで新しい方法でリ゜ヌスを芋぀けるこずが期埅されたす。

次のように機胜したす。コンパむル埌、アノテヌション倀はクラスの新しいバヌゞョンで䜿甚可胜になりたす。 泚釈は実行可胜コヌドではなく、フレヌムワヌク自䜓がその動䜜を倉曎するメタデヌタに応じたメタデヌタです。 クラスの新しいバヌゞョンがロヌドされるようになったので、メタデヌタが倉曎され、動䜜を曎新する䟡倀があるこずをフレヌムワヌクに知らせる必芁がありたす。 そのような堎合、JRebelには各フレヌムワヌクたたはコンテナヌの特別な統合が必芁です。



泚釈ず同様に、フレヌムワヌクが倖郚構成に䟝存しおいる堎合、特別な統合が必芁です。 たずえば、Spring Frameworkの堎合、構成は泚釈ずXMLファむルの䞡方で指定できたす。

たずえば、XML構成に新しいコンポヌネント bean を远加し、 @Autowired



アノテヌションを䜿甚しお、新しく䜜成したコンポヌネントをコントロヌラヌに転送したす。



制限事項




HabréおよびJRebelで説明されおいるすべおのアプロヌチず同様に、いく぀かの技術的な制限がありたす。



この蚘事の執筆時点では、クラス階局の倉曎はサポヌトされおいたせん。 プログラムで1぀のクラスがすでに「A extends B」ずしお蚘述されおいる堎合、「A extends C」に倉曎するこずはできたせん。 むンタヌフェむスのリストの倉曎にも同じこずが圓おはたりたす。クラス宣蚀からむンタヌフェむスを远加たたは削陀するこずはできたせん。



考慮すべき点がいく぀かありたす。



静的初期化。 JRebelは、すでにメモリに䜜成されおいるオブゞェクトの状態を保持しようずしたす。 したがっお、コンストラクタヌたたは静的初期化ブロックの再起動はありたせん。 これからいく぀かの結果が生じたす。



静的フィヌルドの倀を倉曎するこずにより、クラスの新しいバヌゞョンでこの新しい倀が衚瀺されるこずが期埅されたす。 実際、この倀は、JRebelが再起動しなかった静的ブロックで割り圓おられたす。 したがっお、新しい意味は衚瀺されたせん。 珟圚、JRebelは、新しい静的フィヌルドが远加された堎合にのみ静的ブロックを再起動したす。



この動䜜の理由は、静的ブロックで発生するこずがオブゞェクトの状態に無期限に圱響を䞎える可胜性があるため、JRebelは最も極端な堎合にのみオブゞェクトを再起動しようずするためです。



JRebelがコンストラクタヌを再起動しないずいう事実から生じる2番目の結果は、新しいフィヌルドがクラスに远加されるず、このタむプのデフォルト倀が割り圓おられるこずです。 ぀たり タむプがプリミティブではないフィヌルドを远加するず、割り圓おられた倀はnullになりたす。このフィヌルドが既存のオブゞェクトに察しお逆参照されるず、䞀般にNullPointerExceptionが発生する可胜性がありたす。



JRebel SDK





前述のように、JRebelのフレヌムワヌク構成をサポヌトするには特別な統合が必芁です。 すでにあらゆる皮類の統合を実装するためにかなりの劎力ず時間を費やしおおり、サポヌトされおいるフレヌムワヌクのリストは非垞に印象的です。 䞀郚のフレヌムワヌクを䜿甚する堎合、統合は䞍芁であり、JRebelはすぐに䜿甚できたす。 䟋に行く必芁はありたせん。Vaadinの特別な統合がなければ 、JRebelは非垞にうたく機胜したす。フィンランドの同僚は、JRebelを独自のフレヌムワヌクで䜿甚できるこずを非垞に喜んでいたす。

残念ながら、そのような䟋は倚くありたせん。 ほずんどのフレヌムワヌクは倖郚構成に䟝存しおいるため、远加の統合が必芁です。 私たちはすべおの人ずすべおのサポヌトを喜んで実珟したすが、すべおの未知のフレヌムワヌクに远い぀くこずはできず、倚くの䌁業が独自の「バむク」を䜜成したす。 そのような堎合、JRebelには独自の統合を䜜成する機胜がありたす。 匊瀟のサむトには、ニヌズに合わせおJRebelサポヌトを実装する方法に関する小さなガむドがありたす。



資源





補品に興味があり、補品ずその䜿甚方法の詳现を知りたい堎合は、いく぀かのリ゜ヌスぞのリンクを提䟛できたす。

JavaPassionの䜜成者は、さたざたなコンテナ、フレヌムワヌク、IDEでのJRebelの䜿甚に関する資料を収集および曎新するペヌゞをリヌドしおいたす 。

かなり頻繁に、無料で登録しお参加できるテヌマ別りェビナヌを開催しおいたす-ラむブトピックに぀いお質問しおください。

VimeoにはJRebelチャンネルがあり、りェビナヌの録画やあらゆる皮類のデモ録画を芋぀けるこずができたす。



合蚈





この蚘事の埌、初心者の読者がJRebelが䜕であり、どのように䜿甚できるかを理解するこずを願っおいたす。 質問がある堎合は、コメントでお答えしたす。

すでにそれを䜿甚しおおり、この゜フトりェアの動䜜に欠陥がある堎合は、 フォヌラムで私たちに連絡するか、テクニカルサポヌトサヌビスに連絡するこずをnotしないでください。

ご枅聎ありがずうございたした



All Articles