21. března 2009

JavaRebel - vývoj bez restartu serveru

O nástroji JavaRebel se již psalo před nějakým časem na Jirablogu. Přesto bych rád o tomto super nástroji napsal znovu a podělil se s vámi o mé zkušenosti.

Pokud tento nástroj ještě neznáte, tak se jedná o JVM plugin, který umožňuje za běhu aplikace upravovat Java kód tak, že se změny hned promítnou do běžící aplikace. To zní hodně podobně jako standardní JVM HotSwap, ale JavaRebel toho umí mnohem více, např. přidání nové proměnné do třídy, metody, změna anotace apod. Více o možnostech zde.

Vždy jsem si při vývoji vystačil s lightweight servery (Tomcat, Jetty) a tam nebyl problém server často restartovat z důvodu promítnutí změn v Java kódu. Nyní dělám na projektu, kde máme OC4J server a plně jsem pochopil, proč ty servery jsou tak heavyweight. Člověk si musí při psání kódu dávat opravdu pozor, protože náběh serveru je v řádu desítek sekund až minuty. A pro tyto případy se hodí JavaRebel.

Moje zkušenost je nyní celkem pozitivní. Používám poslední verzi 2.0-RC2 spolu s OC4J verze 10.1.3.4, k tomu IntelliJ IDEA verze 7.0.4. Intalace je velice jednoduchá - JavaRebel knihovnu se nahraje do classpath aplikace nebo serveru, upraví se spouštěcí soubor serveru a pro IDEU se ještě doinstaluje plugin, aby hezky fungovalo debuggování. Vše je popsáno zde.

S JavaRebel pracuji již přibližně měsíc a chvíli trvalo, než jsem si to vyladil. Měl jsem problémy s během aplikace, někdy mi dokonce spadnul z ničeho nic celý server. To se hodně zlepšilo s uvedením nové verze 2.0-RC2 (před tím jsem používal 2.0-M2). Také jsem musel vyloučit generované Java třídy z JSP stránek (přidal jsem při spouštění tento parametr -Drebel.packages_exclude=_oracle._jsp._tag). Teď mám pocit, že to opravdu funguje, jak bych si představoval.

Součástí JavaRebelu je i plugin pro Spring (pozn. pluginy jsou součástí JavaRebelu od verze 2.0-RC1, před tím bylo nutné si stáhnout pluginy odděleně). Ten by měl umět promítnout změny v konfiguraci Spring kontejneru v průběhu běžící aplikace. Tento plugin jsem krátce používal, ale měl jsem podezření, že mi kvůli tomu padá server, tak jsem ho zatím vypnul. Ale určitě se k němu ještě vrátím, až budu mít více času.

Díky udělátku JavaRebel se i s OC4J dá vyvíjet efektivně. Nástroj není sice zadarmo, ale cena 59 dolarů mi přijde velice příjemná, zejména když vezmu o kolik se mi zvýšila produktivita práce. JavaRebel je možné vyzkoušet po dobu 30 dní.

10 komentářů:

jinxx řekl(a)...

Skoda jenom te licence. Je to moc drahy :( Verim, ze pro aplikacni servery je to killer app. Pro me je napr. i Spring plugin super vec... jenom kdyby ho dotahli do konce.

Anonymní řekl(a)...

Pro zlepseni hotswapu staci i pouzit jiny javovy kompilator - treba ten od IBM.

finc řekl(a)...

Naprostý souhlas. JavaRebel také využívám a je pravda, že ušetří spoustu času.

Pavel Muller řekl(a)...

Taky pouzivam JavaRebel. Se Spring pluginem je to skvely. Jeste jsem si stacil koupit licenci "na vecne casy". Ted uz se musi platit rocni poplatek. Jeste chce nejak vyresit nutnost restartovat server po zmene Spring konfiguraku. Sice delam refresh kontextu, kdyz se zmeni soubor, ale nezabere to vzdycky.

Anonymní řekl(a)...

Len pre doplnenie. Niektore moderne komponentove webove frameworky (napr. Tapestry 5 alebo JSF 2) nativne podporuju automaticky reload kodu za behu aplikacie, bez nutnosti pouzivat JavaRebel (t.j. uplne zadarmo).

Anonymní řekl(a)...

OC4J : neni potreba restartovat cely server, staci restart aplikace - cca 2 sekundy.

Anonymní řekl(a)...

javarebel pouzivam jiz radu mesicu (mozna i let) s Tomcatem a Eclipsou (s par pluginy) a nedokazu si jiz bez toho predstavit vyvoj, je to vazne super vec! Hell (www.loose.cz)

Anonymní řekl(a)...

BTW - pred chvli vysla verze 2.0 :-)

I.

Anonymní řekl(a)...

To Anonymní (25.3.2009 20:00): Restart aplikacie nieje idealnym riesenim pretoze po restarte je potrebne sa znovu nalogovat do aplikacie a preklikat na miesto kde si skoncil, co zaberie kopec casu. Pri pouziti automatickeho class reloadingu jednoducho pokracujes tam kde si skoncil bez zbytocnych casovych strat.

Ondrej Medek řekl(a)...

Take je dobry hot redeploy na JBossu. Akorat se musi "doklikat" k mistu, kde clovek skoncil. BTW. jeste by melo jit ulozit session an disk a znovu ji nacit pri hot redeploy, ale to jsem jeste nezkousel.