138
Apache Maven - GenevaJUG - March 30 th , 2010 Arnaud Héritier eXo Platform Software Factory Manager

Geneva Jug (30th March, 2010) - Maven

Embed Size (px)

DESCRIPTION

Overview of Maven and its concepts Maven and its ecosystem Good and bad practices Usecases Maven, and the future of Maven 3.x --- Delta prez @GenevaJug : New slides : 64,65,90,95 Updated slides : 49-51;66;91;92;118 Thx @fcamblor

Citation preview

Page 1: Geneva Jug (30th March, 2010) - Maven

Apache Maven - GenevaJUG - March 30th, 2010

Arnaud Héritier eXo Platform

Software Factory Manager

Page 2: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Arnaud Héritier

●  Committer since 2004 and member of the Project Management Committee

●  Coauthor of « Apache Maven » published by Pearson (in French)

●  http://aheritier.net

●  Software Factory Manager eXo platform -  In charge of tools and

methods

Page 3: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

CHOOSE YOUR MENU Apache Maven

Page 4: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Overview ●  Definition ●  History ●  Concepts

-  Conventions -  POM -  Reactor and Modules -  Inheritance -  Artifact Repository -  Dependency -  Version -  Profiles -  Build Lifecycle And Plugins

●  Maven or not Maven, that is the question ! -  Maven, the project choice -  Maven, the corporate choice -  Competitors

Page 5: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Ecosystem ●  Repository Managers ●  Quality Management

-  Tests Automation -  Quality Metrics Reports -  Project Reports -  Sonar

●  Continuous Integration ●  IDE

-  Eclipse -  Idea IntelliJ -  Netbeans

Page 6: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Good & Bad Practices ●  K.I.S.S. ●  Project Organization ●  POM ●  Development

Page 7: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Usecases ●  Secure your credentials ●  Build a part of your project using reactor options ●  Automate your release process

-  (at least the technical part)

Page 8: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Back to the future ●  Maven 2.x ●  Maven 3.x ●  Community

Page 9: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

OVERVIEW Apache Maven

Page 10: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Definition ●  Apache Maven is a software project management

and comprehension tool. ●  Based on the concept of a project object model

(POM) -  Maven can manage a project's build, binaries,

reporting and documentation from a central piece of information.

Page 11: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

History ●  Initiated in 2001 by Jason Van Zyl in Alexandria, an

Apache Jakarta project, ●  Moved to Turbine few months after, ●  Became a Top Level Project in 2003. ●  Maven 2.0 released in September 2005 ●  Maven 3.0 … coming soon !!!

Page 12: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

CONCEPTS Apache Maven

12

Page 13: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Conventions ●  1 project = 1 artifact (pom, jar, war, ear, …)

●  Standardized -  directories layout

●  *.java to compile in src/[main|test]/java

●  *.xml, *.properties needed in classpath and to bundle in archive in src/[main|test]/resources

●  … -  project descriptor (POM) -  build lifecycle

13

Page 14: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

POM ●  An XML file (pom.xml)

●  Describing -  Project identification -  Project version -  Project description -  Build settings -  Dependencies -  …

<?xml version="1.0" encoding="UTF-8"?>!

<project>!

<modelVersion>4.0.0</modelVersion>!

<groupId>net.aheritier.samples</groupId>!

<artifactId>simple-webapp</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 15: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Reactor <project>!

...!

<modules>!

<module>moduleA</module>!

<module>moduleB</module>!

<module>moduleC</module>!

<module>moduleD</module>!

<module>moduleE</module> !

<module>moduleF</module>!

</modules>!

...!

</project>!

●  Split your project in sub-modules

●  Maven computes the build order from dependencies between sub-modules.

●  Modules have to be defined in the POM -  No auto-discovery for

performance reasons

Page 16: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Inheritance ●  Share settings between

projects/modules ●  By default the parent

project is supposed to be in the parent directory (../)

<parent>!

<groupId>net.aheritier.sample</groupId>!

<artifactId>my-parent</artifactId>!

<version>1.0.0-SNAPSHOT<version>!

