37
Apache Maven Mise en œuvre en entreprise Java User Group - Tours Mercredi 08 Octobre 2008

20081008 - Tours Jug - Apache Maven

Embed Size (px)

DESCRIPTION

Session Tours JUG en duo avec Benoît Lafontaine (OCTO Technology)

Citation preview

Page 1: 20081008  - Tours Jug - Apache Maven

Apache Maven Mise en œuvre en entreprise

Java User Group - Tours

Mercredi 08 Octobre 2008

Page 2: 20081008  - Tours Jug - Apache Maven

Copyright © 2008 -–Arnaud HERITIER & Benoit LAFONTAINE – Licence CC – Creative Commons 2.0 France – Paternité – Pas d'Utilisation Commerciale – Partage des Conditions Initiales à l'Identique

Arnaud Héritier

OCTO Technology Expert sénior aheritier AT octo DOT com http://www.octo.com

Maven Développeur (committer) depuis 2004 Membre du conseil de gestion du projet (Project Management

Committee) depuis 2005 aheritier AT apache DOT org http://maven.apache.org

2

Page 3: 20081008  - Tours Jug - Apache Maven

Copyright © 2008 -–Arnaud HERITIER & Benoit LAFONTAINE – Licence CC – Creative Commons 2.0 France – Paternité – Pas d'Utilisation Commerciale – Partage des Conditions Initiales à l'Identique

Benoit Lafontaine

OCTO Technology Architecte sénior Responsable du Centre de Compétences Java blafontaine AT octo DOT com http://www.octo.com

Maven Utilisateur de Maven 2 depuis 2006

3

Page 4: 20081008  - Tours Jug - Apache Maven

Copyright © 2008 -–Arnaud HERITIER & Benoit LAFONTAINE – Licence CC – Creative Commons 2.0 France – Paternité – Pas d'Utilisation Commerciale – Partage des Conditions Initiales à l'Identique

Ce soir

Pourquoi Maven ?

Maven, les concepts

Maven dans l’entreprise

Comment faire échouer son projet avec Maven ?

4

Page 5: 20081008  - Tours Jug - Apache Maven

Copyright © 2008 -–Arnaud HERITIER & Benoit LAFONTAINE – Licence CC – Creative Commons 2.0 France – Paternité – Pas d'Utilisation Commerciale – Partage des Conditions Initiales à l'Identique

POURQUOI MAVEN ?Apache Maven

5

Page 6: 20081008  - Tours Jug - Apache Maven

Copyright © 2008 -–Arnaud HERITIER & Benoit LAFONTAINE – Licence CC – Creative Commons 2.0 France – Paternité – Pas d'Utilisation Commerciale – Partage des Conditions Initiales à l'Identique

Construction d’un war en 2002

Construire un war Utilisation d’Eclipse limitée

• En ces temps reculés où WTP n’existait pas (uniquement dans la version payante d’IBM), eclipse ne permettait pas d’exporter des Wars

Gestion manuelle• Modifier les fichiers de paramétrage• Exporter les différents jar• Copier les dépendances (et nos jars), dans un répertoire lib• Faire un zip que l’on renomme en war• Tagguer l’ensemble des sources dans le répertoire de sources (CVS)• Envoi du fichier par FTP sur le serveur d’intégration• Se connecter à la console d’administration du serveur et déployer

l’application

Page 7: 20081008  - Tours Jug - Apache Maven

Copyright © 2008 -–Arnaud HERITIER & Benoit LAFONTAINE – Licence CC – Creative Commons 2.0 France – Paternité – Pas d'Utilisation Commerciale – Partage des Conditions Initiales à l'Identique

Construction d’un war en 2002

Combien de temps ça prend ? Quand tout va bien :

• 15 minutes Quand il y a des problèmes :

• ½ journée

Un seul problème, Y’a toujours des problèmes Erreur dans la configuration Oublie d’une dépendance Oublie d’un fichier Correction de dernière minute qui introduit une

régression… Autres

Page 8: 20081008  - Tours Jug - Apache Maven

Copyright © 2008 -–Arnaud HERITIER & Benoit LAFONTAINE – Licence CC – Creative Commons 2.0 France – Paternité – Pas d'Utilisation Commerciale – Partage des Conditions Initiales à l'Identique

Une première réponse : ANT

Ecriture d’un script Permet d’automatiser le process Durée réduite du processus réduite de moitiée Le processus ne monopolise personne

• On le lance et on passe à autre chose

Page 9: 20081008  - Tours Jug - Apache Maven

Copyright © 2008 -–Arnaud HERITIER & Benoit LAFONTAINE – Licence CC – Creative Commons 2.0 France – Paternité – Pas d'Utilisation Commerciale – Partage des Conditions Initiales à l'Identique

Les limites de ANT

Ecrire le script, c’est long

Modifier un script, c’est très long

Au final, le gains de temps n’est pas évident Mais c’est quand même plus

amusant Il est possible de réutiliser le

script !

Page 10: 20081008  - Tours Jug - Apache Maven

Copyright © 2008 -–Arnaud HERITIER & Benoit LAFONTAINE – Licence CC – Creative Commons 2.0 France – Paternité – Pas d'Utilisation Commerciale – Partage des Conditions Initiales à l'Identique

La réutilisation de scripts ANT

Les scripts ne sont pas directement réutilisables Structure de projets différents Besoins différents

Encore du temps perdu Modification du script Réécriture pour le rendre plus générique

Un nouveau métier s’est créé : scripteur ANT

Page 11: 20081008  - Tours Jug - Apache Maven

Copyright © 2008 -–Arnaud HERITIER & Benoit LAFONTAINE – Licence CC – Creative Commons 2.0 France – Paternité – Pas d'Utilisation Commerciale – Partage des Conditions Initiales à l'Identique

Quelques exemples

http://anonsvn.jboss.org/repos/seam/branches/community/Seam_2_0

http://junit.cvs.sourceforge.net/viewvc/junit/junit/build.xml?view=markup

http://findbugs.googlecode.com/svn/trunk/findbugs/build.xml

Page 12: 20081008  - Tours Jug - Apache Maven

Copyright © 2008 -–Arnaud HERITIER & Benoit LAFONTAINE – Licence CC – Creative Commons 2.0 France – Paternité – Pas d'Utilisation Commerciale – Partage des Conditions Initiales à l'Identique

LES CONCEPTSApache Maven

12

Page 13: 20081008  - Tours Jug - Apache Maven

Copyright © 2008 -–Arnaud HERITIER & Benoit LAFONTAINE – Licence CC – Creative Commons 2.0 France – Paternité – Pas d'Utilisation Commerciale – Partage des Conditions Initiales à l'Identique

L’arrivée de Maven

Convention Over Configuration On ne script plus, on décrit son projet (POM)

Architecture extensible Des plugins réutilisables évitent la multiplication des scripts de

build

Gestion des librairies du projet (versions, partage, ..) Référentiels de librairies Dépendances déclaratives Dépendances transitives

Amélioration de la qualité des livrables Contrôles Rapports

Page 14: 20081008  - Tours Jug - Apache Maven

Copyright © 2008 -–Arnaud HERITIER & Benoit LAFONTAINE – Licence CC – Creative Commons 2.0 France – Paternité – Pas d'Utilisation Commerciale – Partage des Conditions Initiales à l'Identique

Les conventions

1 projet Maven = 1 artéfact (pom, jar, war, ear, …)

1 organisation des répertoires prédéfinie

1 descripteur standardisé

14

Page 15: 20081008  - Tours Jug - Apache Maven

Copyright © 2008 -–Arnaud HERITIER & Benoit LAFONTAINE – Licence CC – Creative Commons 2.0 France – Paternité – Pas d'Utilisation Commerciale – Partage des Conditions Initiales à l'Identique 15

Le POM

Un fichier XML (pom.xml) Décrivant :

Identification du projet Version du projet Description du projet Liste des développeurs Dépendances …

<?xml version="1.0" encoding="UTF-8"?><project> <modelVersion>4.0.0</modelVersion> <groupId>com.octo</groupId> <artifactId>webapp-sample</artifactId> <version>1.1-SNAPSHOT</version> <packaging>war</packaging> <name>Simple webapp</name> <inceptionYear>2007</inceptionYear> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-struts</artifactId> <version>2.0.2</version> </dependency> … </dependencies></project>

Page 16: 20081008  - Tours Jug - Apache Maven

Copyright © 2008 -–Arnaud HERITIER & Benoit LAFONTAINE – Licence CC – Creative Commons 2.0 France – Paternité – Pas d'Utilisation Commerciale – Partage des Conditions Initiales à l'Identique

Les dépendances

Déclaratives groupId + artifactId + version (+ classifier)

Transitives Lib A Lib B Lib B Lib C Alors Lib A Lib C

Scopes d’utilisation Runtime : Taglibs Provided : API Servlet, Driver SGBD, … Compile : par défaut Test : Junit, DBUnit… System : non recommandé Import : Pour charger le dependencyManagement d’un autre pom.

16

Page 17: 20081008  - Tours Jug - Apache Maven

Copyright © 2008 -–Arnaud HERITIER & Benoit LAFONTAINE – Licence CC – Creative Commons 2.0 France – Paternité – Pas d'Utilisation Commerciale – Partage des Conditions Initiales à l'Identique 17

Sans Maven Avec Maven

Les dépendances

Page 18: 20081008  - Tours Jug - Apache Maven

Copyright © 2008 -–Arnaud HERITIER & Benoit LAFONTAINE – Licence CC – Creative Commons 2.0 France – Paternité – Pas d'Utilisation Commerciale – Partage des Conditions Initiales à l'Identique

Les référentiels de d’artéfacts

Par défaut : Un central

• http://repo1.maven.org/maven2• Propose plusieurs dizaines de Go de

librairies OSS. Un local

• ${user.home}/.m2/repository• Centralise toutes les artéfacts utilisés

et créés par vos projets

18

Page 19: 20081008  - Tours Jug - Apache Maven

Copyright © 2008 -–Arnaud HERITIER & Benoit LAFONTAINE – Licence CC – Creative Commons 2.0 France – Paternité – Pas d'Utilisation Commerciale – Partage des Conditions Initiales à l'Identique

Le reactor

Construit un projet et tous ces modules en résolvant l’ordre de leurs dépendances Projet 1

• Module A (dépend de B)• Module B• Module C (dépend de A)

Construira B puis A puis C

pom.xml de projet 1<modules> <module>moduleA</module> <module>moduleC</module> <module>moduleB</module></modules>

19

Page 20: 20081008  - Tours Jug - Apache Maven

Copyright © 2008 -–Arnaud HERITIER & Benoit LAFONTAINE – Licence CC – Creative Commons 2.0 France – Paternité – Pas d'Utilisation Commerciale – Partage des Conditions Initiales à l'Identique

L’héritage

Factorisation de paramètres entre projets/modules

L’organisation des sous modules et de l’héritage doit être technique (ejbs, wars, jars) et non pas fonctionnel (serviceA, serviceB, …)

Projet1 Jars

• Jar1• Jar2

Wars• War1• …

pom.xml de module Jar1<parent> <groupId>X.Y.Z</groupId> <artifactId>jars</artifactId>

<version>1.0-SNAPSHOT</version>

</parent>

20

Page 21: 20081008  - Tours Jug - Apache Maven

Copyright © 2008 -–Arnaud HERITIER & Benoit LAFONTAINE – Licence CC – Creative Commons 2.0 France – Paternité – Pas d'Utilisation Commerciale – Partage des Conditions Initiales à l'Identique

L’héritage naturel

