129
APACHE MAVEN Everything about

Apache Maven - eXo TN presentation

Embed Size (px)

DESCRIPTION

An overview of Apache Maven for eXo Platform Tunisia Teams

Citation preview

Page 1: Apache Maven - eXo TN presentation

APACHE MAVEN APACHE MAVEN APACHE MAVEN Everything about …

Page 2: Apache Maven - eXo TN presentation

2

Arnaud Héritier •  eXo - Software Factory Manager

»  In charge of tools and methods

•  Apache Maven : »  Committer since 2004 and member of the

Project Management Committee

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

•  Contact me : » http://aheritier.net » Twitter : @aheritier » Skype : aheritier

Page 3: Apache Maven - eXo TN presentation

OVERVIEW Apache Maven

Page 4: Apache Maven - eXo TN presentation

4

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.

•  Apache Maven is standards/conventions driven » How many of you are doing JEE and related

developments ?

Page 5: Apache Maven - eXo TN presentation

5

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 released in October 2010

» 3.0.4 – January 2012

Page 6: Apache Maven - eXo TN presentation

6

Choose your way of thinking

Conventions approach Scripting approach

Page 7: Apache Maven - eXo TN presentation

7

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 a well tested set of

public API L

Page 8: Apache Maven - eXo TN presentation

8

With scripts oriented builds

You can have (if you have good skills)

But often you have (moreover after years …)

Page 9: Apache Maven - eXo TN presentation

9

With Maven

We dream to deliver (Maven 3.x)

But yesterday we too often had (Maven 2.x)

Page 10: Apache Maven - eXo TN presentation

CHOOSE YOUR MENU Apache Maven

Page 11: Apache Maven - eXo TN presentation

11

Your menu

•  Concepts •  Apache Maven 3.x •  Good and bad practices •  Usecases

Page 12: Apache Maven - eXo TN presentation

CONCEPTS Apache Maven

Page 13: Apache Maven - eXo TN presentation

13

Conventions

•  1 project = 1 artifact (pom, jar, war, ear, …) •  Standardized

» project descriptor (POM) » build lifecycle » 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

•  target directory for generated stuffs (sources, classes, …) •  …

Page 14: Apache Maven - eXo TN presentation

14

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: Apache Maven - eXo TN presentation

15

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: Apache Maven - eXo TN presentation

16

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: Apache Maven - eXo TN presentation

17

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: Apache Maven - eXo TN presentation

18

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: Apache Maven - eXo TN presentation

19

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: Apache Maven - eXo TN presentation

20

Dependencies

Without Maven With Maven

Page 21: Apache Maven - eXo TN presentation

21

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: Apache Maven - eXo TN presentation

22

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: Apache Maven - eXo TN presentation

23

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: Apache Maven - eXo TN presentation

24

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: Apache Maven - eXo TN presentation

25

Versions

Page 26: Apache Maven - eXo TN presentation

26

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 L •  The release plugin will enforce it J

Page 27: Apache Maven - eXo TN presentation

27

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: Apache Maven - eXo TN presentation

28

Versions

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

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

Page 29: Apache Maven - eXo TN presentation

29

Profiles

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

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

mvn <phases or goals> ! -PprofileId1,-profileId2 ! -P!profileId3!

Page 30: Apache Maven - eXo TN presentation

30

Profiles

●  activeByDefault = If no other profile is activated

●  Activation through Maven settings <settings>!

...!

<activeProfiles>!

<activeProfile>profile-1</activeProfile>!

</activeProfiles>!

...!

</settings>!

Page 31: Apache Maven - eXo TN presentation

31

Profiles

•  Activation based on environment variables

<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>!

Page 32: Apache Maven - eXo TN presentation

32

Profiles

•  OS / Java settings <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>!

Page 33: Apache Maven - eXo TN presentation

33

Profiles

•  Activation on present or missing files <profiles>!

<profile>!

<activation>!

<file>!

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

</file>!

</activation>!

...!

</profile>!

</profiles>!

Page 34: Apache Maven - eXo TN presentation

34

Build Lifecycle And Plugins

•  Plugin based architecture for a great extensibility

•  Standardized lifecycle to build all types of archetypes

Page 35: Apache Maven - eXo TN presentation

35

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: Apache Maven - eXo TN presentation

36

Build Lifecycle And Plugins

•  Many plugins » Packaging » Reporting » IDE integration » Miscellaneous tools integration

•  Many locations » maven.apache.org » mojo.codehaus.org » code.google.com » …