</parent>!

Page 17: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Inheritance

Insert README in all artifacts

Use assembly to package batchs

Use clirr to validate backward compatibility

Use a technical inheritance to organize sub-modules

Page 18: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Artifact Repository ●  By default :

-  A central repository ●  http://repo1.maven.org/

maven2 ●  Several dozen of Gb of OSS

libraries -  A local repository

●  ${user.home}/.m2/repository ●  All artifacts

-  Used by maven and its plugins

-  Used by your projects (dependencies)

-  Produced by your projects

Page 19: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Artifact Repository ●  By default Maven

downloads artifacts required by the project or itself from central

●  Downloaded artifacts are stored in the local repository

●  Used to store : -  Project’s binaries -  Project’s dependencies -  Maven and plug-ins binaries

Page 20: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Without Maven With Maven

Dependencies

Page 21: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Dependencies ●  Declaratives

-  groupId + artifactId + version (+ classifier) -  Type (packaging) : jar, war, pom, ear, …

●  Transitives -  Lib A needs Lib B -  Lib B needs Lib C -  Thus Lib A needs Lib C

Page 22: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Dependencies ●  Scope

-  Compile (by default) : Required to build and run the application

-  Runtime : not required to build the application but needed at runtime

●  Ex : taglibs -  Provided : required to build the application but not

needed at runtime (provided by the container) ●  Ex : Servlet API, Driver SGBD, …

-  Test : required to build and launch tests but not needed by the application itself to build and run

●  Ex : Junit, TestNG, DbUnit, … -  System : local library with absolute path

●  Ex : software products

Page 23: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Dependencies ●  Define all dependencies you are using

-  and no more ! ●  If you have optional dependencies

-  Perhaps you should have optional modules instead ●  Cleanup your dependencies with

-  mvn dependency:analyze!●  Study your dependencies with

-  mvn dependency:tree!-  mvn dependency:list!

Page 24: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Versions ●  Project and dependency versions ●  Two different version variants -  SNAPSHOT version

●  The version number ends with –SNAPSHOT ●  The project is in development ●  Deliveries are changing over the time and are overridden

after each build ●  Artifacts are deployed with a timestamp on remote

repositories -  RELEASE version

●  The version number doesn’t end with –SNAPSHOT ●  Binaries won’t change

Page 25: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Versions

Page 26: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Versions ●  About SNAPSHOT dependencies

-  Maven allows the configuration of an update policy. The update policy defines the recurrence of checks if there is a new SNAPSHOT version available on the remote repository :

●  always ●  daily (by default) ●  interval:X (a given period in minutes) ●  never

-  Must not be used in a released project ●  They can change thus the release also ●  The release plugin will enforce it

Page 27: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Versions

●  Range -  From … to … -  Maven automatically searches for the corresponding

version (using the update policy for released artifacts) -  To use with caution

●  Risk of non reproducibility of the build ●  Risk of side effects on projects depending on yours.

Page 28: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Versions

mvn versions:set –DnewVersion=A.B.C-SNAPSHOT!

●  Use the versions plugin to update all versions of your project and its modules

Page 29: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Profiles

mvn <phases or goals> !

-PprofileId1,-profileId2 !

-P!profileId3!

●  Allow to modify the default behavior of Maven by overriding/adding some settings

●  Use mvn help:active-profiles to debug ●  Explicit activation or deactivation

Page 30: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Profiles

<settings>!

...!

<activeProfiles>!

<activeProfile>profile-1</activeProfile>!

</activeProfiles>!

...!

</settings>!

●  activeByDefault = If no other profile is activated ●  Activation through Maven settings

Page 31: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Profiles

<profiles>!

<profile>!

<activation>!

<property>!

<name>!skip-enforce</name>!

</property>!

</activation>!

...!

</profile>!

</profiles>!

<profiles>!

<profile>!

<activation>!

<property>!

<name>run-its</name>!

<value>true</value>!

</property>!

</activation>!

...!

</profile>!

</profiles>!

●  Activation based on environment variables

Page 32: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Profiles

<profiles>!