Lorsque le parent sert aussi de reactor A condition que nom du module = son artifactId Evite la re-définition de certains éléments du pom :

• Url du site• Déploiement du site • Informations SCMs

21

Page 22: 20081008  - Tours Jug - Apache Maven

Copyright © 2008 -–Arnaud HERITIER & Benoit LAFONTAINE – Licence CC – Creative Commons 2.0 France – Paternité – Pas d'Utilisation Commerciale – Partage des Conditions Initiales à l'Identique

Site / Documentation

Génération d’un site documentaire à partir de documents dans différents formats : Xdocs (xml) Apt (wiki) Docbook ….

Génération de rapports sur le projet Descriptif Informations sur les dépendances Documentation automatique des plugins maven Javadoc Xref

22

Page 23: 20081008  - Tours Jug - Apache Maven

Copyright © 2008 -–Arnaud HERITIER & Benoit LAFONTAINE – Licence CC – Creative Commons 2.0 France – Paternité – Pas d'Utilisation Commerciale – Partage des Conditions Initiales à l'Identique

Site / Documentation

23

Page 24: 20081008  - Tours Jug - Apache Maven

Copyright © 2008 -–Arnaud HERITIER & Benoit LAFONTAINE – Licence CC – Creative Commons 2.0 France – Paternité – Pas d'Utilisation Commerciale – Partage des Conditions Initiales à l'Identique

Reporting / Contrôle qualité

Reporting - Réactif Je corrige les problèmes une fois étudié le rapport Les problèmes sont dans le gestionnaire de versions

Contrôle - Pro-actif Le build échoue si mon code ne respecte pas certaines règles Les problèmes ne sont pas dans le gestionnaire de versions

puisque je ne commit jamais un code qui ne build pas

Types de contrôles / reporting Résultat de l’exécution des tests : surefire Couverture de tests : clover, cobertura Qualité du code : findbugs Conformité aux standards : checkstyle Patterns / Antipatterns : pmd

24

Page 25: 20081008  - Tours Jug - Apache Maven

Copyright © 2008 -–Arnaud HERITIER & Benoit LAFONTAINE – Licence CC – Creative Commons 2.0 France – Paternité – Pas d'Utilisation Commerciale – Partage des Conditions Initiales à l'Identique

Reporting / Contrôle qualité

25

Page 26: 20081008  - Tours Jug - Apache Maven

Copyright © 2008 -–Arnaud HERITIER & Benoit LAFONTAINE – Licence CC – Creative Commons 2.0 France – Paternité – Pas d'Utilisation Commerciale – Partage des Conditions Initiales à l'Identique 26

Cycle de vie et plugins

Page 27: 20081008  - Tours Jug - Apache Maven

Copyright © 2008 -–Arnaud HERITIER & Benoit LAFONTAINE – Licence CC – Creative Commons 2.0 France – Paternité – Pas d'Utilisation Commerciale – Partage des Conditions Initiales à l'Identique

DANS L’ENTREPRISEApache Maven

27

Page 28: 20081008  - Tours Jug - Apache Maven

Copyright © 2008 -–Arnaud HERITIER & Benoit LAFONTAINE – Licence CC – Creative Commons 2.0 France – Paternité – Pas d'Utilisation Commerciale – Partage des Conditions Initiales à l'Identique

Build

Référentielbinaires

Récupérer les dépendances

Compiler

Exécuter les tests

Packager

Déployer

Documenter

Vérifier les règles de codage

BuildLocal

Gestionnaire de sources

Plateformedémonstration

L’intégration continue

BuildLocal

BuildLocal

Serveurd’intégration

continue

Build

Doumentation& Métriques

Notifications

Page 29: 20081008  - Tours Jug - Apache Maven

Copyright © 2008 -–Arnaud HERITIER & Benoit LAFONTAINE – Licence CC – Creative Commons 2.0 France – Paternité – Pas d'Utilisation Commerciale – Partage des Conditions Initiales à l'Identique 29

L’intégration continue

Develop

