Rychlejší vývoj webových stránek v Javě

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:

  1. 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.
  2. 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.
  3. 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ů.
  4. 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>

2 thoughts on “Rychlejší vývoj webových stránek v Javě”

  1. 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í.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *