Nicolas De loof

publicité
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
Téléchargement