Fork me on GitHub

Project organization


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.



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
|        \-
\- webapp/                                      (GUI code; packaging: WAR)
   |- pom.xml
   \- src/
      |- main/java/
      |  \ -org/codehaus/mojo/ui/
      |     |- Hello.gwt.xml
      |     \- client/
      \- 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/
|        \-
|  \- src/main/resources/
|     \- org/codehaus/mojo/
|        \- Domain.gwt.xml                          (Additionnal gwt.xml module file)
  <inherits name=""/>
  <source path="domain"/>

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: