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 Génération de code Documentation Gestion de version Configuration IDE 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 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 <?xml version="1.0" encoding="UTF-8"?> <project> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany</groupId> <artifactId>foo</artifactId> <version>1.0.0</version> <dependencies> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.12</version> </dependency> </dependencies> <build> </build> </project> 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 phases Validate generate-sources generate-resources process-resources compile process-classes test-compile test package integration-test verify install deploy plugins 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 phases Validate generate-sources generate-resources process-resources compile process-classes test-compile test package integration-test verify install deploy plugins cxf:wsdl2java 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 Communication inter-plugins phases Validate generate-sources generate-resources process-resources compile process-classes test-compile test package integration-test verify install deploy plugins cxf:wsdl2java resource:resource compiler:compile [email protected] surefire:test jar:jar install:install deploy:deploy Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Communication inter-plugins phases Validate generate-sources generate-resources process-resources compile process-classes test-compile test package integration-test verify install deploy plugins cxf:wsdl2java resource:resource compiler:compile [email protected] MavenProject addSourceRoot getSourceRoots surefire:test jar:jar install:install deploy:deploy 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 » : http://maven.apache.org/plugins/ Plugins « communautaires » : http://mojo.codehaus.org/ 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) (http://repo1.maven.org/maven2) • 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 <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>gwt-maven-plugin</artifactId> <version>2.5.2-20080520.120258-2</version> <version>1.0-SNAPSHOT</version> <executions> <execution> <goals> <goal>eclipse</goal> <goal>compile</goal> <goal>generateAsync</goal> </goals> </execution> </executions> <configuration> … </configuration> </plugin> Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Deploiement <distributionManagement> <repository> <id>sourceforge</id> <name>sync to central</name> <url>scp://shell.sourceforge.net/…</url> </repository> <snapshotRepository> <id>sourceforge</id> <name>snapshot repository</name> <uniqueVersion>false</uniqueVersion> <url>scp://shell.sourceforge.net/…</url> </snapshotRepository> </distributionManagement> 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é : <properties> <spring.version>2.5.5</spring.version> </properties> Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique Extrapolation Centralisation de la configuration <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>${maven.compile.source}</source> <target>${maven.compile.target}</target> <encoding>${project.build.sourceEncoding}</encoding> </configuration> 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 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 <dependency <dependency> <groupId>org.codehaus.plexus</groupId> groupId="org.codehaus.plexus" <artifactId>plexus-archiver</artifactId> artifactId="plexus-archiver" <version>1.0-alpha-9</version> version="1.0-alpha-9"> <exclusions> <exclusion> <exclusion> org.codehaus.plexus:plexus-container-default </exclusion> <groupId>org.codehaus.plexus</groupId> <exclusion> <artifactId>plexus-container-default</artifactId> </exclusion> org.codehaus.plexus:plexus-component-api </exclusion> <exclusion> </dependency> <groupId>org.codehaus.plexus</groupId> <artifactId>plexus-component-api</artifactId> </exclusion> </exclusions> </dependency> Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique POM.xml <plugin groupId="org.codehaus.mojo" artifactId="xml-maven-plugin" <plugin> version="1.0-beta-2"> <groupId>org.codehaus.mojo</groupId> <execution phase="generate-sources" goal="transform" /> <artifactId>xml-maven-plugin</artifactId> <configuration> <version>1.0-beta-2</version> <transformationSet dir="src/main/wsdl"> <executions> <include>adg.wsdl</include> <execution> </transformationSet> <goals> ... <goal>transform</goal> </goals> <phase>generate-sources</phase> </execution> </executions> <configuration> <transformationSets> <transformationSet> <dir>src/main/wsdl</dir> <includes> <include>adg.wsdl</include> </includes> ... 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 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 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 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 Copyright © BreizhJug – License Creative Commons 2.0 France – Paternité - Partage des Conditions Initiales à l'Identique