Tworzenie aplikacji z Google Web Toolkit i Apache Maven 2
Z Jacek Laskowski - Wiki Projektanta Java EE
Po przeszukaniu forów i list dyskusyjnych w końcu udało mi się doszukać wtyczki dla Apache Maven 2 (M2), która pozwala na zarządzanie projektem korzystającym z Google Web Toolkit (GWT) - maven-googlewebtoolkit2-plugin. Wynika to prawdopodobnie z faktu, że większość skryptów zarządzających projektami korzystającymi z GWT oparta jest o bezpośrednie wykorzystanie Apache Ant (co zapewnia samo GWT podczas tworzenia projektu skryptem projectCreator) lub skorzystanie ze skryptów Ant niewprost poprzez wtyczkę M2 - maven-antrun-plugin. Artykuł przedstawia wtyczkę maven-googlewebtoolkit2-plugin dedykowaną do zadań związanych z projektem korzystającym z GWT dla projektów zarządzanych przez M2.
Gotowy projekt do uruchomienia (cała struktura projektu wraz z niezbędnymi elementami składowymi opisanymi poniżej) można pobrać jako gwt-witajswiecie-m2.zip.
Spis treści |
Utworzenie projektu aplikacji internetowej
Rozpoczynamy od stworzenia przestrzeni projektowej dla aplikacji internetowej za pomocą M2.
mvn archetype:create -DarchetypeArtifactId=maven-archetype-webapp -DarchetypeVersion=1.0 -DgroupId=pl.jaceklaskowski.gwt.witajswiecie -DartifactId=gwt-witajswiecie
Utworzony zostanie katalog gwt-witajswiecie, który będzie katalogiem głównym projektu i w którym wykonywane będą dalsze prace. Zmieniamy katalog bieżący na katalog projektu.
$ cd gwt-witajswiecie/
Utworzenie plików projektowych dla zintegrowanego środowiska programistycznego (IDE)
Rozwój aplikacji w zintegrowanym środowisku programistycznym (ang. IDE - Integrated Development Environment) może znacząco go uprościć pod warunkiem podjęcia dobrego wyboru. Ja urzeczony prostotą tworzenia aplikacji korzystających z GWT w IntelliJ IDEA stawiam tym razem na to środowisko i skorzystam z wtyczki idea do stworzenia wymaganych plików projektowych.
$ mvn idea:idea
Poza wtyczką idea możemy skorzystać z wtyczki eclipse do utworzenia plików projektowych dla Eclipse IDE, jak również bezpośrednio otworzyć projekt w NetBeans IDE bez konieczności generowania jakichkolwiek dodatkowych i specyficznych dla środowiska plików. Nie mam świadomości o stanie zaawansowania Oracle JDeveloper w kwestii wsparcia dla projektów zarządzanych przez M2.
Uruchamiam IntelliJ IDEA 6.0.5 i otwieram projekt gwt-witajswiecie.
Aktywacja wtyczki maven-googlewebtoolkit2-plugin w projekcie
Wprowadzamy zmiany w pliku konfiguracyjnym pom.xml zgodnie z opisem na Maven 2 Plugin for Google Web Toolkit z drobnymi zmianami, które wynikają ze zmian w działaniu wtyczki, które nie zostały odzwierciedlone w dokumentacji.
Zmieniamy nazwę projektu - element name - na Witaj Swiecie GWT.
Dodajemy repozytorium wtyczki maven-googlewebtoolkit2-plugin i jej zależności jak i samego GWT na gwt-maven.
<repositories>
<repository>
<id>gwt-maven</id>
<url>http://gwt-maven.googlecode.com/svn/trunk/mavenrepo/</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>gwt-maven</id>
<url>http://gwt-maven.googlecode.com/svn/trunk/mavenrepo/</url>
</pluginRepository>
</pluginRepositories>
Dodajemy konfigurację wykorzystywanych wtyczek - maven-compiler-plugin, maven-googlewebtoolkit2-plugin oraz maven-war-plugin do sekcji build.
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0</version>
<configuration>
Niepoprawny język.
Musisz wybrać język w następujący sposób: <source lang="html4strict">...</source>
Języki obsługiwane w podświetlaniu składni:
abap, actionscript, actionscript3, ada, apache, applescript, apt_sources, asm, asp, autoit, avisynth, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, c_mac, caddcl, cadlisp, cfdg, cfm, cil, cmake, cobol, cpp, cpp-qt, csharp, css, d, dcs, delphi, diff, div, dos, dot, eiffel, email, erlang, fo, fortran, freebasic, genero, gettext, glsl, gml, gnuplot, groovy, haskell, hq9plus, html4strict, idl, ini, inno, intercal, io, java, java5, javascript, kixtart, klonec, klonecpp, latex, lisp, locobasic, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, make, matlab, mirc, modula3, mpasm, mxml, mysql, nsis, oberon2, objc, ocaml, ocaml-brief, oobas, oracle11, oracle8, pascal, per, perl, php, php-brief, pic16, pixelbender, plsql, povray, powershell, progress, prolog, properties, providex, python, qbasic, rails, rebol, reg, robots, ruby, sas, scala, scheme, scilab, sdlbasic, smalltalk, smarty, sql, tcl, teraterm, text, thinbasic, tsql, typoscript, vb, vbnet, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xml, xorg_conf, xpp, z80
<target>1.5</target>
</configuration>
</plugin>
<plugin>
<groupId>com.totsp.gwt</groupId>
<artifactId>maven-googlewebtoolkit2-plugin</artifactId>
<version>1.5.3-SNAPSHOT</version>
<configuration>
<runTarget>pl.jaceklaskowski.gwt.witajswiecie.WitajSwiecieGWT/WitajSwiecieGWT.html</runTarget>
<compileTarget>
<param>pl.jaceklaskowski.gwt.witajswiecie.WitajSwiecieGWT</param>
</compileTarget>
<gwtHome>c:/apps/gwt</gwtHome>
</configuration>
<executions>
<execution>
<goals>
<goal>mergewebxml</goal>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<webXml>target/web.xml</webXml>
</configuration>
</plugin>
</plugins>
Dla uproszczenia materiału parametr konfiguracyjny gwtHome, którego wartość jest zależna od środowiska lokalnego a nie projektu, został wyspecyfikowany w pom.xml. Jest to podejście nierekomendowane i jako zależne od środowiska lokalnego powinno trafić do pliku settings.xml - patrz sekcja Setup - lub być podane/nadpisane poprzez podanie go na linii poleceń jako parametr google.webtoolkit.home.
$ mvn -Dgoogle.webtoolkit.home="c:\apps\gwt-1.3.3" ...
Należy zwrócić uwagę na parametr konfiguracyjny compileTarget wtyczki maven-googlewebtoolkit2-plugin, który przyjmuje wartości typu tablicowego i zastosowanie się do zaleceń dokumentacji prowadzi do błędów (patrz wątek M2 1.5.2 error when attempting gwt:compile target).
Wystarczy również domyślnie ustawienie parametru logLevel wtyczki maven-googlewebtoolkit2-plugin o wartości INFO zamiast zaprezentowanego w dokumentacji poziomu ALL, co w zasadzie sprowadza się do usunięcia logLevel całkowicie.
Na końcu deklarujemy zależności projektu od bibliotek GWT.
<dependency> <groupId>com.google.gwt</groupId> <artifactId>gwt-user</artifactId> <version>1.3.3</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.google.gwt</groupId> <artifactId>gwt-servlet</artifactId> <version>1.3.3</version> </dependency>
Ostatecznie plik pom.xml powinien wyglądać następująco:
<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>pl.jaceklaskowski.gwt.witajswiecie</groupId> <artifactId>gwt-witajswiecie</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name>Witaj Swiecie GWT</name> <url>http://www.JacekLaskowski.pl</url> <repositories> <repository> <id>gwt-maven</id> <url>http://gwt-maven.googlecode.com/svn/trunk/mavenrepo/</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>gwt-maven</id> <url>http://gwt-maven.googlecode.com/svn/trunk/mavenrepo/</url> </pluginRepository> </pluginRepositories> <build> <finalName>gwt-witajswiecie</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.0</version> <configuration>
Niepoprawny język.
Musisz wybrać język w następujący sposób: <source lang="html4strict">...</source>
Języki obsługiwane w podświetlaniu składni:
abap, actionscript, actionscript3, ada, apache, applescript, apt_sources, asm, asp, autoit, avisynth, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, c_mac, caddcl, cadlisp, cfdg, cfm, cil, cmake, cobol, cpp, cpp-qt, csharp, css, d, dcs, delphi, diff, div, dos, dot, eiffel, email, erlang, fo, fortran, freebasic, genero, gettext, glsl, gml, gnuplot, groovy, haskell, hq9plus, html4strict, idl, ini, inno, intercal, io, java, java5, javascript, kixtart, klonec, klonecpp, latex, lisp, locobasic, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, make, matlab, mirc, modula3, mpasm, mxml, mysql, nsis, oberon2, objc, ocaml, ocaml-brief, oobas, oracle11, oracle8, pascal, per, perl, php, php-brief, pic16, pixelbender, plsql, povray, powershell, progress, prolog, properties, providex, python, qbasic, rails, rebol, reg, robots, ruby, sas, scala, scheme, scilab, sdlbasic, smalltalk, smarty, sql, tcl, teraterm, text, thinbasic, tsql, typoscript, vb, vbnet, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xml, xorg_conf, xpp, z80
<target>1.5</target>
</configuration>
</plugin>
<plugin>
<groupId>com.totsp.gwt</groupId>
<artifactId>maven-googlewebtoolkit2-plugin</artifactId>
<version>1.5.3-SNAPSHOT</version>
<configuration>
<runTarget>pl.jaceklaskowski.gwt.witajswiecie.WitajSwiecieGWT/WitajSwiecieGWT.html</runTarget>
<compileTarget>
<param>pl.jaceklaskowski.gwt.witajswiecie.WitajSwiecieGWT</param>
</compileTarget>
<gwtHome>c:/apps/gwt</gwtHome>
</configuration>
<executions>
<execution>
<goals>
<goal>mergewebxml</goal>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<webXml>target/web.xml</webXml>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.google.gwt</groupId>
<artifactId>gwt-user</artifactId>
<version>1.3.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.google.gwt</groupId>
<artifactId>gwt-servlet</artifactId>
<version>1.3.3</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Po zmianach może być konieczne ponowne uruchomienie odpowiedniej wtyczki M2 dla zintegrowanego środowiska programistycznego, np. idea, aby zaktualizować pliki projektu, po tym kiedy zmieniły się zależności projektowe (sekcja dependencies).
UWAGA: Po zmianach w repozytoriach dla wtyczki i zależności konieczne jest uruchomienie poleceń M2 w trybie aktywnego połączenia (ang. online) w celu pobrania odpowiednich bibliotek.
Utworzenie aplikacji GWT
Skorzystamy z aplikacji GWT, która dostępna jest pod adresem http://www.jaceklaskowski.pl/aplikacje/WitajSwiecieGWT.zip. Została ona opisana w Notatniku Projektanta Java EE w GWT RPC - mechanizm zdalnego wywoływania procedur w GWT. Pozostaje rozmieszczenie plików aplikacji zgodnie z wymaganiami M2.
Plik konfiguracyjny modułu - WitajSwiecieGWT.gwt.xml
W podkatalogu pl/jaceklaskowski/gwt/witajswiecie katalogu src/main/resources umieszczam plik konfiguracyjny modułu - WitajSwiecieGWT.gwt.xml o następującej treści:
<module> <inherits name='com.google.gwt.user.User'/> <entry-point class='pl.jaceklaskowski.gwt.witajswiecie.client.WitajSwiecieGWT'/> <servlet path="/uslugaZdalna" class="pl.jaceklaskowski.gwt.witajswiecie.server.UslugaZdalnaImpl"/> </module>
Część kliencka
W podkatalogu pl/jaceklaskowski/gwt/witajswiecie/client katalogu src/main/java umieszczam klasę główną modułu pl.jaceklaskowski.gwt.witajswiecie.WitajSwiecieGWT - klasę WitajSwiecieGWT.
package pl.jaceklaskowski.gwt.witajswiecie.client;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.ui.*;
import com.google.gwt.user.client.rpc.AsyncCallback;
public class WitajSwiecieGWT implements EntryPoint {
public void onModuleLoad() {
final Button b = new Button("Przycisnij");
b.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
UslugaZdalnaAsync remoteService = UslugaZdalna.App.getInstance();
remoteService.wykonajZadanieNaSerwerze("Jacek", "Laskowski", new AsyncCallback() {
public void onSuccess(Object result) {
b.setText("Zakonczono poprawnie - wynik: " + result);
}
public void onFailure(Throwable caught) {
b.setText("Zakonczono niepoprawnie");
caught.printStackTrace();
}
});
}
});
RootPanel.get().add(b);
}
}
oraz części klienckie usługi zdalnej RPC - interfejsy UslugaZdalna
package pl.jaceklaskowski.gwt.witajswiecie.client;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
import com.google.gwt.user.client.rpc.RemoteService;
import com.google.gwt.core.client.GWT;
public interface UslugaZdalna extends RemoteService {
public String wykonajZadanieNaSerwerze(String imie, String nazwisko);
/**
* Metoda pomocnicza utworzona przez IntelliJ IDEA
* Use UslugaZdalna.App.getInstance() to access static instance of NowyRemoteServiceAsync
*/
public static class App {
private static UslugaZdalnaAsync ourInstance = null;
public static synchronized UslugaZdalnaAsync getInstance() {
if (ourInstance == null) {
ourInstance = (UslugaZdalnaAsync) GWT.create(UslugaZdalna.class);
((ServiceDefTarget) ourInstance).setServiceEntryPoint(GWT.getModuleBaseURL() + "uslugaZdalna");
}
return ourInstance;
}
}
}
i UslugaZdalnaAsync.
package pl.jaceklaskowski.gwt.witajswiecie.client;
import com.google.gwt.user.client.rpc.AsyncCallback;
public interface UslugaZdalnaAsync {
void wykonajZadanieNaSerwerze(String imie, String nazwisko, AsyncCallback async);
}
Część serwerowa
W podkatalogu pl/jaceklaskowski/gwt/witajswiecie/server katalogu src/main/java umieszczamy implementację interfejsu usługi zdalnej - klasę UslugaZdalnaImpl.
package pl.jaceklaskowski.gwt.witajswiecie.server;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import pl.jaceklaskowski.gwt.witajswiecie.client.UslugaZdalna;
public class UslugaZdalnaImpl extends RemoteServiceServlet implements UslugaZdalna {
public String wykonajZadanieNaSerwerze(String imie, String nazwisko) {
System.out.println("UslugaZdalnaImpl.wykonajZadanieNaSerwerze");
// Tutaj możnaby oczekiwać bardziej wyrafinowanego przetwarzania
return imie + " " + nazwisko;
}
}
Część publiczna
W podkatalogu pl.jaceklaskowski.gwt.witajswiecie.WitajSwiecieGWT (jest to nazwa pojedyńczego katalogu z kropkami i nie jest to pomyłką) katalogu src/main/webapp umieszczamy część publiczną aplikacji - plik WitajSwiecieGWT.html
<html>
<head>
<title>Aplikacja WitajSwiecieGWT</title>
<meta name='gwt:module' content='pl.jaceklaskowski.gwt.witajswiecie.WitajSwiecieGWT'>
<link rel=stylesheet href="WitajSwiecieGWT.css">
</head>
<body>
<script language="javascript" src="gwt.js"></script>
<iframe id="__gwt_historyFrame" style="width:0;height:0;border:0"></iframe>
<h1>Aplikacja WitajSwiecieGWT</h1>
</body>
</html>
oraz WitajSwiecieGWT.css
body {
background-color: white;
color: black;
font-family: Arial, sans-serif;
font-size: small;
margin: 8px;
}
W podkatalogu WEB-INF katalogu src/main/webapp umieszczamy deskryptor aplikacji internetowej - web.xml o następującej treści (plik już istnieje jako wynik utworzenia projektu przy pomocy M2, więc pozostaje zastąpić aktualną treść na poniższą):
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee web-app_2_5.xsd" version="2.5"> <display-name>Witaj Swiecie GWT</display-name> </web-app>
Uruchomienie projektu
Pierwsze sprawdzenie poprawnej konfiguracji projektu rozpoczniemy od próby jego skompilowania - nie tylko kompilatorem Java, ale również GWT - wywołując zadanie gwt:compile. Będzie to dobre sprawdzenie poprawności konfiguracji wtyczki maven-googlewebtoolkit2-plugin, zależności projektowych oraz rozmieszczenia elementów składowych aplikacji w strukturze katalogowej projektu.
$ mvn gwt:compile [INFO] Scanning for projects... [INFO] Searching repository for plugin with prefix: 'gwt'. [INFO] ---------------------------------------------------------------------------- [INFO] Building Witaj Swiecie GWT [INFO] task-segment: [gwt:compile] [INFO] ---------------------------------------------------------------------------- [INFO] [gwt:compile] Using classpath: c:\projs\gwt-witajswiecie\target\classes;C:\.m2\com\google\gwt\gwt-servlet\1.3.3\gwt-servlet-1.3.3.jar;c:\apps\gwt\gwt-dev-linux.jar;c:\apps\gwt\gwt-dev-mac.jar;c: \apps\gwt\gwt-dev-windows.jar;c:\apps\gwt\gwt-user.jar;c:\projs\gwt-witajswiecie\src\main\resources;c:\projs\gwt-witajswiecie\src\main\java [INFO] Running GWTCompile with command: c:\apps\java5\jre\bin\java -classpath c:\projs\gwt-witajswiecie\target\classes;C:\.m2\com\google\gwt\gwt-servlet\1.3.3\gwt-servlet-1.3.3.jar ;c:\apps\gwt\gwt-dev-linux.jar;c:\apps\gwt\gwt-dev-mac.jar;c:\apps\gwt\gwt-dev-windows.jar;c:\apps\gwt\gwt-user.jar;c:\projs\gwt-witajswiecie\src\main\resources;c:\projs\gwt-witajs wiecie\src\main\java com.google.gwt.dev.GWTCompiler -logLevel INFO -style OBF -out c:\projs\gwt-witajswiecie\target\gwt-witajswiecie pl.jaceklaskowski.gwt.witajswiecie.WitajSwiecie GWT Output will be written into c:\projs\gwt-witajswiecie\target\gwt-witajswiecie\pl.jaceklaskowski.gwt.witajswiecie.WitajSwiecieGWT Copying all files found on public path Compilation succeeded [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESSFUL [INFO] ------------------------------------------------------------------------ [INFO] Total time: 9 seconds [INFO] Finished at: Sat May 05 23:52:18 CEST 2007 [INFO] Final Memory: 3M/254M [INFO] ------------------------------------------------------------------------
Poprawne uruchomienie polecenia gwt:compile pozwala na wykonanie kolejnego - uruchomienia aplikacji w środowisku rozwojowym GWT przy pomocy innego zadania gwt:gwt.
$ mvn gwt:gwt
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'gwt'.
[INFO] ----------------------------------------------------------------------------
[INFO] Building Witaj Swiecie GWT
[INFO] task-segment: [gwt:gwt]
[INFO] ----------------------------------------------------------------------------
[INFO] Preparing gwt:gwt
[INFO] [resources:resources]
[INFO] Using default encoding to copy filtered resources.
[INFO] [compiler:compile]
Compiling 4 source files to c:\projs\gwt-witajswiecie\target\classes
[INFO] [gwt:mergewebxml {execution: default}]
Looking for file: c:\projs\gwt-witajswiecie\src\main\java\pl\jaceklaskowski\gwt\witajswiecie\WitajSwiecieGWT.gwt.xml
Looking for file: c:\projs\gwt-witajswiecie\src\main\resources\pl\jaceklaskowski\gwt\witajswiecie\WitajSwiecieGWT.gwt.xml
Module file: c:\projs\gwt-witajswiecie\src\main\resources\pl\jaceklaskowski\gwt\witajswiecie\WitajSwiecieGWT.gwt.xml
Unable to parse module: com.google.gwt.user.User
[INFO] [gwt:compile {execution: default}]
Using classpath: c:\projs\gwt-witajswiecie\target\classes;C:\.m2\com\google\gwt\gwt-servlet\1.3.3\gwt-servlet-1.3.3.jar;c:\apps\gwt\gwt-dev-linux.jar;c:\apps\gwt\gwt-dev-mac.jar;c:
\apps\gwt\gwt-dev-windows.jar;c:\apps\gwt\gwt-user.jar;c:\projs\gwt-witajswiecie\src\main\resources;c:\projs\gwt-witajswiecie\src\main\java
[INFO] Running GWTCompile with command: c:\apps\java5\jre\bin\java -classpath c:\projs\gwt-witajswiecie\target\classes;C:\.m2\com\google\gwt\gwt-servlet\1.3.3\gwt-servlet-1.3.3.jar
;c:\apps\gwt\gwt-dev-linux.jar;c:\apps\gwt\gwt-dev-mac.jar;c:\apps\gwt\gwt-dev-windows.jar;c:\apps\gwt\gwt-user.jar;c:\projs\gwt-witajswiecie\src\main\resources;c:\projs\gwt-witajs
wiecie\src\main\java com.google.gwt.dev.GWTCompiler -logLevel INFO -style OBF -out c:\projs\gwt-witajswiecie\target\gwt-witajswiecie pl.jaceklaskowski.gwt.witajswiecie.WitajSwiecie
GWT
Output will be written into c:\projs\gwt-witajswiecie\target\gwt-witajswiecie\pl.jaceklaskowski.gwt.witajswiecie.WitajSwiecieGWT
Copying all files found on public path
Compilation succeeded
[INFO] [resources:testResources]
[INFO] Using default encoding to copy filtered resources.
[INFO] [compiler:testCompile]
[INFO] No sources to compile
[INFO] [surefire:test]
[INFO] No tests to run.
[INFO] [war:war]
[INFO] Exploding webapp...
[INFO] Assembling webapp gwt-witajswiecie in c:\projs\gwt-witajswiecie\target\gwt-witajswiecie
[INFO] Copy webapp webResources to c:\projs\gwt-witajswiecie\target\gwt-witajswiecie
[INFO] Generating war c:\projs\gwt-witajswiecie\target\gwt-witajswiecie.war
[INFO] Building war: c:\projs\gwt-witajswiecie\target\gwt-witajswiecie.war
[INFO] [gwt:gwt]
Using classpath: c:\projs\gwt-witajswiecie\target\classes;C:\.m2\com\google\gwt\gwt-servlet\1.3.3\gwt-servlet-1.3.3.jar;c:\apps\gwt\gwt-dev-linux.jar;c:\apps\gwt\gwt-dev-mac.jar;c:
\apps\gwt\gwt-dev-windows.jar;c:\apps\gwt\gwt-user.jar;c:\projs\gwt-witajswiecie\src\main\resources;c:\projs\gwt-witajswiecie\src\main\java
[INFO] Running GWT with command: c:\apps\java5\jre\bin\java -Dcatalina.base=c:\projs\gwt-witajswiecie\target\tomcat -classpath c:\projs\gwt-witajswiecie\target\classes;C:\.m2\com\g
oogle\gwt\gwt-servlet\1.3.3\gwt-servlet-1.3.3.jar;c:\apps\gwt\gwt-dev-linux.jar;c:\apps\gwt\gwt-dev-mac.jar;c:\apps\gwt\gwt-dev-windows.jar;c:\apps\gwt\gwt-user.jar;c:\projs\gwt-wi
tajswiecie\src\main\resources;c:\projs\gwt-witajswiecie\src\main\java com.google.gwt.dev.GWTShell -logLevel INFO -style OBF -port 8888 -out c:\projs\gwt-witajswiecie\target\gwt-wit
ajswiecie pl.jaceklaskowski.gwt.witajswiecie.WitajSwiecieGWT/WitajSwiecieGWT.html
[INFO] Exited with code 0
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 25 seconds
[INFO] Finished at: Sat May 05 23:58:11 CEST 2007
[INFO] Final Memory: 7M/254M
[INFO] ------------------------------------------------------------------------
Po uruchomieniu aplikacji i wciśnięciu przycisku Przycisnij aplikacja powinna prezentować się następująco:
Wtyczka maven-googlewebtoolkit2-plugin udostępnia inne polecenia, które opisane są w dokumentacji wtyczki na stronie Maven 2 Plugin for Google Web Toolkit.
Tym samym udało się zestawić środowisko do tworzenia aplikacji GWT pod kontrolą Apache Maven 2 za pomocą wtyczki maven-googlewebtoolkit2-plugin. Miłej pracy z GWT!

