GWT (2.0) + maven + több projektes fejlesztés

Múltkor megnéztük, hogyan lehet m2eclipse segítségével gwt-zni maven-es környezettel. Egy probléma azonban volt az eredménnyel, mégpedig az, hogy abban az esetben, ha több projektre akartuk szétbontani az alkamazásunkat, együtt kellett élnünk két maven parancs futtatással, amelyeket minden egyes függőség projekt módosítás után futtatni kellett: mvn install (a függőség projekten) + mvn package (a gwt projekten). Ez sajnos fájdalmas nagy projekt esetén.


Közben viszont Józsa Kristóf rámutatott a maven eclipse plugin (hogy egyértelműbb legyen: az, amit mvn eclipse:eclipse -szel kell futtatni) egy számomra eddig ismeretlen fícsörére, nevezetesen, hogy nem csak egyszerűen a lokális maven repót címezi meg a függőség jar-ok lelőhelyeként, hanem a workspace-ünkben levő projektekre közvetlenül dependál. Szerintem ez a több projektes fejlesztés létminimuma, szóval meg kellett tudnom, hogyan is kell ezt. Lelövöm a poént, annyi a lényeg, hogy kell csinálni egy parent projektet, amiben a <modules> alatt fel van sorolva az összes projekt, ami a workspace-ünkbe is bekerül, majd ezen a parent-en futtatni az mvn eclipse:eclipse -et. (Hozzáteszem, hogy én a flat maven projekthierarchiát részesítem előnyben, tehát ahol a szülő a gyerekekkel egy szinten van).