<profile>!

<activation>!

<os>!

<name>Windows XP</name>!

<family>Windows</family>!

<arch>x86</arch>!

<version>5.1.2600</version>!

</os>!

</activation>!

...!

</profile>!

</profiles>!

<profiles>!

<profile>!

<activation>!

<jdk>[1.3,1.6)</jdk>!

</activation>!

...!

</profile>!

</profiles>!

●  OS / Java settings

Page 33: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Profiles

<profiles>!

<profile>!

<activation>!

<file>!

<missing>${project.build.directory}/generated-sources/axistools/wsdl2java/</missing>!

</file>!

</activation>!

...!

</profile>!

</profiles>!

●  Activation on present or missing files

Page 34: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Build Lifecycle And Plugins

●  Plugin based architecture for a great extensibility

●  Standardized lifecycle to build all types of archetypes

Page 35: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Build Lifecycle And Plugins Default Lifecycle Clean Lifecycle Site Lifecycle validate pre-clean pre-site

initialize clean site generate-sources post-clean post-site

process-sources site-deploy generate-resources

process-resources

compile process-classes

generate-test-sources

process-test-sources

generate-test-resources

process-test-resources

test-compile

process-test-classes

test prepare-package

package pre-integration-test

integration-test

post-integration-test

verify

install deploy

Page 36: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Build Lifecycle And Plugins ●  Many plugins

-  Packaging -  Reporting -  IDE integration -  Miscellaneous tools integration

●  Many locations -  maven.apache.org -  mojo.codehaus.org -  code.google.com -  …

Page 37: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

MAVEN OR NOT MAVEN, THAT IS THE QUESTION !

Apache Maven

Page 38: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Maven, the project’s choice ●  Application’s architecture

-  The project has the freedom to divide the application in modules

-  Maven doesn’t limit the evolution of the application architecture

●  Dependencies management -  Declarative : Maven automatically downloads them and

builds the classpath -  Transitive : We define only what the module needs

itself

Page 39: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Maven, the project’s choice ●  Centralizes and automates

all development facets (build, tests, releases)

●  One thing it cannot do for you : to develop

-  Builds -  Tests -  Packages -  Deploys -  Documents -  Checks and reports about

the quality of developments

Page 40: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Maven, the corporate’s choice ●  Widely adopted and known

-  Many developers ●  Developments are standardized ●  Decrease of costs

-  Reuse of knowledge -  Reuse of configuration fragments -  Reuse of process and code fragments

●  Product quality improvement -  Reports and monitoring

Page 41: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Competitors ●  Ant + Ivy, Easy Ant, Gant, Gradle, Buildr… ●  Script oriented

-  You can do what you want ! ●  Reuse many of Maven conventions (directories

layout, …) and services (repositories) but without enforcing them

●  The risk for them : Not being able to evolve due to the too high level of customization proposed to the user. -  We tried on Maven 1 and it died because of that. It was

impossible to create a set of tests to cover all usages. -  It’s like providing a framework without public API

Page 42: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

You can have (if you have good skills)

But often you have (moreover after years …)

With scripts oriented builds

Page 43: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

We dream to deliver (Maven 3.x)

But today we have too often (Maven 2.x)

With Maven

Page 44: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

ECOSYSTEM Apache Maven

Page 45: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Maven’s ecosytem ●  Maven alone is nothing ●  You can integrate it with many tools

-  A large set of plug-ins is already available -  You can define your own plug-ins

Page 46: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

REPOSITORY MANAGERS Apache Maven

Page 47: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Repository Managers ●  Basic services

-  Search artifacts -  Browse repositories -  Proxy external repositories -  Host internal repositories -  Security

●  Several products -  Sonatype Nexus (replaced

Proximity) -  Jfrog Artifactory -  Apache Archiva

Page 48: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Secure your builds ●  Deploy a repository manager to proxy externals

repositories to : -  Avoid external network outages -  Avoid external repository unavailabilities -  To reduce your company’s external network usage -  To increase the speed of artifact downloads

●  Additional services offered by such servers : -  Artifacts procurement to filter what is coming from the

outside -  Staging repository to validate your release before

deploying it

Page 49: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Nexus at eXo for productivity

Page 50: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Nexus at eXo for collaboration ●  Deploy 3rd Party Artifacts ●  Collaborate with Internal

Repositories ●  Distribute to the community

with Public Repositories ●  Distribute to customers

with Private Repositories

Page 51: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Nexus at eXo for quality ●  Ease the Burden on Central and others remote

repositories ●  Gain Predictability and Scalability ●  Control and Audit Dependencies and Releases ●  Stage releases

Page 52: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

QUALITY MANAGEMENT Apache Maven

Page 53: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Tests Automation ●  Use automated tests as often as you can ●  Many tools are available through Maven

-  JUnit, TestNG – unit tests, -  Selenium, Canoo – web GUI test, -  Fitnesse, Greenpepper – functional tests, -  SoapUI – web services tests -  JMeter – performances tests -  And many more frameworks are available to reply your

needs

Page 54: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Quality Metrics ●  Extract quality metrics from your project and

monitor them : -  Code style (CheckStyle) -  Bad practices or potential bugs (PMD, FindBugs, Clirr) -  Tests coverage (Cobertura, Emma, Clover) -  …

●  You can use blocking rules -  For example, I break the build if the upward

compatibility of public APIs is broken ●  You can use reports

-  Reports are available in a web site generated by Maven

-  Or in a quality dashboard like Sonar

Page 55: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Dependency Report

Page 56: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Sonar, a quality dashboard

Page 57: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Sonar, analyze your project

Page 58: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Sonar, Continuous Improvement ?

Page 59: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

CONTINUOUS INTEGRATION Apache Maven

Page 60: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Continuous Integration ●  Setup a continuous integration server to :

-  Have a neutral and unmodified environment to run your tests

-  Quickly react when ●  The build fails (compilation failure for example) ●  A test fails ●  A quality metric is bad

-  Continuously improve the quality of your project and your productivity

●  Many products -  Hudson, Bamboo, TeamCity, Continuum,

Cruisecontrol, …

Page 61: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Hudson, how the weather is ?

Page 62: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Hudson : build, test, check

Page 63: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

IDE Apache Maven

Page 64: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Eclipse ●  Integration from maven (eclipse:eclipse)

-  Allow many customizations -  Support many versions/variants of eclipse -  Support many usages (ear …) -  Doesn’t support projects with “pom” packaging -  Few support from dev team -  Many bugs in classpath management -  Asynchronous

●  You have to regenerate and reload project each time you change a POM)

Page 65: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Eclipse ●  Integration from eclipse (m2eclipse)

-  Synchronous -  Nice UI and services to edit POMs -  Support projects with “pom” packaging -  Doesn’t support all usages like EAR with WTP -  Doesn’t support very well a large number of modules -  Slow down eclipse on large projects because of a lack

of support of incremental build in Maven 2.x and its plugins

Page 66: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Eclipse (m2eclipse)

Page 67: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Eclipse (m2eclipse)

Page 68: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Eclipse (m2eclipse)

Page 69: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Idea IntelliJ

Page 70: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Netbeans

Page 71: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

GOOD & BAD PRACTICES Apache Maven

Page 72: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

KISS Apache Maven

Page 73: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

K.I.S.S. ●  Keep It Simple, Stupid ●  Start from scratch

-  Do not copy/paste what you find without understanding ●  Use only what you need

-  It’s not because maven offers many features that you need to use them

●  Filtering ●  Modules ●  Profiles ●  …

Page 74: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

PROJECT ORGANIZATION GOOD & BAD PRACTICES

Apache Maven

Page 75: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Project bad practices ●  Ignore Maven conventions

-  Except if your are migrating from something else and the target has to be to follow them.

-  Except if they are not compatible with your IDE ●  Different versions in sub-modules

-  In that case they are standalone projects. ●  Too many inheritance levels

-  It makes the POMs maintenance more complex -  Where should I set this plugin parameter ? In which parent ?

Page 76: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Project bad practices ●  Have too many modules

-  Is there a good reason ? ●  Technical constraint ? ●  Team organization ?

-  It increases the build time ●  Many more artifacts to generate ●  Dependencies resolution more complex

-  It involves more complex developments ●  More modules to import in your IDE ●  More modules to update …

Page 77: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Project good practices

●  Use the default inheritance : -  The reactor project is also

the parent of its modules. -  Configuration is easier :

●  No need to redefine SCM settings, site distribution settings …

Page 78: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

POM GOOD & BAD PRACTICES Apache Maven

Page 79: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

POM bad practices

●  Dependencies : -  DON’T confuse dependencies and

dependencyManagement ●  Plugins :

-  DON’T confuse plugins and pluginManagement -  DON’T use AntRun plugin everywhere -  DON’T let Maven choose plugins versions for you

Page 80: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

POM bad practices ●  Profiles :

-  DON’T create environment dependant builds -  DON’T rely on dependencies coming from profiles

(there is no transitive activation of profiles) ●  Reporting and quality

-  DON’T activate on an existing project all reports with default configuration

-  DON’T control formatting rules without giving settings for IDEs.

●  DON’T put everything you find in your POM.

Page 81: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

POM good practices ●  Set versions of dependencies in project parent’s

dependencyManagement ●  Set dependencies (groupId, artifactId, scope) in

each module they are used ●  Use the dependency plugin (from apache) and

versions plugin (from mojo) to analyze, cleanup and update your dependencies.

Page 82: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

DEVELOPMENT GOOD & BAD PRACTICES

Apache Maven

Page 83: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Development bad practices ●  DON’T spend your time in the terminal, ●  DON’T exchange libraries through emails, ●  DON’T always use "-Dmaven.test.skip=true” ●  DON’T manually do releases

Page 84: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Development good practices ●  Keep up-to-date your version of Maven

-  For example in 2.1 the time of dependencies/modules resolution decreased a lot (Initialization of a project of 150 modules passed from 8 minutes to less than 1)

●  Use the reactor plugin (Maven < 2.1) or native reactor command line options (Maven >= 2.1) to rebuild only a subpart of your project : -  All modules depending on module XXX -  All modules used to build XXX

●  Try to not use Maven features not supported by your IDE (resources filtering with the plugin eclipse:eclipse)

Page 85: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

USECASES Apache Maven

Page 86: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

SECURE YOUR CREDENTIALS Apache Maven

Page 87: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Secure your credentials

-  arnaud@leopard:~$ mvn --encrypt-master-password toto {dZPuZ74YTJ0HnWHGm4zgfDlruYQNda1xib9vAVf2vvY=}

●  Generate a private key

<settingssecurity>!

<master>{dZPuZ74YTJ0HnWHGm4zgfDlruYQNda1xib9vAVf2vvY=}</master>!

</settingssecurity>!

●  We save the private key in ~/.m2/settings-security.xml

Page 88: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Secure your credentials -  <settingssecurity>

<relocation>/Volumes/ArnaudUsbKey/secure/settings-security.xml</relocation> </settingssecurity>!

●  You can move this key to another drive ~/.m2/settings.xml

●  You create an encrypted version of your server password

-  arnaud@mbp-arnaud:~$ mvn --encrypt-password titi{SbC9Fl2jA4oHZtz5Fcefp2q1tMXEtBkz9QiKljPiHss=}!

●  You register it in your settings

-  <settings> ... <servers> ... <server> <id>mon.server</id> <username>arnaud</username> <password>{SbC9Fl2jA4oHZtz5Fcefp2q1tMXEtBkz9QiKljPiHss=}</password> </server> ... </servers> ... </settings>!

Page 89: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

BUILD A PART OF YOUR PROJECT Apache Maven

Page 90: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Using Reactor Options ●  Options added in maven 2.1 ●  Available in 2.0.x with the maven-reactor-plugin

-  But syntax is longer ●  Allow to control what you want to build in your

project

Page 91: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Using Reactor Options

-  arnaud@mbp-arnaud:~$ mvn install [INFO] ------------------------------------------------[INFO] Reactor Summary: [INFO] [INFO] Project ....................... SUCCESS [2.132s] [INFO] ModuleA ....................... SUCCESS [5.574s] [INFO] ModuleB ....................... SUCCESS [0.455s] [INFO] ModuleC ....................... SUCCESS [0.396s] [INFO] ModuleD ....................... SUCCESS [0.462s] [INFO] ModuleE ....................... SUCCESS [0.723s] [INFO] ModuleF ....................... SUCCESS [0.404s]!

●  Builds everything from A to F

Page 92: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Using Reactor Options -  arnaud@mbp-arnaud:~$ mvn install –pl

moduleE,moduleB [INFO] ------------------------------------------- [INFO] Reactor Summary: [INFO] [INFO] ModuleB .................. SUCCESS [2.774s] [INFO] ModuleE .................. SUCCESS [1.008s]

●  Builds only modules B and E ●  Following dependencies order ●  -pl --project-list: Build the

specified reactor projects instead of all projects

Page 93: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Using Reactor Options -  arnaud@mbp-arnaud:~$ mvn install –pl moduleD -am

[INFO] ------------------------------------------ [INFO] Reactor Summary: [INFO] [INFO] ModuleA ................. SUCCESS [4.075s] [INFO] ModuleB ................. SUCCESS [0.468s] [INFO] ModuleC ................. SUCCESS [0.354s] [INFO] ModuleD ................. SUCCESS [0.384s]

●  Builds module D (-pl) and all modules it uses as dependencies

●  -am --also-make: If a project list is specified, also make projects that the list depends on

●  Usecase : Build all modules required for a war, ear, …

Page 94: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Using Reactor Options -  arnaud@mbp-arnaud:~$ mvn install –pl moduleD -amd

[INFO] ------------------------------------------ [INFO] Reactor Summary: [INFO] [INFO] ModuleD ................. SUCCESS [4.881s] [INFO] ModuleE ................. SUCCESS [0.478s] [INFO] ModuleF ................. SUCCESS [0.427s]

●  Builds module D (-pl) and all modules which depend on it

●  -amd --also-make-dependents: If a project list is specified, also make projects that depend on projects on the list

●  Usecase : Check that a change in a module didn’t break others which are using it

Page 95: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Using Reactor Options -  arnaud@mbp-arnaud:~$ mvn install –rf moduleD

[INFO] ------------------------------------------ [INFO] Reactor Summary: [INFO] [INFO] ModuleD ................. SUCCESS [9.707s] [INFO] ModuleE ................. SUCCESS [0.625s] [INFO] ModuleF ................. SUCCESS [0.679s] [INFO] Project ................. SUCCESS [2.467s]

●  Restarts all the build from module D (-rf)

●  -rf,--resume-from <arg> : Resume reactor from specified project

●  Usecase : The build failed a 1st time in module D, you fixed it, and restart the build were it was to end it.

Page 96: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

RELEASE YOUR PROJECT Apache Maven

Page 97: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Release of a webapp in 2002 ●  Limited usage of eclipse

-  No WTP (Only some features in WSAD), -  No ability to produce WARs

Page 98: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Release of a webapp in 2002 ●  Many manual tasks

-  Modify settings files -  Package JARs -  Copy libraries (external and internal) in a « lib »

directory -  Package WAR (often with a zip command) -  Tag the code (CVS) -  Send the package on the integration server using FTP -  Deploy the package with AS console

Page 99: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Release of a webapp in 2002 ●  One problem : The are

always problems -  Error in config files -  Missing dependencies -  Missing file -  Last minute fix which created a bug -  And many other possibilies ..

●  How long did it take ? -  When everything is ok : 15

minutes -  When there’s a problem : ½

day or more

Page 100: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Maven Release Plugin ●  Automates the release process from tagging

sources to binaries delivery ●  Release plugin main goals:

-  Prepare : To update maven versions and information in POMs and tag the code

-  Perform : To deploy binaries in a maven repository ●  After that you can just automate the deployment on

the AS using cargo for example.

