dimanche 1 août 2010

Accélérer le développement d'applications web Java avec Maven

Lorsqu'une application web (war) est développée avec Maven, elle doit être re-déployée sur un serveur d'application pour être testée, même quand elle ne contient que des modifications de forme. En utilisant le plugin Jetty pour Maven, il est possible d'effectuer un rechargement dynamique des JSP de manière transparente.

Présentation

Le développement d'une application J2EE est généralement découpé en plusieurs couches (application n-tiers) :
  • La couche de présentation ne contient que les écrans de l'application et ne gère aucune logique métier
  • Les couches sous-jacentes contiennent la logique métier, le modèle de données de l'application ainsi que la liaison avec un éventuel SGBD
L'outil de build Maven permet de séparer proprement ces différentes couches en un projet dit multi-modules. Dans ce cas, le module contenant les écrans est packagé sous la forme d'une application web java (war) et contient tous les modules du projet.
Note : le cas des ear n'est pas pris en compte dans cet article.
Un problème fréquent consiste à effectuer des modifications de forme (par exemple, la mise en page de l'application) et à vouloir s'assurer que ces modifications sont conformes au résultat attendu. Il faut alors reconstruire toute l'application web et la redéployer sur un serveur d'application. On embarque alors inutilement toutes les couches sous-jacentes.

Le plugin Jetty pour Maven

Parmi les plugins disponibles pour Maven, on note la présence d'un serveur d'application à part entière : Jetty. Ce plugin permet de lancer un serveur J2EE sur l'application web générée. Il permet également de prendre directement en compte les modifications faites sur les fichiers du module.

Etape 1 - Création d'un projet Maven

Commençons par créer un projet d'application web avec Maven. Exécuter la commande suivante : $ mvn archetype:generate
Dans la liste des modèles de projet proposés, on note la présence du modèle "maven-archetype-webapp (An archetype which contains a sample Maven Webapp project.)". Dans mon cas, il porte le numéro 66.
Choose a number : 66
Choose version : 1.0
Define value for property 'groupId': fr.pingtimeout
Define value for property 'artifactId': maven-webapp
Define value for property 'version': 1.0-SNAPSHOT
Define value for property 'package': fr.pingtimeout
Le projet "maven-webapp" est maintenant créé. Il contient un seul fichier JSP et affiche le très célèbre "Hello World".
On peut vérifier que le module contient bien les fichiers attendus.

$ cd maven-webapp
$ tree
.
|-- pom.xml
`-- src
    `-- main
        |-- resources
        `-- webapp
            |-- WEB-INF
            |   `-- web.xml
            `-- index.jsp

Etape 2 - Ajout du plugin Jetty au module

Le plugin Jetty n'est pas encore utilisable à ce stade. Modifier le fichier pom.xml en ajoutant, dans la section "build", les lignes suivantes :
<plugins>
    <plugin>
        <groupId>org.mortbay.jetty</groupId>
        <artifactId>maven-jetty-plugin</artifactId>
    </plugin>
</plugins>
La section "build" doit donc être la suivante :
<build>
    <finalName>maven-webapp</finalName>
    <plugins>
        <plugin>
            <groupId>org.mortbay.jetty</groupId>
            <artifactId>maven-jetty-plugin</artifactId>
        </plugin>
    </plugins>
</build>
Jetty peut maintenant être utilisé dans le module avec la commande : $ mvn jetty:run
Note : si le projet n'est pas compilé, la cible "jetty:run" passera automatiquement les phases de compilation et de test.

Etape 3 - Premier et dernier test

Après avoir lancé le serveur, il est possible de consulter le résultat de la JSP à l'adresse : http://localhost:8080/maven-webapp/
Aucune opération supplémentaire n'est requise pour que Jetty prenne directement en compte les modifications effectuées aux fichiers JSP.
Modifier le fichier index.jsp afin d'y ajouter un message, par exemple :
<html>
  <body>
    <h2>Hello World!</h2>
    <hr/>
    <h3>
      <% out.println(";-)"); %>
    </h3>
  </body>
</html>
Rafraîchir le navigateur internet pour constater que, même sans recompilation, la modification a été prise en compte.

Et les frameworks dans tout ça ?

Jetty peut également redéployer des applications plus lourdes, notamment celles qui utilisent des frameworks comme Struts ou Vaadin. Ce point fera l'objet d'un prochain article.


Un moyen encore plus simple de faire du rechargement dynamique ? Des remarques sur ce tutoriel ? N'hésitez pas à vous exprimer dans les commentaires.

Aucun commentaire:

Enregistrer un commentaire