Fork me on GitHub

Project organization

Conventions

Compared to GWT Documentation on directory layout, the plugin follows Maven conventions:

Compared to the directory layout used by GWT, notice that the /war folder is replaced by the src/main/webapp folder, following maven-war-plugin conventions. The project structure generated by the gwt-maven-plugin archetype allready includes the adequate Google Plugin for Eclipse configuration. If you manually migrate a GWT project to Maven, you will need to configure the Google Plugin for Eclipse to use this folder.

POM configuration

In order to use gwt-maven-plugin, you will need to configure it using the plugins section of your POM.

You also need to include the GWT dependencies in your POM, and use the adequate gwt-maven-plugin version. The plugin will check this version and warn if you try to use inconsistent releases.

  <dependencies>
    <dependency>
      <groupId>com.google.gwt</groupId>
      <artifactId>gwt-servlet</artifactId>
      <version>2.8.0</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>com.google.gwt</groupId>
      <artifactId>gwt-user</artifactId>
      <version>2.8.0</version>
      <scope>provided</scope>
    </dependency>
  <dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>gwt-maven-plugin</artifactId>
        <version>2.8.0</version>
        <executions>
          <execution>
            <goals>
              <goal>compile</goal>
              <goal>generateAsync</goal>
              <goal>test</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

Note : Don't define gwt-dev as project dependency : this JAR only contains gwt SDK tools and has many common libraries packaged that may conflict with the ones defined for your project, resulting in uncomprehensible NoSuchMethodErrors. The gwt-maven-plugin will automagically resolve the required dependency and add it to classpath when lauching GWT tools.

Multi-project setup

Large Maven projects often are divided into sub-projects. This section describe the maven configuration needed to use such layout on GWT projects with gwt-maven-plugin. If you're not familiar with multi-module layout, please read first the related maven documentation.

NOTE that GWT also has a notion of module. Both Maven and GWT use the term module to define units of modularization. To a degree both concepts go hand in hand, as gwt-modules define boundaries at which Maven-modules might be cut. To not confuse these two terms though, for the rest of this section we will use the term module, if we talk about GWT-modules, in contrast to the term project, if we talk about Maven-modules.

First, we will setup a basic Maven project structure consisting of two sub-projects: one containing domain code and another one containing the actual GWT application. Like other web application, a common pattern is to separate GUI functionality from domain functionality (among others) :

parent/                                     (aggregating parent project)
|- pom.xml
|
|- domain/                                      (domain code, etc.; packaging: JAR)
|  |- pom.xml
|  \- src/main/java/
|     \- org/codehaus/mojo/domain
|        \- User.java
|
\- webapp/                                      (GUI code; packaging: WAR)
   |- pom.xml
   \- src/
      |- main/java/
      |  \ -org/codehaus/mojo/ui/
      |     |- Hello.gwt.xml
      |     \- client/Hello.java
      \- main/webapp/
         \- WEB-INF/web.xml

To convert the domain project to a valid GWT module, we add a module descriptor Domain.gwt.xml to the domain project that we can extend from our webapp Hello module.

|- domain/
|  |- pom.xml
|  \- src/main/java/
|     \- org/codehaus/mojo/domain/
|        \- User.java
|  \- src/main/resources/
|     \- org/codehaus/mojo/
|        \- Domain.gwt.xml                          (Additionnal gwt.xml module file)
<module>
  <inherits name="com.google.gwt.user.User"/>
  <source path="domain"/>
</module>

The domain project is not yet a valid GWT module: GWT compiler requires Java source files.

Configure Maven to package a sources JAR for domain project. In the webapp project, add a dependency to the ''sources JAR'' package:

<dependencies>
  <dependency>
    <groupId>com.mycompany</groupId>
    <artifactId>domain</artifactId>
    <version>${project.version}</version>
    <classifier>sources</classifier>
    <scope>provided</scope>
  </dependency>
</dependencies>