Page 101: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Maven Release Plugin

Page 102: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Configuration and Prerequisites ●  Project version (must be a SNAPSHOT version) ●  Dependencies and plugins versions mustn’t be

SNAPSHOTs

Page 103: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

SCM configuration

<scm> <connection> scm:svn:http://svn.exoplatform.org/projects/parent/trunk </connection> <developerConnection> scm:svn:http://svn.exoplatform.org/projects/parent/trunk </developerConnection> <url> http://fisheye.exoplatform.org/browse/projects/parent/trunk </url> </scm>

●  SCM binaries have to be in the PATH ●  SCM credentials have to already be stored or you have to

pass them in command line with : –Dusername=XXX –Dpassword=XXX

Page 104: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Distribution Management <project> <distributionManagement> <repository> <id>repository.exoplatform.org</id> <url>${exo.releases.repo.url}</url> </repository> . . . </distributionManagement> . . . <properties> <exo.releases.repo.url> http://repository.exoplatform.org/content/repositories/exo-releases </exo.releases.repo.url> . . . </properties> </project>

Page 105: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Repository credentials <settings>

<servers>

<server>

<!–- id must be the one used in distributionManagement -->

<id>repository.exoplatform.org</id>

<username>aheritier</username>

<password>{ABCDEFGHIJKLMNOPQRSTUVWYZ}</password>

</server>

</servers>

</settings>

Page 106: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Default Release Profile in Super POM <profile> <id>release-profile</id> <activation> <property> <name>performRelease</name> <value>true</value> </property> </activation> <build> <plugins> <!–- Configuration to generate sources and javadoc jars --> ... </plugins> </build> </profile>

Page 107: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Custom release profile <project>

...

<build>

<pluginManagement>

<plugins>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-release-plugin</artifactId>

<version>2.0-beta-9</version>

<configuration>

<useReleaseProfile>false</useReleaseProfile>

<arguments>-Pmyreleaseprofile</arguments>

</configuration>

</plugin>

</plugins>

</pluginManagement>

</build>

...

<profiles>

<profile>

<id>myreleaseprofile</id>

<build>

<!-– what you want to customize the behavior of the build when you do a release -->

</build>

</profile>

</profiles>

...

</project>

Page 108: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Troubleshooting Releases ●  Common errors during release:

-  Build with release profile was tested before and fails -  Local modifications -  Current version is not a SNAPSHOT -  SNAPSHOTs in dependencies and/or plugins -  Missing some configuration (scm, distribMgt, …) -  Tag already exists -  Unable to deploy project to the Repository -  Connection problems

Page 109: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

BACK TO THE FUTURE Apache Maven

Page 110: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

PRODUCT Apache Maven

Page 111: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Apache Maven 2.0.x ●  bugs fix ●  Last release : 2.0.11 ●  No other release of 2.0.x in the future

Page 112: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Apache Maven 2.x ●  Evolutions, new features ●  Several important new features in 2.1 like

-  Parallel downloads -  Encrypted passwords

●  Last release : 2.2.1

Page 113: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Apache Maven 3.x ●  Do not be afraid !!!!! ●  Not final before at least

one year ●  Full compatibility with

maven 2.x projects

Page 114: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Apache Maven 3.x ●  What’s new :

-  How POMs are constructed -  How the lifecycle is executed -  How the plugin manager executes -  How artifacts are resolved -  How it can be embedded -  How dependency injection is done

Page 115: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Apache Maven 3.x ●  What it will change for maven users ?

-  Any-source POM -  Versionless parent elements -  Mixins : a compositional form of Maven POM

configuration -  Better IDE integration -  Error & integrity reporting

●  Much improved error reporting where we will provide links to each identifiable problem we know of. There are currently 42 common things that can go wrong.

●  Don't allow builds where versions come from non-project sources like local settings and CLI parameters

●  Don't allow builds where versions come from profiles that have to be activated manually

Page 116: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Apache Maven 3.x ●  What it will change for maven developers ?

-  Lifecycle extension points -  Plugin extension points -  Incremental build support -  Queryable lifecycle -  Extensible reporting

