maven-googlewebtoolkit2-plugin hébergé chez Google et gwt-maven-plugin par Codehaus. Finalement, les deux ont fusionné et les efforts de développement sont maintenant concentrés sur le second.
Le plugin Codehaus permet :
Par ailleurs, les concepteurs de GWT estiment que l’exécution et le débogage d’applications GWT en Hosted Mode doit se faire en mode "light", uniquement pour tester l'IHM. C'est pourquoi le Hosted Mode de GWT cherche un deuxième fichier web.xml
, dédié au débogage, différent du fichier web.xml
principal de l'application. Ce mode de fonctionnement, pratique dans le cas où une seule l’interface web est à tester en Hosted Mode, s’avère très contraignant dès lors que l’on veut tester l’intégralité de l’application, communications client/serveur comprises. De plus, dans un projet Maven standard, il n'y a qu'un seul fichier web.xml
... On souhaiterait donc pouvoir exécuter et déboguer dans Eclipse en utilisant le Hosted Mode et le fichier web.xml
standard de Maven.
Après pas mal de recherches et d'essais, nous avons identifiés 2 configurations viables. Les voici avec leur avantages et inconvénients.
Configuration Maven commune à chaque configuration :
<properties>
<gwt .version>1.7.0</gwt>
</properties>
<dependencies>
<dependency>
<groupid>com.google.gwt</groupid>
<artifactid>gwt-user</artifactid>
<version>${gwt.version}</version>
</dependency>
<dependency>
<groupid>com.google.gwt</groupid>
<artifactid>gwt-servlet</artifactid>
<version>${gwt.version}</version>
</dependency>
</dependencies>
<plugins>
<plugin>
<groupid>org.codehaus.mojo</groupid>
<artifactid>gwt-maven-plugin</artifactid>
<configuration>
<module>com.octo.gwt.FirstModule</module>
<runtarget>com.octo.gwt.FirstModule/FirstModule.html</runtarget>
<i18nmessagesbundle>com.octo.gwt.client.i18n.Messages</i18nmessagesbundle>
</configuration>
<executions>
...
<goal>compile</goal>
<goal>i18n</goal>
<goal>generateAsync</goal>
...
</executions>
</plugin>
</plugins>
De cette manière, le plugin est configuré pour compiler le projet et générer automatiquement les classes de services asynchrones et d'internationalisation lors de la génération des sources.
L’application est exécutable dans jetty via la commande mvn jetty:run-war
. Reste à réussir à l'exécuter / déboguer dans Eclipse via le Hosted Mode.
Pour améliorer la productivité des développements GWT, Google fournit un plugin GWT for Eclipse.
Le plugin Maven permet de générer un fichier .launch (commande mvn gwt:eclipse
) propre à chaque module GWT, qui est alors exécutée par le plugin GWT for Eclipse. Cela permet de lancer l'application et de la déboguer simplement dans l'IDE.
Il sera toutefois nécessaire de configurer l’application comme étant un projet "Google" dans Eclipse, soit directement via l'IDE (bouton droit sur le projet, "Google", "Web Toolkit Settings" et spécifier le SDK GWT à utiliser), soit en configurant le plugin maven-eclipse comme cela a été fait dans le pom.xml
du projet d'exemple.
Des problèmes de sécurité lors de la sérialisation / dé-sérialisation d'objets lors des appels GWT-RPC peuvent se produire. Il faudra d’abord veiller à rajouter l’url de chaque servlet nécessaire dans les fichiers de configuration de module .gwt.xml
, en plus de la déclaration dans le fichier web.xml
. Exemple :
<servlet path="/firstService" class="com.octo.gwt.server.FirstServiceImpl" />
Pour exécuter et déboguer l'application, il suffit alors de faire un ou un Debug As..
sur le fichier .launch
.
Avantages de la configuration "Plugin GWT for Eclipse"
Inconvénients de la configuration "Plugin GWT for Eclipse"
mvn clean
gwt.xml
en plus du fichier web.xml
Dans la première solution, il est nécessaire d'installer les SDK GWT, alors qu'en fait ceux-ci sont déjà récupérés par Maven et sont donc présents dans le repository local.
Nous avons donc développé une petite classe Java qui permet de lancer directement le projet en Hosted Mode, sans utiliser le plugin GWT for Eclipse, en utilisant les classes GWT via le classpath de Maven. Cette classe (Launcher.java
), dont le code est disponible dans les sources du projet : src/test/java/Launcher.java. Elle se base sur la configuration du plugin Maven GWT dans le pom.xml
pour obtenir les données de configuration nécessaires au lancement de l'application en Hosted Mode.
Une donnée de configuration supplémentaire est nécessaire pour le plugin :
<plugin>
<groupid>org.codehaus.mojo</groupid>
<artifactid>gwt-maven-plugin</artifactid>
<configuration>
.....
<hostedwebapp>target/hostedWebapp</hostedwebapp>
</configuration>
</plugin>
Pour le bon démarrage de l'application GWT, la classe Launcher recopie l'ensemble du répertoire Maven standard "src/main/webapp/" dans target/hostedWebapp avant de démarrer l'application, ce qui nous affranchi des problèmes de sécurité lié à la sérialisation. Il n'y a donc pas besoin d'ajouter les balises dans les fichiers de configuration des modules GWT. Et nous pouvons travailler avec le fichier web.xml
réel de l'application...
Il est par contre nécessaire d'ajouter dans les dépendances du projet gwt-dev, qui contient le Hosted Mode :
<dependency>
<groupid>com.google.gwt</groupid>
<artifactid>gwt-dev</artifactid>
<version>${gwt.version}</version>
<classifier>${env.PLATFORM}</classifier>
<scope>provided</scope>
</dependency>
La librairie gwt-dev étant dépendante du système d'exploitation, il est nécessaire de rajouter la variable d'environnement PLATFORM avec la valeur corresponde au jar à utiliser. (SET PLATFORM=windows
, export PLATFORM=linux
ou export PLATFORM=mac
)
Pour que GWT trouve le code source des classes de l'interface web, il faudra ajouter les répertoires "src/main/java" et "target/generated-sources/gwt" dans le classpath d'exécution de la 'Run configuration' d'Eclipse.
Avantages de la configuration "utilisation d'une classe de lancement"
main()
Inconvénients de la configuration "utilisation d'une classe de lancement"
Ces solutions ne sont pas parfaites. Elles sont cependant les meilleures que nous ayons trouvées compte tenu des différentes contraintes imposées par GWT.
Dans le cadre de notre projet GWT, nous avons opté pour la seconde solution pour sa simplicité d'utilisation. Configurer un environnement de développement pour le projet ne nécessite plus qu'un IDE et Maven. Dans le cas où l'équipe de développement serait déjà familière avec le Plugin GWT for Eclipse et souhaite passer à Maven, la première solution sera sans doute plus pertinente.
Il est à espérer que GWT 2.0 respectera plus les standards Maven, notamment en terme d'organisation de fichiers, afin de faciliter la mise en place d'environnement de développement industriel dédiés à GWT.
PS : l'ensemble de cet article s'applique à GWT 1.7. Il devrait aussi s'appliquer à GWT 1.6. GWT 1.5 utilisant Tomcat à la place de Jetty, certains détails peuvent changer. Les grands principes sont cependant transposables.
_
Pré requis :
- Avoir Java et Maven installés, avec la commande mvn disponible dans le PATH de l'OS - Avoir Eclipse installé (du moins pour la configuration Plugin GWT for Eclipse) - Télécharger les sources des deux projets d'exemple : demo-gwt-plugin et demo-gwt-launcher.
Configuration "Plugin GWT for Eclipse" :
Configuration "utilisation d’une classe de lancement" :
_