Když se podíváte na způsob vývoje u kompilovaných jazyků, vždy vidíte cyklus úprav, přeložení a spušťění. Naštěstí na rozdíl od C++ jsou překlady v Javě ďábelsky rychlé. Pomalejší už je bohužel deploy do servletového kontejneru (o čase pro EJB už raději nemluvím). Pokud tedy sečtete dohromady čas pro kompilace a redeploy, dostanete čas minimálně několik vteřin, obvykle však i desítky vteřin (u některých aplikačních serverů to může být i 5 minut), což v porovnání s PHP, kde uložíte soubor a obnovíte stránku, snižuje produktivitu a tím zvyšuje náklady projektu. U mně osobně platí, že i krátké přerušení práce mne dokáže dostat z koncentrace, a tím ještě zhoršit celý problém.
Protože nás tento problém trápí, snažili jsme se jej vyřešit i u nás.
Když se na webový archív podíváme hlouběji, lze jej rozdělit na tři části:
- JAR archívy v /WEB-INF/lib/ – obvykle externí knihovny
- class soubory v /WEB-INF/classes/ –
- konfigurační soubory a soubory generovaných HTML stránek (ať už ve formě JSP souborů nebo různých šablonovacích systémů).
JAR archívy se moc často nemění, a proto je nepotřebujeme rychle obnovovat. Častěji už měníme Java soubory, a téměř neustále měníme obrazovou reprezentaci (zvlášť pro JSF). Když změníte i jen CSS soubor, stejně musíte projít celým cyklem kompilace a spuštění.
Máme tedy několik možností jak práci urychlit:
- Upravovat soubory v mísťě, který je deploynut do kontejneru. To jde ovšem proti obvyklému způsobu používání programů ant či maven.
- Vytvořit si ant task „copy-templates“. Ten při spuštění zkopíruje jen soubory, které se změnily a nebude kompilovat Java soubory. Tento task je možné umístit do cyklu a vždy spustit, počkat na stisk klávesy, zkopírovat soubory a ukončit. Tím, že se program nejdříve spustí a až po stisku klávesy kopíruje, umožní, aby bylo JVM již nastartováno.
- Pro šablonovací systém (v našem případě to byl freemarker) použít jiný adresář a ten při vývoji načítat z umístění u zdrojových textů.
- Upravit použití kontejneru tak, aby měl speciální ServletContext, který při vývoji bude soubory číst přímo ze zdrojového umístění – pomocí sady metod getResource().
V současné době používáme body 2) a 3). S nasazováním Maven 2 se ovšem objevila snadná realizace bodu 4).
Existuje integrace Jetty do Maven 2. Ta přidá plugin, který umožní spustit projekt a přitom číst data ze zdrojového umístění. Pustíte Maven příkazem:
$ mvn jetty6:run
Tím se spustí kompilace, a po jejím dokončení se spustí webová aplikace právě v tomto rychlém kontejneru. Když měníte soubory, změny se projevují rovnou. A na rozdíl od bodu 2) toto platí nejen pro šablony, ale i pro všechny ostatní soubory (např. i web.xml). Pokud potřebujete změnit JARy a nebo Java třídy, musíte už ovšem kontejner restartovat (třeba časem přidají podporu pro hotswap).
Protože nastartování a ukončení Jetty trvá vždy pod jednu vteřinu, je celá práce rychlejší než když použijete Tomcat.
Pro použití stačí přidat jetty mezi Maven pluginy vašeho projektu v souboru pom.xml:
<build> <plugins> <plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>maven-jetty-plugin</artifactId> <version>6.0.1</version> <configuration> <connectors> <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector"> <port>9090</port> <maxIdleTime>60000</maxIdleTime> </connector> </connectors> </configuration> </plugin> </plugins> </build>
No v javě mi tvorba webu nikdy nepřipadalo rychlejší… zřejmě je nutné jí umět
Já bych řekl, že se situace za poslední dva roky rapidně zlepšila a dnes pro Javu existují komponenty, které by jste např. pro PHP jen těžko hledali (např. JSF).
Nicméně souhlasím, že technologie okolo Javy vyžadují obvykle větší dávku znalostí.