Avec la multiplication des Framework et des architectures, il est plus que jamais nécessaire de mettre en place une structuration de projets unifié. Depuis quelques mois, on voit se multiplier les initiatives autour de Maven. J'ai toujours trouvé ce Framework horriblement complexe pour le développeur quidam moyen. On y parle Artifact, GroupId, Snapshot, dépendances... Un vocabulaire dont peu de développeurs sont aujourd'hui familier. Plus globalement, et j'y reviendrai dans un futur billet, je trouve qu'on assiste aujourd'hui à une fracture entre des APIs souvent sur-dimensionnées, peu outillées, et une communauté de moins en moins formée.
Pour en revenir au besoin de structuration, GWT impose, lorsqu'on développe une application n-tiers (client, RPC, modèle du domaine, ...) une structure projet très particulière. Cette structure est générée par deux scripts fournis par GWT : ApplicationCreator et ProjectCreator.
Suite:
Or, un projet structuré par GWT s'avère souvent peu adapté lorsqu'il s'agit de mettre en place des tests unitaires, des règles de déploiement de fichier WAR vers un conteneur de servlet externe ou de personnaliser plusieurs cibles etc ... Et puis il ne faut pas oublier les dépendances, on a souvent besoin avec GWT d'intégrer des bibliothèques externes (GWT-Ext ou GXT, Incubator, Gin-GUICE, ...). A chaque dépendance, il convient d'insérer un lien dans le fichier .launch d'Eclipse, puis une ligne dans les fichiers project-compile et enfin une ligne dans le fichier project-shell.cmd. Bref Maven est un excellent outil pour résoudre ce genre de problèmatique.
Mais au delà de cette problématique, c'est lors de la création de la structure d'un projet sous Eclipse avec les ArcheType que Maven s'avère le plus pertinent. Pour faire une petite mise en perspective avec .NET, il existait à l'époque sous Visual Studio .NET un principe similaire dénommé les Entreprise Template Project (ETP). Avec les années, les ETP ont évolué vers les Text Template Transformation Toolkit (T4) qu'on retrouvera au coeur de VS 2008 et .NET V4 (utilisé notamment bientôt pour la V2 d'Entity Framework).
Les ArcheType sont aujourd'hui utilisés partout lorsqu'il s'agit de construire un projet Java "from-stratch" pour en faire un projet "plug-and-play". Quelque chose de très intéressant pour la mise en place de supports d'exercices pour une formation destinée à des plateformes diverses et hétérogènes. Ou simplement lorsqu'il s'agit de créer un nouvel environnement à un développeur venant d'arriver sur un projet.
Le principal outil utilisé pour marier GWT et Maven est l'excellent gwt-maven disponible sur Google Forge. Une fois Eclipse outillé avec le plugin m2, il est possible de créer un projet Maven de la manière suivante.
Une fois le projet Maven sélectionné, il reste à choisir le type de projet. Et c'est là qu'interviennent les catalogues d'Archetype dans Eclipse. Moyennant l'ajout d'un petit fichier XML contenant des méta-données Maven, il est possible de créer un structure prédéfinie.
Il reste ensuite à alimenter le projet à créer avec des propriétés Archetype, qui définiront les spécificités de l'environnement cible. Version de GWT, type de plateforme, etc ...
Une fois le projet généré, tout y est. De la possibilité de déployer vers un serveur Jetty avec WAR, l'intégration éventuelle avec des EJB, Spring ou n'importe quel autre serveur d'application (cf liste d'options). Le résultat est plutôt concluant...