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 komentáře u „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 emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *