gwt-maven-plugin: fordítás részletesen + futtatás dev mode-ban

Használjuk a következő pom.xml-t, figyelve főként a build->outputDirectory property-re, valamint a két gwt-maven-plugin-os konfigurációra:



<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>hu.jbuzi.sandbox</groupId>
<artifactId>gwt-maven-module-A</artifactId>
<packaging>war</packaging>
<version>1.0.0-SNAPSHOT</version>
<properties>
<gwt.version>2.0.4</gwt.version>
<maven.compiler.source>1.6</maven.compiler.source>
<maven.compiler.target>1.6</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>com.google.gwt</groupId>
<artifactId>gwt-servlet</artifactId>
<version>${gwt.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.google.gwt</groupId>
<artifactId>gwt-user</artifactId>
<version>${gwt.version}</version>
<scope>provided</scope>
</dependency>

<!-- test -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>hu.jbuzi.sandbox</groupId>
<artifactId>gwt-maven-module-B</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<!--
mikor eclipse .project es .classpath fajlokat keszitunk a 'mvn eclipse:eclipse' paranccsal, akkor az outputDirectory erteke hatarozza meg, hogy mi lesz a default target path az eclipse-ben forditaskor, tehat ezzel tudjuk elerni, hogy eclipse-ben futtatva a gwt alkalmazast, a modositasaink szerver- es browserrefresh nelkul eletbe lepjenek
-->
<outputDirectory>${project.build.directory}/${project.build.finalName}/WEB-INF/classes</outputDirectory>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>gwt-maven-plugin</artifactId>
<version>1.3-SNAPSHOT</version>
<configuration>
<!--
a gwt-maven-plugin runTarget property erteke hatarozza meg, hogy 'mvn gwt:run'-nal inditott, dev/hosted mode altal feldobott segedablak 'Launch default browser' gombja milyen url-re dobjon
-->
<runTarget>Gwt_module_A.html</runTarget>

<!--
a gwt-maven-plugin hostedWebapp property erteke hatarozza, hogy a 'mvn gwt:run'-nal inditott jetty melyik konyvtarat hasznalja, mint war konyvtar, tehat hol keresse a webapp-ot (default ertek a /war lenne)
-->
<hostedWebapp>
${project.build.directory}/${project.build.finalName}
</hostedWebapp>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.0.2</version>
</plugin>
</plugins>
</build>
</project>


Ekkor:


1, 'mvn compile' elkészíti a target/gwt-maven-module-A-1.0.0-SNAPSHOT/WEB-INF/classes könyvtárat, plusz a tartalmát, azaz a src/main/java alól lefordított .java fájlok .class kimenetét, plusz az src/main/resources alól odamásolja a fájlokat. Kommentbe is odaírtam, de mégegyszer: nem a maven miatt kell, hogy ide generálódjon, hanem azért, mert ha majd eclipse-es projektet készítünk ebből mvn eclipse:eclipse-szel, akkor ne kelljen kézzel beállítanunk a Default output folder-t.


2, 'mvn war:war' vagy 'mvn package' a target/gwt-maven-module-A-1.0.0-SNAPSHOT/ alá beteszi a nyitó html-t és css-t (nálam Gwt_module_A.html és Gwt_module_A.css a legalapabb Greetings alkalmazásból), plusz a target/gwt-maven-module-A-1.0.0-SNAPSHOT/WEB-INF/lib -et létrehozza és bemásolja a jar-okat, valamint a target/gwt-maven-module-A-1.0.0-SNAPSHOT/WEB-INF/web.xml -t is odamásolja.


3, 'mvn gwt:compile' elvégzi a lassú gwt-s kompájlt, majd a megszületett modulkönytárat javascriptesTÜL és hátéemelesTÜL odateszi a target/gwt-maven-module-A-1.0.0-SNAPSHOT/ alá (nálam ez a modulkönyvtár: gwt_module_a).


4, 'mvn gwt:run' dev mode-ban elindítja az alkalmazást a target/gwt-maven-module-A-1.0.0-SNAPSHOT alól.



Tegyük hozzá gyorsan, hogy nekem az sosem szempont, hogy maven-esen commandline indítható legyen dev mode-ban a gwt-s project, ez inkább csak valami plusz; dev mode-ban mindig Eclipse-ben futtattom az appot.
A lényeg , hogy maven-esen forduljon az alkalmazás (gwt-s javascript generálással együtt) a Hudson miatt, hogy eclipse-ben mindenféle debug varázslás (hot code replacement kliensoldalon és szerveroldalon) működjön dev mode-ban, valamint, hogy a Hudson által készített war rilíz tomcat alá deployolva automatikusan fusson. Ezzel a pom.xml -lel és a belőle 'mvn eclipse:eclipse'-szel készített eclipse projekttel ezek működnek.

gwt-maven-plugin: gwt-s újrafordításhoz szükséges dolgok a jar-ba

Tegyük fel, hogy gwt-s kliensoldali modulunkat abszolút újrafelhasználhatóvá akarjuk tenni, tehát egy különálló jar-t generálnánk belőle, amire később egy másik gwt-s kliensoldali projekt/modul dependálhat. GWT ahhoz, hogy optimális javascriptet generáljon, mindig teljes kliensoldali forráskódból fordít, tehát magyarul a jar-ba bele kell kerüljenek a .java fájlok is a .class-ok mellé, plusz legalább még a modulleíró gwt.xml fájl. Kétféleképp tudjuk ezt elérni a pom.xml-ben:



1, A fapadosabb megoldás, ha az alap maven resource-másolgatós fícsörjével tesszük ezt:




...



src/main/java

**/*.java



src/main/resources

**/*.gwt.xml




...



2, Közel ekvivalens megoldás, viszont tisztább, szárazabb, jobb, ha a gwt-maven-plugin -nal tesszük ezt:



...



org.codehaus.mojo
gwt-maven-plugin
1.2



resources






...



A 2,-es megoldásnak előnye többek közt, hogy nem kell beégetni, hogy src/main/java vagy src/main/resources alatt van a gwt.xml (ez azért fontos, mert a Google Eclipse Plugin-nek voltak/vannak problémái azzal, ha nem az src/main/java alatt van ez a leíró). Másik előny, hogy ha esetleg csak szerveroldali kódok is vannak a jar-ban, akkor azok mellé nem másol fölöslegesen .java forrásfájlt is, ezzel kisebb az eredmény jar mérete.

top