úterý 6. ledna 2009

Apache Wicket - Hot Deploy html souborů

Při vývoji javovských webových aplikací nad aplikačním serverem (Glassfish) či jen nad samotným webovým kontejnerem (Tomcat), dochází k jedné nepříjmené situaci a tím je nahrání aplikace na server. Pokud se jedná o malý projekt, je čas strávený nad undeploy/deploy mizivý. Jak ale projekt začne růst, roste s ním i čas, který strávite při nahrávání nové verze na server.

Existuje několik možností, jak se vyhnout co nejčastějšímu nahrávání. Jednou z možností je důsledné psaní JUnit testů, které by mě měly upozorňovat na vzniklé problémy již při vývoji. Další možností je spuštění aplikačního serveru v debug módu. Ten částečně umožňuje provést tzv. hot deploy, kde se na server aktualizuje pouze část, kterou jsem právě změnil. Záměrně používám slovo částečně, protože i tento způsob je dost omezen (tvorba nových tříd, nových metod, EJBs, atd).

Projekt postavený nad Apache Wicket je možné spouštět také v debug řežimu. Tento mód umožňuje využít komplexnější analýzu (logování, ajax výstupy, atd) při vývoji. Pokud je tedy tento projekt spuštěn v debug řežimu a celý aplikační server také v debug módu, je možné za běhu měnit implementaci metod. Problém ovšem nastane s html soubory u wicket komponent. Ty se jen těžko budu snažit dostat do hot deploy řežimu.

Po menším pátrání jsem ovšem objevil možnost jak provést "autodeploy" těchto html souborů. Celý trik spočívá v tom, že si definuji vlastní tzv. "resource folder", který nastavím do místa, kde se vyskytuje můj projekt. Tato funkcionalita se zapisuje do init metody uvnitř vlastní Application Class, která je definována v web.xml jako "applicationClassName".
@Override
protected void init() {
super.init();
// 1
if (Application.DEVELOPMENT.equalsIgnoreCase(getConfigurationType())) {
// 2
getResourceSettings().setResourcePollFrequency(Duration.ONE_SECOND);
// 3
getResourceSettings().addResourceFolder("/home/ales/projekt/src/java");
}
}

1. funkcionalita se spustí jen v případě, že je celý projekt spuštěn v debug modu.
2. pokud ve svém projektu měním html soubor, je tato změna promítnuta v běžícím projektu ihned (1 vteřina)
3. nastavím celou cestu k mému projektu a k jeho balíčkům

Tento "resource folder" umožňuje změnu jak html souborů, tak i dalších vlastností jako je např. lokalizace v properties souborech, css, atd. Tedy vše kromě javovských tříd.

Co se týče samotného hot deploy, doufám, že se situace o dost zlepší s příchodem Glassfish V3, který by měl obsahovat OSGI kontejner.

*Malé rýpnutí:*
Nedávno jsem poslouchal poslední podcast 29 z java.cz, kde Roman Štrobl mluvil o nové funkcionalitě "Compile on Save" v NetBeans. Přiznám se, že se mi zatím nepodařilo tuto funkcionalitu využít při vývoji J2EE aplikace. Mám pocit, že je hot deploy na glassfishi omezen tak, že je to téměř nepoužitelné. Pokud se nemýlím, tak samotná EJB3 komponenta moc dobře takto "aktualizovat" nejde.

4 komentáře:

  1. Ladislav Thon6. ledna 2009 20:28

    Metodu addRe­sourceFolder() taky používám, protože nemám při vývoji HTML soubory na classpath, ale setRe­sourcePollFre­quency() nutné není. V development režimu je 1 sekunda default, viz org.apache.wicket.Application#configure(). Obecně bych řekl, že vývoj ve Wicketu je docela radost, autoři zjevně potřeby vývojářů znají velmi dobře (aby taky ne).

    OdpovědětVymazat
  2. Vzhledem k tomu co jste mi odpovedel v me otazce v blogu "Apache Wicket - Znovupoužitelné komponenty" si udelat vlastni „path resolver“ a ten by to mel zvladnout taky, ne? Pak je mozne mit HTML design uplne nekde jinde (ani nemusite mit stejne kosatou strukturu "cz/firma/projekt/subprojekt/esteneco/Trida.html" ale melo by nastavenim vlastniho path resolveru byt mozne osekat treba na strukturu /wicket/subprojekt/Trida.html v adresari /src/webapps/WEB-INF/jsp/... (pokud jste tak zvykli)

    Nebo to chapu spatne?

    OdpovědětVymazat
  3. to Lukas Benda: "Resource Folder", který je zde použit nespecifikuje jakým způsobem se budou html soubory a další zdroje načítat. Pouze specifikuje cestu, která se ve finále překládá jako: "/cesta/k/balicku/JmenoTridy.html"

    Nicméně tuto funkcionalitu lze propojit s napsáním vlastního "path resolveru". Způsob jak toto udělat je popsáno ve wiki na stránkách Apache Wicketu.

    OdpovědětVymazat
  4. Ahoj, wicket pouzivame jiz dlouho a i toto dynamicke nacitani html souboru. K tomu jeste dynamicke nacitani properties souboru a pouziti JavaRebel (http://www.zeroturnaround.com/javarebel/) pro reload trid. Co doporucuji je pouzivat pro vyvoj plugin filesync (http://andrei.gmxhome.de/filesync/) diky cemuz neni nutne psat do kodu nic navic ... protoze do cilove slozky jsou zmenene html/img/flash/properties/classes kopirovany ze zdrojovych automaticky po zmene a aplikace je tak plne ziva:-)

    OdpovědětVymazat

React a hrátky s TypeScriptem

V minulosti jsem se již několikrát zmiňoval, že používat JavaScript bez statických typů, je stejné jako jezdit na kole poslepu. Nemusí se...