Most akkor nulláról dobjunk össze egy többprojektes próbát (m2eclipse így most nem játékos, command line futtatjuk a maven-t, ezenkívül eclipse kell és google plugin). Verziók az előző bejegyzésem szerintiek.



  1. Csináljunk egy google webapp-ot, ezt alakítjuk át majd maven-esre. Így legalább kapunk egyből egy tesztkörnyezetet, azaz a Greetings app-ot.



  2. Alakítsuk át a projektstruktúrát maven-esre: csináljunk src/main/java forráskönyvtárt eclipse-ben az src helyett. Így néz ki az eredmény:



  3. Csináljuk meg azt a maven projektet, ami a függősége lesz a gwt projektnek: groupid: hu.jbuzi.sandbox; artifactid: gwt-maven-eclipse-dependency; version: 1.0.0-SNAPSHOT. pom.xml:


    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    4.0.0
    hu.jbuzi.sandbox
    gwt-maven-eclipse-dependency
    jar
    1.0.0-SNAPSHOT

    1.6
    1.6




    junit
    junit
    4.7
    test





    org.apache.maven.plugins
    maven-compiler-plugin
    2.1

    ${maven.compiler.source}
    ${maven.compiler.target}








  4. Csináljuk meg a parent projektet (csak pom-ot tartalmaz). Itt a pom.xml hozzá:

    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    4.0.0
    hu.jbuzi.sandbox
    gwt-maven-eclipse-parent
    1.0.0-SNAPSHOT
    pom
    gwt-maven-eclipse-parent

    1.6
    1.6


    ../gwt-maven-eclipse-dependency
    ../gwt-maven-eclipse




    org.apache.maven.plugins
    maven-compiler-plugin
    2.1

    ${maven.compiler.source}
    ${maven.compiler.target}



    org.apache.maven.plugins
    maven-eclipse-plugin
    2.8







  5. Másoljuk be ezt a pom.xml-t a gwt-s projekt könyvtárába (gwt-maven-eclipse):


    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    4.0.0
    hu.jbuzi.sandbox
    gwt-maven-eclipse
    war
    1.0.0-SNAPSHOT

    2.0.2
    1.6
    1.6



    com.google.gwt
    gwt-servlet
    ${gwt.version}
    runtime


    com.google.gwt
    gwt-user
    ${gwt.version}
    provided




    junit
    junit
    4.7
    test





    org.codehaus.mojo
    gwt-maven-plugin
    1.2


    org.apache.maven.plugins
    maven-war-plugin
    2.0.2







  6. gwt-maven-eclipse-parent könyvtárban állva, futtassunk egy mvn eclipse:eclipse -et.

  7. gwt projekten még kell kicsit reszelni (ezt sejteti, ha Refresh-t/F5-öt nyomunk eclipseben rajta, hibák jönnek), hogy teljesen maven-es legyen. Csináljuk src/main/webapp könyvtárat (nem kell, hogy source könyvtár legyen), mozgassuk bele a .css és .html fájlokat, csináljunk WEB-INF-et, abba meg mozgassuk bele a web.xml-t (végén mutatok screenshotot).

  8. Továbbra is a gwt projekten: jobb gomb -> Properties -> Google -> Web Application: This project has a WAR directory-nál legyen bent a pipa és src/main/webapp -ra írjuk át, és a Launch and deploy from this directory-ról vegyük le a pipát:




  9. gwt-s projektben commandline futtassunk egy mvn package-t, hogy létrehozza a megfelelő war könyvtárat, és így ebbe bele tudjuk irányítani a lefordított .class-okat. Jobb klatty -> Properties -> Build path -> Default output folder: gwt-maven-eclipse/target/gwt-maven-eclipse-1.0.0-SNAPSHOT/WEB-INF/classes:




  10. Csekkoljuk, hogy minden klappol-e. Fordítsuk le a google eclipse pluginnal a projektet. Jobb gomb -> Google -> GWT compile. A WAR folder kiválasztásnál a target/gwt-maven-eclipse-1.0.0-SNAPSHOT -ot adjuk meg, úgylesz jó.


  11. Futtassuk is, jobb klatty -> Run as... -> Web application. WAR könyvtár megadásnál ugyanazt adjuk meg, mint fordításnál: target/gwt-maven-eclipse-1.0.0-SNAPSHOT.


  12. Namost importáljuk be a függőség projektet eclipse-be (ami igazából még nincs bekötve függőségként). Jobb gomb -> Import... -> Existing projects into Workspace.


  13. src/main/java -ba hu.jbuzi.sandbox.gwtmaveneclipsedependency alá vegyük fel a GreetingsMsgCreator osztályt:

    package hu.jbuzi.sandbox.gwtmaveneclipsedependency;

    public class GreetingsMsgCreator {
    public String createMsg(){
    return "csipcsupcsodák";
    }
    }



  14. Tegyük be a gwt (gwt-maven-eclipse) projekt pom.xml -jébe függőségnek a gwt-maven-eclipse-dependency-t:


    hu.jbuzi.sandbox
    gwt-maven-eclipse-dependency
    1.0.0-SNAPSHOT




  15. Commandline a parent projektben futtassuk az mvn eclipse:eclipse -et megint, hogy végre láthassuk a csodát. Eclipse-ben ilyenkor utána mindig refresheljünk.


  16. Namost egy ilyen mvn eclipse:eclipse elront két dolgot az eddigi beállításainkon: az egyik, hogy visszaállítja a default output folder-t a target/classes-ra. Ezt könnyen orvosolhatjuk, írjuk a pom.xml <build> node alá: <outputDirectory>target/gwt-maven-eclipse-1.0.0-SNAPSHOT/WEB-INF/classes</outputDirectory>. A másik, hogy a GWT SDK library függőséget megszűnteti, erre nem tudok szép megoldást, minden mvn eclipse:eclipse után nyomjunk jobb gombot a projekten -> Google -> Web Toolkit -> és vegyük ki a pipát, majd egyből tegyük vissza, ezzel visszatér a világ rendje. Azt hiszem, ez kibírható áldozat.


  17. GreetingServiceImpl greetServer fv.-ének az utsó sorát írjuk át, hogy a mi jó kis üzenetkreálónkat is használja:

    return "Hello, " + input + "!

    I am running " + serverInfo
    + ".

    It looks like you are using:
    " + userAgent + "
    "+ new GreetingsMsgCreator().createMsg();



  18. futtassuk az alkalmazást debug módban(jobb klatty -> Debug as... -> Web Application).
    Tesztelhetjük, ha átírjuk a csipcsupcsodák szöveget. Nem csak, hogy a két maven parancsot megúsztuk, de az egész szerver restartot is.




Azaz szerver újraindítás nélkül tudunk szerveroldali módosításokat végezni, ezek egyből életbe lépnek (persze szokásos restrikciókkal: metódus szignatúrát nem érinthet a változás) + nem kell szenvednünk az m2eclipse-es bugoktól (kilőhetetlen végtelen build proecessek, stb.).


Végül egy kép a két projekt layoutjáról + a végső pom.xml a gwt-maven-eclipse projektben:







xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
4.0.0
hu.jbuzi.sandbox
gwt-maven-eclipse
war
1.0.0-SNAPSHOT

2.0.2
1.6
1.6



com.google.gwt
gwt-servlet
${gwt.version}
runtime


com.google.gwt
gwt-user
${gwt.version}
provided


hu.jbuzi.sandbox
gwt-maven-eclipse-dependency
1.0.0-SNAPSHOT



junit
junit
4.7
test



target/gwt-maven-eclipse-1.0.0-SNAPSHOT/WEB-INF/classes


org.codehaus.mojo
gwt-maven-plugin
1.2


org.apache.maven.plugins
maven-war-plugin
2.0.2




top