2007/07/02
Eclipse - nefunkÄ?nà "hot code replace"
Alternativnà nadpis tohoto pÅ™ÃspÄ›vku by mohl znÃt "Jak použÃt Eclipse (java) compiler" mimo IDE. TÃmto jsem asi dost napovÄ›dÄ›l, o Ä?em budou následujÃcà řádky pojednávat.
Remote Debugging
Vzdálené debugovánà (remote debugging) je užiteÄ?ný nástroj pro ladÄ›nà "vzdálených" aplikacà - "vzdálených" v tom smyslu, že se pomocà svého debuggeru pÅ™ipojujete do jiné běžÃcà Java Virtual Machine nejspÃÅ¡e s úmyslem ladÄ›nà dané aplikace ;) Nebudu nosit dÅ™Ãvà do lesa: VÃce si o tomto tématu pÅ™eÄ?tete napÅ™Ãklad v Ä?lánku Debugging v praxi - opravdu samozÅ™ejmost?! od otce Fura Ä?i Eclipse a drobné maliÄ?kosti - vzdálené debugovánà od Dagiho.
Hot Swap
S remote debuggingem souvisà dalšà funkcionalita, která z mé vlastnà zkuÅ¡enosti dokáže uÅ¡etÅ™it obrovské množstvà Ä?asu. Tato funkcionalita se jmenuje hot swap. Hot swap umožňuje "vpaÅ¡ovat" do běžÃcà aplikace novou verzi pÅ™eloženého kódu a nahradit jà tak kód původnÃ.
Pro lepšà pÅ™edstavu, proÄ? považuji hot swap za maximálnÄ› efektivnà pomůcku, uvedu jeden pÅ™Ãklad z mé praxe. Pracoval jsem na Ariba projektu, kde restart modulu Ariba aplikace (to jest jedné instance Weblogicu) na které jsem pracoval, trval na laptopu pÅ™ibližnÄ› 9-10 minut (dÃky tomu, že se inicializovaly různé adaptéry, Tibco repositories, kontrolovala se XML metadata,...).
SouÄ?ástà typického úkolu na tomto projektu byl vývoj nÄ›jakého vysoce sofistikovaného ;) java kódu, který použÃvá pokud možno public API aplikace a na konci dosáhne kýženého výsledku, za aplausu business consultantů :) V uvedené konfiguraci, kdy jednÃm restartem ztratÃte tolik Ä?asu, si musÃte dávat sakra dobrý pozor na jakékoliv triviálnà chyby (na netriviálnà chyby si Ä?asto pozor dát ani nemůžete, napÅ™Ãklad z toho důvodu, že API nenà zrovna dobÅ™e zdokumentované a až stacktrace pÅ™i testovánà vás upozornà na možný problém) ;)
Zde se pomalu dostávám k jádru vÄ›ci. Hot swap vám v tÄ›chto pÅ™Ãpadech velice dobÅ™e posloužÃ: triviálnà problém - zapomnÄ›li jste test na
Ti rozumnÄ›jšà (pÅ™ÃpadnÄ› ti pracujÃcà v módu fixed fee a ne time&material :D ) využijà hot swap: kód v IDE jednoduÅ¡e opravÃte, upravÃte, pÅ™eložÃte, a pokud jste debuggerem pÅ™ipojeni do JVM v které běžà aplikace, hot swap nahraje novou verzi byte-kódu do JVM a nahradà jà kód původnÃ. V tÄ›chto jednoduchých pÅ™Ãpadech vám hot swap nezanedbatelnÄ› Å¡etřà Ä?as. (SamozÅ™ejmÄ› zde existuje mnoho omezenÃ, která když poruÅ¡Ãte, debugger zobrazà varovánÃ, že daná zmÄ›na nenà podporována (zmÄ›ny v hierarchii tÅ™Ãd ale i napÅ™Ãklad pÅ™idánà public metody atd.) a restartu se stejnÄ› nevyhnete).
Hot Swap v Eclipse
ZatÃmco v Intellij Idee hot swap fungoval bez problémů a intuitivnÄ›, po pÅ™echodu na Eclipse mi hot code replace (jak se tato feature v eclipsu nazývá) v mnoha pÅ™Ãpadech nefungoval. Po rekompilaci tÅ™Ãdy se mi mÃsto oÄ?ekávaného nahránà nového byte-kódu na server zobrazovalo Ä?asto následujÃcà varovánÃ:

Trochu jsem pátral co je pÅ™ÃÄ?inou a dopátral jsem se. Na obranu debuggingu v Eclipsu můžu uvést, že je v tom (Ä?ásteÄ?nÄ› nevinnÄ›).
Scheme change not implemented
Zásadnà problém je ten, že Eclipse pro kompilaci nepoužÃvá sunovský
(Nutno podotknout, že důvod proÄ? se mi na serveru objevuje kód kompilovaný jiným kompilátorem (
ŘeÅ¡enÃ
ŘeÅ¡enà problému spoÄ?Ãvá v použità stejného kompilátoru v obou pÅ™Ãpadech.
Prvnà možnost je donutit Eclipse kompilovat pomocÃ
Druhá varianta je donutit existujÃcà produkt, který obsahuje vlastnà "Ant" build systém, kompilovat pomocà Eclipse kompilátoru.
To jde celkem jednoduše:
TÃmto donutÃme Ant kompilovat pomocà Eclipse kompilátoru a hot swap neboli hot code replace funguje tak jak má.
Malá poznámka na konec. RozhodnÄ› bych nedoporuÄ?oval mÄ›nit použitý compiler na produkÄ?nÃm server, o Ä?em tu pojednávám, je prostÅ™edà vývojáře!
VÃce kompilovánà v Eclipse o možnostech použità vnÄ› Eclipse IDE se lze doÄ?Ãst v online nápovÄ›dÄ›: JDT Plug-in Developer Guide > Compiling Java code.
Remote Debugging
Vzdálené debugovánà (remote debugging) je užiteÄ?ný nástroj pro ladÄ›nà "vzdálených" aplikacà - "vzdálených" v tom smyslu, že se pomocà svého debuggeru pÅ™ipojujete do jiné běžÃcà Java Virtual Machine nejspÃÅ¡e s úmyslem ladÄ›nà dané aplikace ;) Nebudu nosit dÅ™Ãvà do lesa: VÃce si o tomto tématu pÅ™eÄ?tete napÅ™Ãklad v Ä?lánku Debugging v praxi - opravdu samozÅ™ejmost?! od otce Fura Ä?i Eclipse a drobné maliÄ?kosti - vzdálené debugovánà od Dagiho.
Hot Swap
S remote debuggingem souvisà dalšà funkcionalita, která z mé vlastnà zkuÅ¡enosti dokáže uÅ¡etÅ™it obrovské množstvà Ä?asu. Tato funkcionalita se jmenuje hot swap. Hot swap umožňuje "vpaÅ¡ovat" do běžÃcà aplikace novou verzi pÅ™eloženého kódu a nahradit jà tak kód původnÃ.
Pro lepšà pÅ™edstavu, proÄ? považuji hot swap za maximálnÄ› efektivnà pomůcku, uvedu jeden pÅ™Ãklad z mé praxe. Pracoval jsem na Ariba projektu, kde restart modulu Ariba aplikace (to jest jedné instance Weblogicu) na které jsem pracoval, trval na laptopu pÅ™ibližnÄ› 9-10 minut (dÃky tomu, že se inicializovaly různé adaptéry, Tibco repositories, kontrolovala se XML metadata,...).
SouÄ?ástà typického úkolu na tomto projektu byl vývoj nÄ›jakého vysoce sofistikovaného ;) java kódu, který použÃvá pokud možno public API aplikace a na konci dosáhne kýženého výsledku, za aplausu business consultantů :) V uvedené konfiguraci, kdy jednÃm restartem ztratÃte tolik Ä?asu, si musÃte dávat sakra dobrý pozor na jakékoliv triviálnà chyby (na netriviálnà chyby si Ä?asto pozor dát ani nemůžete, napÅ™Ãklad z toho důvodu, že API nenà zrovna dobÅ™e zdokumentované a až stacktrace pÅ™i testovánà vás upozornà na možný problém) ;)
Zde se pomalu dostávám k jádru vÄ›ci. Hot swap vám v tÄ›chto pÅ™Ãpadech velice dobÅ™e posloužÃ: triviálnà problém - zapomnÄ›li jste test na
null? Chcete pÅ™idat debugovacà řádku...? S hrůzou zjistÃte že nerovnost v podmÃnce je pÅ™esnÄ› obrácenÄ›? Bez remote debuggingu (aneb tak jak jsem to vidÄ›l kupodivu u velkého množstvà kolegů konzultantů) musÃte shodit server, opravit, pÅ™ekompilovat, zrestartovat a dvacet minut je pryÄ?. NáslednovnÄ› zjistÃte, že o pár řádků dále je problém podobný a tak pořád dokola. Ti rozumnÄ›jšà (pÅ™ÃpadnÄ› ti pracujÃcà v módu fixed fee a ne time&material :D ) využijà hot swap: kód v IDE jednoduÅ¡e opravÃte, upravÃte, pÅ™eložÃte, a pokud jste debuggerem pÅ™ipojeni do JVM v které běžà aplikace, hot swap nahraje novou verzi byte-kódu do JVM a nahradà jà kód původnÃ. V tÄ›chto jednoduchých pÅ™Ãpadech vám hot swap nezanedbatelnÄ› Å¡etřà Ä?as. (SamozÅ™ejmÄ› zde existuje mnoho omezenÃ, která když poruÅ¡Ãte, debugger zobrazà varovánÃ, že daná zmÄ›na nenà podporována (zmÄ›ny v hierarchii tÅ™Ãd ale i napÅ™Ãklad pÅ™idánà public metody atd.) a restartu se stejnÄ› nevyhnete).
Hot Swap v Eclipse
ZatÃmco v Intellij Idee hot swap fungoval bez problémů a intuitivnÄ›, po pÅ™echodu na Eclipse mi hot code replace (jak se tato feature v eclipsu nazývá) v mnoha pÅ™Ãpadech nefungoval. Po rekompilaci tÅ™Ãdy se mi mÃsto oÄ?ekávaného nahránà nového byte-kódu na server zobrazovalo Ä?asto následujÃcà varovánÃ:
Trochu jsem pátral co je pÅ™ÃÄ?inou a dopátral jsem se. Na obranu debuggingu v Eclipsu můžu uvést, že je v tom (Ä?ásteÄ?nÄ› nevinnÄ›).
Scheme change not implemented
Zásadnà problém je ten, že Eclipse pro kompilaci nepoužÃvá sunovský
javac, nýbrž svůj kompilátor (souÄ?ást JDT Core component). Vyprodukovaný byte kód se lišà (nezkoumal jsem do detailů jak...) od byte kódu class pÅ™eložených javac kompilátorem. Tyto rozdÃly jsou pro debugger ale podstatné tak, že neumožnà zámÄ›nu byte kódu za bÄ›hu. Podobný problém viz napÅ™. na news.eclipse.tools.jdt: Scheme change not implemented.(Nutno podotknout, že důvod proÄ? se mi na serveru objevuje kód kompilovaný jiným kompilátorem (
javac než z IDE (eclipse compiler), je fakt, že instalace a deployment této aplikaci je pomÄ›rnÄ› komplikovaný proces a je pro nÄ›j pÅ™epdÅ™ipravena sada nástrojů (Ant skriptů), které je nutné ve správném poÅ™adà použÃt v závislosti na provádÄ›né zmÄ›nÄ›).ŘeÅ¡enÃ
ŘeÅ¡enà problému spoÄ?Ãvá v použità stejného kompilátoru v obou pÅ™Ãpadech.
Prvnà možnost je donutit Eclipse kompilovat pomocÃ
javac. To jde podle mÄ› jednoduÅ¡e pouze pomocà nového ANT builderu a custom Ant scriptu. Což nenà zrovna elegantnÃ.Druhá varianta je donutit existujÃcà produkt, který obsahuje vlastnà "Ant" build systém, kompilovat pomocà Eclipse kompilátoru.
To jde celkem jednoduše:
- stáhnout
ecj.jar(JDT Core Batch Compiler)z eclipse.org
- donutit Ant použÃt tento compiler: tzn. nastavit hodnotu Ant property
build.compilernaorg.eclipse.jdt.core.JDTCompilerAdapter
- a nakonec samozřejmě přidat
ecj.jardo classpath (tip pro lenochy: nahrát tento jar do adresáře ant/lib)
TÃmto donutÃme Ant kompilovat pomocà Eclipse kompilátoru a hot swap neboli hot code replace funguje tak jak má.
Malá poznámka na konec. RozhodnÄ› bych nedoporuÄ?oval mÄ›nit použitý compiler na produkÄ?nÃm server, o Ä?em tu pojednávám, je prostÅ™edà vývojáře!
VÃce kompilovánà v Eclipse o možnostech použità vnÄ› Eclipse IDE se lze doÄ?Ãst v online nápovÄ›dÄ›: JDT Plug-in Developer Guide > Compiling Java code.
Å tÃtky: eclipse, programovani
Comments:
<< Zpět / Home
co je potreba pro aktivaci toho hot code replace udelat? remote debug mi slape, ale jak docilim toho, ze mi eclipse danou tridu po zmene nahradi?
Cau Anonyme, Hot code replace se spusti automaticky, jakmile zmenis a prelozis nejaky zdrojak.
Takze jestli si to chces vyzkouset, tak pokud mas vypnute automaticke buildovani v projektu, tak si zkus
1) otevrit nejakou tridu
2) zmen ji (pridej napr. radek System.out.println("neco");
3) Ctrl+B
trida se znova prelozi, a pokud tvuj remote debugging funguje, eclipse se pokusi nahrat novou verzi class filu na "server"
V pripade ze pouzivas automaticke buildovani v projektu, tak predpokladam se ti zdrojak prelozi pote, co ho ulozis (takze bod 3) Ctrl + S
Milan
Takze jestli si to chces vyzkouset, tak pokud mas vypnute automaticke buildovani v projektu, tak si zkus
1) otevrit nejakou tridu
2) zmen ji (pridej napr. radek System.out.println("neco");
3) Ctrl+B
trida se znova prelozi, a pokud tvuj remote debugging funguje, eclipse se pokusi nahrat novou verzi class filu na "server"
V pripade ze pouzivas automaticke buildovani v projektu, tak predpokladam se ti zdrojak prelozi pote, co ho ulozis (takze bod 3) Ctrl + S
Milan
dik, jeste mi to nejde prelozit s pouzitim toho:
build.compiler=org.eclipse.jdt.core.JDTCompilerAdapter
Pise to chyby ohledne javy 1.5, napr:
Syntax error, annotations are only available if source level is 5.0
jinak dik moc
build.compiler=org.eclipse.jdt.core.JDTCompilerAdapter
Pise to chyby ohledne javy 1.5, napr:
Syntax error, annotations are only available if source level is 5.0
jinak dik moc
Aha,tak bud je to tim, ze ten eclipse compiler nepodporuje anotace (mas posledni verzi?), ale spis bych to videl na to, ze nema defaultne nastaveny "source level" na 5.0 ale na neco nizsiho...Na tomhle projektu pouzivam source-level 1.4.
Ted je otazka jak predat tuhle informaci compileru - zkus hledat nejake dalsi property... kdyztak to sem pls. pripis.
Milan
Ted je otazka jak predat tuhle informaci compileru - zkus hledat nejake dalsi property... kdyztak to sem pls. pripis.
Milan
No je to divny, pac JAVA_HOME je namiren na javu 1.5
pomohlo az pridani tohodle do javac ant tasku:
compilerarg <compiler="org.eclipse.jdt.core.JDTCompilerAdapter" line="-1.5 -warn:+boxing">
viz:
http://help.eclipse.org/stable/index.jsp?topic=/org.eclipse.jdt.doc.isv/guide/jdt_api_compile.htm
takze to funguje, dik
jen je to trochu pomale :(
pomohlo az pridani tohodle do javac ant tasku:
compilerarg <compiler="org.eclipse.jdt.core.JDTCompilerAdapter" line="-1.5 -warn:+boxing">
viz:
http://help.eclipse.org/stable/index.jsp?topic=/org.eclipse.jdt.doc.isv/guide/jdt_api_compile.htm
takze to funguje, dik
jen je to trochu pomale :(
Taxe mi zda, ze Hot Code Replace mi v Eclipsu 3.3 funguje nekdy i bez toho, ze bych kompiloval s JDTCompilerAdapter. Asi zazrak.
Ahoj,
Vykoumal jsem dobre reseni:
Pokud volate ant z prikazove radky, misto volani
ant build
zavolejte
ant build -Dbuild.compiler=org.eclipse.jdt.core.JDTCompilerAdapter -Dant.build.javac.target=1.5
Tim padem odpadaji veskere modifikace na filesystemu.
Predtim samozrejme zkopirujte jar do lib adresare vaseho antu.
pekny stedry den :)
Přidat komentář
Vykoumal jsem dobre reseni:
Pokud volate ant z prikazove radky, misto volani
ant build
zavolejte
ant build -Dbuild.compiler=org.eclipse.jdt.core.JDTCompilerAdapter -Dant.build.javac.target=1.5
Tim padem odpadaji veskere modifikace na filesystemu.
Predtim samozrejme zkopirujte jar do lib adresare vaseho antu.
pekny stedry den :)
<< Zpět / Home

