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:

Grafika:gwt-witajswiecie-zakonczonopoprawnie.png

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!

Osobiste