Take care while selecting them !!!

Page 37: Apache Maven - eXo TN presentation

MAVEN 3.X Apache Maven

Page 38: Apache Maven - eXo TN presentation

38

BACKWARD COMPATIBILITY Apache Maven 3.x

Page 39: Apache Maven - eXo TN presentation

39

Backward compatibility - Criticisms

•  Migration from Maven 1 to Maven 2 was impossible. Everything had to be re-done.

•  Updates between 2.x versions and also between 2.0.x weren’t often without side effects.

Page 40: Apache Maven - eXo TN presentation

40

Backward compatibility

•  Near to 700 integration tests •  Tested for several months on a large set of

OSS projects •  7 alphas + 3 betas versions •  A bug fix release every 6 weeks •  It’s a revolution under the hood but an

evolution for end users

Page 41: Apache Maven - eXo TN presentation

41

Maven 3.0.x ITs

674

Page 42: Apache Maven - eXo TN presentation

42

PERFORMANCES Apache Maven 3.x

Page 43: Apache Maven - eXo TN presentation

43

Performances - Criticisms

•  Maven is slow •  It spends its time to download the world •  Whereas everybody has multicore CPUs, it

doesn’t allow to process modules builds in parallel

Page 44: Apache Maven - eXo TN presentation

44

Performances

•  A set of benchmark tools was developed to measure Maven performances (IO, CPU, Memory, Network …)

•  Startup and execution times are reduced » Java 5 optimizations » Code cleanup and improvements

•  Reduced Memory footprint •  Artifacts Resolution Caching

» .lastUpdated files in your local repo » Enforce checks with –U option

Page 45: Apache Maven - eXo TN presentation

45

Performances – Parallel builds

•  Parallel builds » An execution plan is predefined at startup to

define which modules could be built in // » Requires to have up to date plugins to avoid dead

locks and some others issues » Launch a build with 2 threads

•  mvn –T 2 install

» Launch a build with 2 threads per CPU core •  mvn –T 2C install

Page 46: Apache Maven - eXo TN presentation

46

Performances – mvnsh

•  Performances optimizations » Intelligent cache system (artifacts resolution,

project descriptors …) » No need to restart a JVM for each build

•  Cross platform « unix like » shell » Alias, environment settings … » Color highlighting

Page 47: Apache Maven - eXo TN presentation

47

Performances – mvnsh

•  All in one » Includes Maven 3.x » Allows to have color highlighting with “standard”

Maven 3.x •  Developed and freely distributed by Sonatype

Page 48: Apache Maven - eXo TN presentation

48

Performances – mvnsh

Page 49: Apache Maven - eXo TN presentation

49

EXTENSIBILITY Apache Maven 3.x

Page 50: Apache Maven - eXo TN presentation

50

Extensibility - Criticisms

•  It is difficult and time consuming to extend maven (write plugins) » Many unknown technologies like Plexus for IOC

•  It is difficult/impossible to reuse maven plugins » Its impossible to extend plugins/mojo and

lifecycles

Page 51: Apache Maven - eXo TN presentation

51

Extensibility

•  New APIs to improve abstraction of underneath implementation » Aether : to manage artifacts and repositories

•  Plugin classloader partitioning •  Embeddable •  IOC replaced by Guice

» For now (3.0) a wrapper is hiding the change » You don’t yet use Guice directly (from plugins for

example)

Page 52: Apache Maven - eXo TN presentation

52

ROBUSTNESS Apache Maven 3.x

Page 53: Apache Maven - eXo TN presentation

53

Robustness - Criticisms

•  Builds aren’t predictable •  Errors are difficult to diagnose

Page 54: Apache Maven - eXo TN presentation

54

Robustness - Validations

•  Many more validations in POMs (warnings or errors) » Missing plugins versions » Duplicated dependencies in a POM » Incoherent inheritance (wrong relative path or

parent not in the upper directory) •  Improved error messages with links to wiki

pages for more detailed information

Page 55: Apache Maven - eXo TN presentation

55

Robustness – Artifacts management

•  Parent POMs prefer to resolve from repositories » Version less parent will be available in a future

maven 3.x release by using the relativePath element

•  Profiles usage consolidation » No more profiles.xml (incompatible with future

polyglot feature)

Page 56: Apache Maven - eXo TN presentation

56

Robustness – Artifacts management

•  No more support for legacy repository layout for Maven 1.0

•  SNAPSHOTs are always deployed with timestamps