Package

Test

Deploy Application on

Integrationenvironment

Merge all changes

Make binariesAvailable on a

centralized placeDevelop

Get last version

of project 1Commit changes

on SCM

Project 1 Project 2

Automated Tasks

ManualTasks Manual

Tasks

Page 30: 20081008  - Tours Jug - Apache Maven

Copyright © 2008 -–Arnaud HERITIER & Benoit LAFONTAINE – Licence CC – Creative Commons 2.0 France – Paternité – Pas d'Utilisation Commerciale – Partage des Conditions Initiales à l'Identique 30

Référentiels de librairies

© OCTO Technology 2008

Page 31: 20081008  - Tours Jug - Apache Maven

Copyright © 2008 -–Arnaud HERITIER & Benoit LAFONTAINE – Licence CC – Creative Commons 2.0 France – Paternité – Pas d'Utilisation Commerciale – Partage des Conditions Initiales à l'Identique 31

Le processus de release

Verify there’sno more local

changes

VerifyUnit Tests

(and coding rules)

Commitchange

Change projectdescriptor to specify

released version

Verify that projectdoesn’t depend of

“SNAPSHOT” dependencies

Tag sourcesin SCM

Checkout taggedsources to be sureof the final binary

Deploy binaryon centralized

repository

Verifyunit tests

and coding rules

CompileCode

PackageBinary

Generateand Deploy

Documentation

CompileCode

Change projectdescriptor to specifynew current version

Commitchange

Page 32: 20081008  - Tours Jug - Apache Maven

Copyright © 2008 -–Arnaud HERITIER & Benoit LAFONTAINE – Licence CC – Creative Commons 2.0 France – Paternité – Pas d'Utilisation Commerciale – Partage des Conditions Initiales à l'Identique

COMMENT FAIRE ÉCHOUER SON PROJET AVEC MAVEN ?

Apache Maven

32

Page 33: 20081008  - Tours Jug - Apache Maven

Copyright © 2008 -–Arnaud HERITIER & Benoit LAFONTAINE – Licence CC – Creative Commons 2.0 France – Paternité – Pas d'Utilisation Commerciale – Partage des Conditions Initiales à l'Identique 33

10 bonnes pratiques pour faire échouer son projet

1. Ne pas utiliser les conventions

2. Mettre tout ce qui est possible de mettre dans le pom

3. Se rendre dépendant de l’environnement

4. Multiplier les niveaux d’héritage

5. Utiliser systématiquement "-Dmaven.test.skip=true »

6. Faire les releases à la main

7. S’échanger les jars par mail

8. Utilisation massive du plugin antrun

9. Essayer de définir les dépendances pour les autres

Page 34: 20081008  - Tours Jug - Apache Maven

Copyright © 2008 -–Arnaud HERITIER & Benoit LAFONTAINE – Licence CC – Creative Commons 2.0 France – Paternité – Pas d'Utilisation Commerciale – Partage des Conditions Initiales à l'Identique

10. Passer son temps dans la console

Page 35: 20081008  - Tours Jug - Apache Maven

Copyright © 2008 -–Arnaud HERITIER & Benoit LAFONTAINE – Licence CC – Creative Commons 2.0 France – Paternité – Pas d'Utilisation Commerciale – Partage des Conditions Initiales à l'Identique

Licence

Creative Commons

Contrat Paternité

Pas d'Utilisation Commerciale

Partage des Conditions Initiales à l'Identique

2.0 France

http://creativecommons.org/licenses/by-nc-sa/2.0/fr/

35

Page 36: 20081008  - Tours Jug - Apache Maven

Questions ?

36

Page 37: 20081008  - Tours Jug - Apache Maven

Copyright © 2008 -–Arnaud HERITIER & Benoit LAFONTAINE – Licence CC – Creative Commons 2.0 France – Paternité – Pas d'Utilisation Commerciale – Partage des Conditions Initiales à l'Identique

BUFFETMerci pour votre attention

37