Webapps avec maven et jetty
9 mai 2008 – 18:05Introduction
Dans cet article, je vais réaliser une application très simple (un helloWorld), le but est de montrer que l’utilisation de maven peut être simple et vous faciliter la vie (si si ,je vous assure)
Cette webapp sera déployée pour le moment sur jetty et non un jboss encore une fois pour alléger l’exercice.
Le code source sera disponible ici, via subversion : http://www.cestpasdur.com/svn/seriestv/. (login : guest, le mot de passe est vide), prendre la révision 28.
Afin d’intégrer un vrai processus de développement, nous procèderons par itération et celle ci sera mise en intégration continue sur Hudson.
Cette application va ensuite être réutilisée et améliorée dans une série d’article afin d’illustrer les points suivants :
- webapp simple avec maven
- webapp avec jsf
- webapp sécurisée avec spring-security
- webapp avec de la persistance JPA
- webapp ajax avec DWR richFaces
- webapp consommant et exposant des webservices en SOAP et REST avec apache CXF
- webapp exposant des services avec EJB3
Cet ensemble de technologies seront mises en place afin de gérer des utilisateurs.
Structure de l’application
Afin que cette application soit évolutive (nous allons procéder par itération afin d’ajouter les nouvelles fonctionnalités), cette application aura la structure suivante :
- seriestv-parent
- seriestv-war
- seriestv-ear
- seriestv-ejb3
- seriestv-ws
- … (à suivre)
Contenu du pom parent
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=”http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd”>
4.0.0
com.cestpasdur
seriestv
pom 0.1-SNAPSHOT
${project.artifactId} : pom parent
${project.artifactId}-war
maven-eclipse-plugin
2.4
org.springframework.ide.eclipse.core.springnature
org.springframework.ide.eclipse.core.springbuilder
false
false
1.5
central
http://repo1.maven.org/maven2
java.net
https://maven-repository.dev.java.net/nonav/repository
legacy
Explications :Nous sommes en cours de développement, l’application doit être en snapshot.SNAPSHOT siginfie que deux artifacts dans la même version snapshot peuvent être différents, ce qui n’est pas le cas des artifacts releasés, lorsque l’on demande a maven de récupérer des artifacts en snashot, il va s’assurer de télécharger la version d’un snapshot, soit par la présence d’un timestamp dans son nom, soit pas l’age du fichier).
Une release ne peut avoir de liens vers des artifacts en snapshot, car si vous builder deux fois l’application, celle ci peut être différente, ce qui est contraire aux bonnes pratiques.Le pom parent est packagé en pom, celui-ci n’est présent que pour faire hériter les sous modules de paramètrage commun (maven fonctionne sur le concept de l’héritage, ce qui ne devrait pas dépayser les déeloppeurs objets.GroupId + artifactId servent permettent de donner un livrable unique.Les modules sont des sous-ensembles de l’application, dans le pom parent nous utilisons une façon relative (un peu comme les liens en html) de lier le pom parent aux sous-projets le compsants. Ainsi lorsque nous demanderons à maven de builder le pom parent, celui ci va builder le pom parent + ses sous modules.Si je ne suis pas clair sur l’explication précédente, n”hésitez pas à me le mettre en commentaire, j’essaierais de mieux faire. Dans tous les cas, il reste la documentation de maven.Le site developpez.com a également une bonne introduction à maven. Il reste également le livre électronique better build with maven quiest disponible gratuitementen ligne
Contenu du pom du modules war
<project xmlns=”http://maven.apache.org/POM/4.0.0″
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=”http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd”>
<modelVersion>4.0.0</modelVersion>
<!– Lien vers le pom parent –>
<parent>
<groupId>com.cestpasdur</groupId>
<artifactId>seriestv</artifactId>
<version>0.1-SNAPSHOT</version>
</parent>
<groupId>com.cestpadur</groupId>
<artifactId>seriestv-war</artifactId>
<version>0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<!– needed for JSF and jetty–>
<dependency>
<groupId>javax.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>1.2_08</version>
</dependency>
<dependency>
<groupId>javax.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>1.2_08</version>
</dependency>
</dependencies>
<name>${parent.artifactId} : webapp</name>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.9</version>
<configuration>
<contextPath>/${project.artifactId}</contextPath>
<scanIntervalSeconds>3</scanIntervalSeconds>
<scanTargetPatterns>
<scanTargetPattern>
<directory>
src/main/webapp/WEB-INF
</directory>
<excludes>
<exclude>**/*.jsp</exclude>
<exclude>**/*.xhtml</exclude>
</excludes>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</scanTargetPattern>
</scanTargetPatterns>
</configuration>
</plugin>
<!– Afin de pouvoir utiliser les specificites java 5 car sinon java 1.3 par defaut–>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
Le maven-jetty-plugin va lors du goal maven suivant va démarrer une instance du serveur jetty contenant notre webapp à l’adresse http://localhost:8080/seriestv-war/, si vous faites des modifications sur les fichiers qui sont scannés toutes les 3 secondes par jetty, celles-ci seront prises en compte à chaud (ou hot deploy).
Si vous souhaiter modifier le port par défaut par jetty utilisé, je vous conseiller de vous référer à cette page qui vous apportera un peu plus de détail sur ce plugin.
Je ne suis pas entré en détail sur d’autres points tels que le web.xml, index.jsp, mais ils n’ont rien d’inhabituel, et vous pourrez voir le code source complet sur le subversion du site.
Nous allons bientôt compliquer les choses avec le prochain article sur l’intégration de JSF sur cette webapp.
4 Responses to “Webapps avec maven et jetty”
Intéressant, j’ai hate de voir la suite.
Concernant Maven, j’aime bien ajouter les plugins suivant :
-checkstyle
-pmd
-simian
-junit
-dashboard
-cobertura
-findbugs
-JXR
…
By Julien on mai 11, 2008
Je connais et utilises également ces plugins (sauf simian, et JXR que je ne connais pas).
Je mets le minimum sur l’application de façon à la faire fonctionner et que ce soit relativement simple à comprendre. Je bosse actuellement sur le prochain article avec JSF, mais on pourrait imaginer faire un article avec une mise en place de ces plugins sur une application, ca serait intéressant.
By admin on mai 12, 2008
J’ai oublié de dire que j’utilise le tout dans Continuum, je ne sais pas si tu connais. C’est utilisé pour l’intégration continue. Une des fonctionnalités est de générer automatiquement des builds (via maven w/ plugins) et de générer des rapports, par mail par exemple.
c’est le top pour vérifier que ton application est toujours OK, qu’il n’y a pas de regression ou de dépendances manquantes.
By Julien on mai 13, 2008
Oui, je connais, ma précédente mission on utilisait Continum également, mais maintenant j’utilise au boulot bamboo un produit d’atlassian.
Et sur mon serveur je débute avec Hudson produit gratuit qui me parait franchement sympathique.
By admin on mai 13, 2008