Page 57: Apache Maven - eXo TN presentation

57

Robustness – Plugins management

•  Plugin version is by default RELEASE and no more SNAPSHOT » Affects command-line invocation

•  Plugins cannot use versions LATEST or RELEASE » Affects command-line invocation and POM

•  Plugins are resolved only from <pluginRepository> entries

Page 58: Apache Maven - eXo TN presentation

58

Robustness – Site plugin

•  Site plugin is now completely extracted from Maven core » It has its own lifecycle » reporting section in POM becomes useless

(moved in plugin configuration)

Page 59: Apache Maven - eXo TN presentation

59

POM Apache Maven 3.x

Page 60: Apache Maven - eXo TN presentation

60

Criticisms

•  XML, we don’t like it •  POM is too verbose •  POM v4 didn’t evolve last 5 years

» When will you add new common attributes to ease plugins configuration (encoding …)

» New feature like global exclusions

Page 61: Apache Maven - eXo TN presentation

61

POM

•  No change in POM syntax for Maven 3.0 •  Changes will occur in 3.x versions

» New model with a new version » Only new things » Generation / deployment of 4.0.0 current POM to

keep backward compatibility with old maven versions

•  Mixins to allow to import POM fragments

Page 62: Apache Maven - eXo TN presentation

62

POM - Polyglot

•  Developed and freely distributed by Sonatype •  Extended version of Maven 3.0 using its new

embedding and extensibility capabilities •  Allow translation (read/write) from/to various

syntaxes » Yaml » Scala » Groovy

•  Allow macros and freeform scripting

Page 63: Apache Maven - eXo TN presentation

GOOD & BAD PRACTICES Apache Maven

Page 64: Apache Maven - eXo TN presentation

64

KISS Apache Maven

Page 65: Apache Maven - eXo TN presentation

65

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 66: Apache Maven - eXo TN presentation

66

PROJECT ORGANIZATION GOOD & BAD PRACTICES Apache Maven

Page 67: Apache Maven - eXo TN presentation

67

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 68: Apache Maven - eXo TN presentation

68

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 69: Apache Maven - eXo TN presentation

69

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 70: Apache Maven - eXo TN presentation

70

POM GOOD & BAD PRACTICES Apache Maven

Page 71: Apache Maven - eXo TN presentation

71

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 72: Apache Maven - eXo TN presentation

72

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 73: Apache Maven - eXo TN presentation

73

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 74: Apache Maven - eXo TN presentation

74

DEVELOPMENT GOOD & BAD PRACTICES Apache Maven

Page 75: Apache Maven - eXo TN presentation

75

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 76: Apache Maven - eXo TN presentation

76

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 77: Apache Maven - eXo TN presentation

USECASES Apache Maven

Page 78: Apache Maven - eXo TN presentation

78

SECURE YOUR CREDENTIALS Apache Maven

Page 79: Apache Maven - eXo TN presentation

79

Secure your credentials

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

l  Generate a private key

<settingssecurity>!

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

</settingssecurity>!

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

Page 80: Apache Maven - eXo TN presentation

80

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 81: Apache Maven - eXo TN presentation

81

BUILD A PART OF YOUR PROJECT Apache Maven

Page 82: Apache Maven - eXo TN presentation

82

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 83: Apache Maven - eXo TN presentation

83

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]!

l  Builds everything from A to F

- arnaud@mbp-arnaud:~$ mvn installarnaud@mbp-arnaud:~$ mvn install[INFO] ------------------------------------------------[INFO] Reactor Summary:[INFO][INFO] Project ....................... SUCCESS [INFO][INFO] Project ....................... SUCCESS [INFO]

[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]

l Builds everything from A to F

Page 84: Apache Maven - eXo TN presentation

84

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]!

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

specified reactor projects instead of all projects

- arnaud@mbp-arnaud:~$ mvn install moduleE,moduleBarnaud@mbp-arnaud:~$ mvn install moduleE,moduleBarnaud@mbp-arnaud:~$ mvn install

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

l Builds only modules B and E l Following dependencies order l -pl --project-list:

specified reactor projects instead -pl --project-list: specified reactor projects instead -pl --project-list: of all projectsspecified reactor projects instead of all projectsspecified reactor projects instead

Page 85: Apache Maven - eXo TN presentation

85

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]!

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

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

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

- arnaud@mbp-arnaud:~$ mvn install [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]

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

dependencies l -am --also-make:

is specified, also make projects that the list depends on is specified, also make projects that the list depends on is specified, also make projects