Page 117: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Apache Maven 3.x ●  New tools

-  Tycho : OSGI, Eclipse -  Mvnsh

Page 118: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Maven Shell

Page 119: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

COMMUNITY Apache Maven

Page 120: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Users community

●  90 days statistics ●  Number of subscribers in blue ●  Number of messages per day in red ●  http://people.apache.org/~coar/mlists.html

●  1780 subscribers on users mailing list

Page 121: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

The web site

Page 122: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Dowloads

●  Per month downloads ●  http://people.apache.org/~vgritsenko/stats/projects/

maven.html

Page 123: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

The team ●  60 committers, ●  More than 30 active in 2009, ●  Several organizations like Sonatype, deliver

resources and professional support, ●  A community less isolated : more interactions with

Eclipse, Jetty,

Page 124: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Commit Statistics

Page 125: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

CONCLUSION Apache Maven

Page 126: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Conclusion ●  Today, Maven is widely adopted in corporate

environments, ●  It provides many services, ●  It has an important and really active community of

users and developers ●  Many resources to learn to use it and a

professional support are available ●  A product probably far from being perfect but on

rails for the future ●  Many things to do

-  We need you !

Page 127: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

QUESTIONS ? Apache Maven

Page 128: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Licence et copyrights ●  Photos and logos belong to their respective

authors/owners ●  Content under Creative Commons 3.0

-  Attribution — You must attribute the work in the manner specified by the author or licensor (but not in any way that suggests that they endorse you or your use of the work).

-  Noncommercial — You may not use this work for commercial purposes.

-  Share Alike — If you alter, transform, or build upon this work, you may distribute the resulting work only under the same or similar license to this one.

●  http://creativecommons.org/licenses/by-nc-sa/3.0/us/

Page 129: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

TO GO FURTHER … Apache Maven

Page 130: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

DOCUMENTATIONS Apache Maven

Page 131: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Some links ●  The main web site :

-  http://maven.apache.org ●  Project’s team wiki :

-  http://docs.codehaus.org/display/MAVEN ●  Project’s users wiki :

-  http://docs.codehaus.org/display/MAVENUSER

Page 132: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Books ●  Sonatype / O’Reilly :

-  The Definitive Guide -  http://www.sonatype.com/

books -  Free download -  Available in several

languages ●  Soon in French

Page 133: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Books ●  Exist Global

-  Better builds with Maven -  http://www.maestrodev.com/

better-build-maven -  Free download

Page 134: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Books ●  Nicolas De loof

Arnaud Héritier -  Published by Pearson -  Collection Référence -  Based on our own

experiences with Maven. From beginners to experts.

-  In French only -  Available on 20th November

Page 135: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

SUPPORT Apache Maven

Page 136: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Support ●  Mailing lists

-  http://maven.apache.org/mail-lists.html ●  IRC

-  irc.codehaus.org - #maven ●  Forums

-  http://www.developpez.net/ forum maven -  In French

●  Dedicated support -  Sonatype and some others companies

Page 137: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

ANNEXE Apache Maven

Page 138: Geneva Jug (30th March, 2010) - Maven

Licensed under a Creative Commons license

Setup a global mirror <settings> <mirrors> <mirror> <!--This sends everything else to /public --> <id>global-mirror</id> <mirrorOf>external:*</mirrorOf> <url>http://repository.exoplatform.org/content/groups/all</url> </mirror> </mirrors> <profiles> <profile> <id>mirror</id> <!--Enable snapshots for the built in central repo to direct --> <!--all requests to the repository manager via the mirror --> <repositories> <repository> <id>central</id> <url>http://central</url> <releases><enabled>true</enabled></releases> <snapshots><enabled>true</enabled></snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>central</id> <url>http://central</url> <releases><enabled>true</enabled></releases> <snapshots><enabled>true</enabled></snapshots> </pluginRepository> </pluginRepositories> </profile> </profiles> <activeProfiles> <!--make the profile active all the time --> <activeProfile>mirror</activeProfile> </activeProfiles> </settings>