Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Maven2 Nicolas De loof - Raphaël Piéroni
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Qui sommes nous ? Nicolas De loof Committer Maven depuis fin 2007 plugins JavaScript et GWT Raphaël Piéroni Committer depuis l'été 2007 réécriture complète du mécanisme d'archetype
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Prologue
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Prologue Ant = java make Répétition (copier/coller) d’un projet à l’autre…
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Prologue Génération des binaires Distribution Qualimétrie Documentation Configuration IDE Génération de code Gestion de version
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Prologue Maven 1 = scripts Ant mutualisés (« plugins ») outillés par des tags Jelly Dérive progressive comme langage de Script Invocations inter-plugins … cycles Mutualisation ?
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Prologue Prendre les bonnes idées de Maven 1 … sans les faiblesses
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique
Maven2 … c’est quoi ? Quelques règles de structure Un moteur d’exécution de plugins … et rien d’autre ! Et surtout pas un N-ième langage de script !
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Conventions… Maven établit des conventions « raisonnables » sur la structure du projet : Sources dans src Livrables dans src/main Tests dans src/test Tout ce qui est construit dans target Code généré dans target/generated-sources …
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique … over configuration Conventions = moins de configuration pour chaque plugin Plus d’homogénéité entre projets Un projet « basique » peut être compilé, testé, packagé par maven sans configuration dédiée.
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique exemple com.mycompany foo log4j
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Plugin Ecrit en Java Projet « maven » à part entière Peut exploiter toute librairie java jugée utile Configuré par Injection de dépendances Exécution 100% étanche : indépendant du projet et des autres plugins
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique LifeCycle Validate generate-sources generate-resources process-resources compile process-classes test-compile test package integration-test verify install deploy phasesplugins resource:resource compiler:compile surefire:test jar:jar install:install deploy:deploy
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique LifeCycle Validate generate-sources generate-resources process-resources compile process-classes test-compile test package integration-test verify install deploy phasesplugins resource:resource compiler:compile surefire:test jar:jar install:install deploy:deploy cxf:wsdl2java
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Communication inter-plugins Validate generate-sources generate-resources process-resources compile process-classes test-compile test package integration-test verify install deploy phasesplugins resource:resource compiler:compile surefire:test jar:jar install:install deploy:deploy cxf:wsdl2java
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Communication inter-plugins Validate generate-sources generate-resources process-resources compile process-classes test-compile test package integration-test verify install deploy phasesMavenProject addSourceRoot getSourceRoots plugins resource:resource compiler:compile surefire:test jar:jar install:install deploy:deploy cxf:wsdl2java
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Plugins : toujours plus Il est aisé d’ajouter un plugin Outillage de test Contrôle qualité Génération de code Packaging spécifique … SANS impact sur l’existant
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Plugins : où les trouver ? Plugins « officiels » : Plugins « communautaires » : Plugins spécifiques cxf, jaxws, cargo, …
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Besoin spécifique ? L’écriture d’un plugin est facile (plus que celle d’une tâche ANT) En Java, Groovy, BeanShell … Projet Java/Maven à part entière toutes les librairies sont accessibles le plugin peut être outillé de tests Mécanisme de documentation intégré La diffusion/mutualisation du plugin est facilitée
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique démo Un besoin « spécifique » Codage en Groovy Application Swing Framework spécifique …
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Dépendances Maven gère les dépendances nécessaire au projet
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Transitivité Mon projet dépend d’ Hibernate Hibernate dépend d’ EHcache Donc Mon projet dépend d’ EHcache
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Transitivité Vous sauriez gérer ça à la main ?
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Effet de bord Maven encourage les librairies ciblées plutôt que le gros JAR qui fait tout Plus de librairies Gestion fine des dépendances
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Repository = Dépôt de librairies Dépôt local ($HOME/.m2/repository) Évite la multiplication des.jar sur le poste de dev. Dépôt(s) public(s) ( Mise à disposition rapide des librairies libres Dépôt privé Gestion fine des librairies, libres ou non
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique SNAPSHOTS Version « en cours de développement » Permet de diffuser une version non finalisée par défaut, exclu des repositories Très utilisé pour les plugins
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique SNAPSHOTS org.codehaus.mojo gwt-maven-plugin 1.0-SNAPSHOT eclipse compile generateAsync …
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Deploiement sourceforge sync to central scp://shell.sourceforge.net/… sourceforge snapshot repository false scp://shell.sourceforge.net/…
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Repository d’entreprise
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Extrapolation Les valeurs des attributs XML peuvent être déduites d’une propriété : 2.5.5
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Extrapolation Centralisation de la configuration org.springframework spring-aop ${spring.version} maven-compiler-plugin ${maven.compile.source} ${maven.compile.target} ${project.build.sourceEncoding}
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Profils Spécialiser le build Profil « fast » Profil « dev » Profil « ci » Profil « release » Activation À la demande -Pxxx Sur critère (OS, fichier, propriété « -D », …)
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique
POM.xml Formalisme XML incroyablement verbeux.. et désormais intouchable pour rester compatible
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique POM.xml org.codehaus.plexus plexus-archiver 1.0-alpha-9 org.codehaus.plexus plexus-container-default org.codehaus.plexus plexus-component-api <dependency groupId="org.codehaus.plexus" artifactId="plexus-archiver" version="1.0-alpha-9"> org.codehaus.plexus:plexus-container-default org.codehaus.plexus:plexus-component-api
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique POM.xml org.codehaus.mojo xml-maven-plugin 1.0-beta-2 transform generate-sources src/main/wsdl adg.wsdl... adg.wsdl...
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Support des IDE ? Netbeans : IntelliJ IDEA : Eclipse :… en progrès Sondage : quel IDE utilisez vous ?
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Release early, release often Peu de développeurs + Politique frileuse Apache + Mécanisme de SNAPSHOTS = Les releases de plugin sont rares
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Plugins absents De nombreux outils n’ont toujours pas de plugin maven2 La faute du plugin AntRun ? La faute de l’API Maven ?
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Dépendances transitives De nombreux projets déclarent des dépendances superflues / incorrectes Règle : un POM.xml publié n’est jamais modifié Les choses s’améliorent… Utiliser un dépôt privé !
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique JAR javax.* absents Pour raison de licence ! Mais qui s’en soucie à part la fondation Apache ? Pourquoi pas un « accept licence ? [Y/N] » ? Dépôt sur java.net pour les APIs récentes
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Version Java cible XYZ.jar est-il compatible java 1.4 ? Le plugin YY nécessite Java5 Maven nécessite Java 1.4 Mon projet cible Java 1.3
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Doublons commons-beanutils + commons-beanutils-core commons-logging + commons-logging-api commons-io + org.apache.commons:-io …
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Exclusion globale Je ne VEUX PAS utiliser commons-logging !
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Tests d’intégration src/it/java ?
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Interrogations Fàce à OSGi et Java Modules … quelle place pour maven ? Plus généralement, quelle est la roadmap ?
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique
Conflits d’intérêts
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Conséquences Repository d’entreprise : Archiva vs Nexus Intégration sous Eclipse : q4e (iam) vs m2eclispe …
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Despot-driven ? Théoriquement, le développement est « piloté par la communauté » Et dans les faits ? Re: [M2] Are pom.xml settings.xml really well-formed? by Jason van Zyl – 2 Feb 09, 2008; 06:09pm We don't use Xerces, never have, never will.
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Techno-obscur Injection de dépendances : Plexus Séparation des classloaders : ClassWorlds Mapping Java / XML : Modello Trois projets clés, hors fondation apache Sondage : qui connaît au moins un de ces outils ?
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique
épilogue
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique « Killer » plugin : Release Génération du livrable du projet ? Option 1 : MaProcédureDe50PagesJamaisAJour.doc Option 2 : mvn release:prepare mvn release:perform
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Release démo
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique « Killer » plugin : Archetype Démarrer un projet « propre » en 2 minutes ? En se basant sur un projet de référence ! mvn archetype:create-from-project mvn archetype:generate
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Archetype démo
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique
Vos questions Quelles bonnes pratiques pour Maven ? Comment "Maveniser" un projet Web Tools Platform (WTP) ?
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Bonnes pratiques Adapter le projet à Maven, pas l’inverse Utiliser des modules ciblés et simple Penser « plugin » Participer à la communauté des utilisateurs Rapporter ses problèmes en utilisant un cas de test simple
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Bonnes pratiques Verrouiller les versions des plugins Indiquer les dépendances directes Lire la doc ;-) [2 « open-books »] Utiliser un gestionnaire de dépôt (archiva/nexus) Rester indépendant de l’environnement … éviter les settings.xml exotiques Attention au " -Dmaven.test.skip=true "
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Bonnes pratiques « Les meilleures pratiques sont celles qui correspondent à vos besoins »
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Maven et WTP Supporté par M2eclipse et Q4e
Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Question / réponses