l Usecase required for a war, ear,

Page 86: Apache Maven - eXo TN presentation

86

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]!

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

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

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

- arnaud@mbp-arnaud:~$ mvn install [INFO] ------------------------------------------[INFO] Reactor Summary:[INFO][INFO] ModuleD ................. SUCCESS [4.881s][INFO] ModuleE ................. SUCCESS [0.478s][INFO] ModuleF ................. SUCCESS [0.427s]

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

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

projects on the list make projects that depend on projects on the list make projects that depend on

l Usecase in a module didn’t break others which are using it

Page 87: Apache Maven - eXo TN presentation

87

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]!

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

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

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

- arnaud@mbp-arnaud:~$ mvn install [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][INFO] ModuleF ................. SUCCESS [0.679s] [INFO] Project ................. SUCCESS [2.467s][INFO] ModuleF ................. SUCCESS [0.679s]

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

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

l Usecase time in module D, you fixed it, and restart the build were it was time in module D, you fixed it, and restart the build were it was time in module D, you fixed it,

to end it.

Page 88: Apache Maven - eXo TN presentation

88

RELEASE YOUR PROJECT Apache Maven

Page 89: Apache Maven - eXo TN presentation

89

Release of a webapp in 2002

•  Limited usage of eclipse » No WTP (Only some features in WSAD), » No ability to produce WARs

Page 90: Apache Maven - eXo TN presentation

90

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 91: Apache Maven - eXo TN presentation

91

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 92: Apache Maven - eXo TN presentation

92

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 93: Apache Maven - eXo TN presentation

93

Maven Release Plugin

Page 94: Apache Maven - eXo TN presentation

94

Configuration and Prerequisites

•  Project version (must be a SNAPSHOT version)

•  Dependencies and plugins versions mustn’t be SNAPSHOTs

Page 95: Apache Maven - eXo TN presentation

95

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 96: Apache Maven - eXo TN presentation

96

SCM configuration

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

<scm>! <connection>scm:svn:http://svn.acme.com/myproject/trunk</connection>! <developerConnection>scm:svn:https://svn.acme.com/myproject/trunk</developerConnection>! <url>http://fisheye.acme.com/browse/myproject/trunk</url>!</scm>!

Page 97: Apache Maven - eXo TN presentation

97

Distribution Management

•  Where you want to upload released binaries » The url of a repository dedicated for your project/

corporate maven deliveries in your repository manager

<project>! <distributionManagement>! <repository>! <id>repository.acme.com</id>! <url>${acme.releases.repo.url}</url>! </repository>! . . .! </distributionManagement>! . . . ! <properties>! <acme.releases.repo.url>http://repo.acme.com/acme-releases</acme.releases.repo.url>! . . .! </properties>!</project>!

This id will be used in user’s maven settings (~/.m2/settings.xml)

Often useful to have a property to test the release process on a fake repository, to validate a repo manager ...

Page 98: Apache Maven - eXo TN presentation

98

Repository credentials

•  One server entry is required per different repository id in distribution management of projects

•  In a corporate environment, use a unique id for all repositories hosted on repository managers using same credentials (corporate LDAP …)

<settings>! ...! <servers>! <server>! <id>repository.acme.com</id>! <username>aheritier</username>! <password>{ABCDEFGHIJKLMNOPQRSTUVWYZ}</password>! </server>! ...! </servers>! ...!</settings>!

<password>{ABCDEFGHIJKLMNOPQRSTUVWYZ}</password>This id is the one defined in distributionManagement entry of the project to release

Page 99: Apache Maven - eXo TN presentation

99

Default Release Profile in Super POM

•  This profile is used when you generate binaries of the release with “mvn release:perform”

•  By default, generates sources and javadocs jars for each module.

<profile>! <id>release-profile</id>! <activation>! <property>! <name>performRelease</name>! <value>true</value>! </property>! </activation>! <build>! <plugins>! ...! </plugins>! </build>!</profile>!

Configuration to generate sources and javadoc jars with basic setting

This activation could be used in profiles you want to activate in the release process

Page 100: Apache Maven - eXo TN presentation

100

Custom release profile

<project>! ...! <build>! <pluginManagement>! <plugins>! <plugin>! <groupId>org.apache.maven.plugins</groupId>! <artifactId>maven-release-plugin</artifactId>! <version>2.0</version>! <configuration>! <useReleaseProfile>false</useReleaseProfile>! <releaseProfiles>myreleaseprofile</

releaseProfiles>! </configuration>! </plugin>! </plugins>! </pluginManagement>! </build>! ...! <profiles>! <profile>! <id>myreleaseprofile</id>! <build>! ...! </build>! </profile>! </profiles>! ...!</project>!

Customize the behavior of the build for a release Take care to test is before the release !!

Use our customized profile Use our customizedDon’t use the default profile

Our customized profile

Page 101: Apache Maven - eXo TN presentation

101

SETUP A GLOBAL MIRROR Apache Maven

Page 102: Apache Maven - eXo TN presentation

102

Why should we setup a global mirror ?

•  To simplify users and projects settings •  To control where binaries are coming from

» To not rely on project’s repositories » To use only the corporate repository manager

•  To improve build performances » By reducing the number of requests to find a

missing artefact

Page 103: Apache Maven - eXo TN presentation

103

How should we setup a global mirror ?

<setting> <mirrors> <mirror> <id>global-mirror</id> <mirrorOf>external:*</mirrorOf> <url>http://repo.acme.com/public</url> </mirror> </mirrors> <profiles> <profile> <id>mirror</id> <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> <activeProfile>mirror</activeProfile> </activeProfiles></settings> !

<url>http://repo.acme.com/public</url> Send all requests to this url

Enable snapshots

make the profile active all the time

<releases><enabled>true</enabled></releases> <snapshots><enabled>true</enabled></snapshots>

Enable snapshots

Use « central » id to override default maven configuration

Page 104: Apache Maven - eXo TN presentation

TO GO FURTHER … Apache Maven

Page 105: Apache Maven - eXo TN presentation

105

IDE Apache Maven

Page 106: Apache Maven - eXo TN presentation

106

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 107: Apache Maven - eXo TN presentation

107

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 108: Apache Maven - eXo TN presentation

108

Eclipse (m2eclipse)

Page 109: Apache Maven - eXo TN presentation

109

Eclipse (m2eclipse)

Page 110: Apache Maven - eXo TN presentation

110

Eclipse (m2eclipse)

Page 111: Apache Maven - eXo TN presentation

111

Idea IntelliJ

Page 112: Apache Maven - eXo TN presentation

112

Netbeans

Page 113: Apache Maven - eXo TN presentation

113

COMMUNITY Apache Maven

Page 114: Apache Maven - eXo TN presentation

114

Users Mailing List

•  Blue : » Number of subscribers

•  Red : » Number of messages

per day

•  [email protected] » Traffic statistics cover a

total of 2025 days. » Current subscribers: 1936 » Current digest

subscribers: 48 » Total posts (2025 days):

89687 » Mean posts per day:

44.29 •  http://pulse.apache.org/

Page 115: Apache Maven - eXo TN presentation

115

Apache Maven Web Site

Page 116: Apache Maven - eXo TN presentation

116

Dowloads

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

projects/maven.html

Page 117: Apache Maven - eXo TN presentation

117

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 118: Apache Maven - eXo TN presentation

118

Commit Statistics

•  In light blue the number of active commiters

Page 119: Apache Maven - eXo TN presentation

119

DOCUMENTATIONS Apache Maven

Page 120: Apache Maven - eXo TN presentation

120

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 121: Apache Maven - eXo TN presentation

121

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

Page 122: Apache Maven - eXo TN presentation

122

Books

•  Sonatype / O’Reilly : » The Definitive Guide » http://

www.sonatype.com/books

» Free download » Available in several

languages

Page 123: Apache Maven - eXo TN presentation

123

Books

•  Apache Maven 2 Effective Implementation » Brett Porter, Maria

Odea Ching » https://

www.packtpub.com/apache-maven-2-effective-implementation/book

Page 124: Apache Maven - eXo TN presentation

124

Books

•  Exist Global » Better builds with

Maven » http://

www.maestrodev.com/better-build-maven

» Free download

Page 125: Apache Maven - eXo TN presentation

125

SUPPORT Apache Maven

Page 126: Apache Maven - eXo TN presentation

126

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 many others companies

Page 127: Apache Maven - eXo TN presentation

127

QUESTIONS ? Apache Maven

Page 128: Apache Maven - eXo TN presentation

128

Licence et copyrights

•  Photos and logos belong to their respective authors/owners

•  Various ideas are coming from the excellent presentation done by Matthew McCullough : » http://www.slideshare.net/matthewmccullough/

maven-30-at-oredev

Page 129: Apache Maven - eXo TN presentation

129

Licence et copyrights

•  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/