Upload
arnaud-heritier
View
2.433
Download
0
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
Citation preview
Apache Maven – JUG Lausanne – April 8th, 2010
Arnaud Héritier eXo Platform
Software Factory Manager
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
Licensed under a Creative Commons license
CHOOSE YOUR MENU Apache 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
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
Licensed under a Creative Commons license
Good & Bad Practices ● K.I.S.S. ● Project Organization ● POM ● Development
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) ● Setup a global mirror
Licensed under a Creative Commons license
Back to the future ● Maven 2.x ● Maven 3.x ● Community
Licensed under a Creative Commons license
OVERVIEW Apache 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.
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 !!!
Licensed under a Creative Commons license
CONCEPTS Apache Maven
12
Licensed under a Creative Commons license
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, …) ● …
13
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>!
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
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>!
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
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
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
Licensed under a Creative Commons license
Without Maven With Maven
Dependencies
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
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
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!
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
Licensed under a Creative Commons license
Versions
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
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.
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
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
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
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
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
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
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
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
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 - …
Licensed under a Creative Commons license
MAVEN OR NOT MAVEN, THAT IS THE QUESTION !
Apache 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
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
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
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
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
Licensed under a Creative Commons license
We dream to deliver (Maven 3.x)
But today we have too often (Maven 2.x)
With Maven
Licensed under a Creative Commons license
ECOSYSTEM Apache 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
Licensed under a Creative Commons license
REPOSITORY MANAGERS Apache 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
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
Licensed under a Creative Commons license
Nexus at eXo for productivity
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
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
Licensed under a Creative Commons license
QUALITY MANAGEMENT Apache 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
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
Licensed under a Creative Commons license
Dependency Report
Licensed under a Creative Commons license
Sonar, a quality dashboard
Licensed under a Creative Commons license
Sonar, analyze your project
Licensed under a Creative Commons license
Sonar, Continuous Improvement ?
Licensed under a Creative Commons license
CONTINUOUS INTEGRATION Apache 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, …
Licensed under a Creative Commons license
Hudson, how the weather is ?
Licensed under a Creative Commons license
Hudson : build, test, check
Licensed under a Creative Commons license
IDE Apache 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)
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
Licensed under a Creative Commons license
Eclipse (m2eclipse)
Licensed under a Creative Commons license
Eclipse (m2eclipse)
Licensed under a Creative Commons license
Eclipse (m2eclipse)
Licensed under a Creative Commons license
Idea IntelliJ
Licensed under a Creative Commons license
Netbeans
Licensed under a Creative Commons license
GOOD & BAD PRACTICES Apache Maven
Licensed under a Creative Commons license
KISS Apache 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 ● …
Licensed under a Creative Commons license
PROJECT ORGANIZATION GOOD & BAD PRACTICES
Apache 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 ?
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 …
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 …
Licensed under a Creative Commons license
POM GOOD & BAD PRACTICES Apache 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
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.
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.
Licensed under a Creative Commons license
DEVELOPMENT GOOD & BAD PRACTICES
Apache 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
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)
Licensed under a Creative Commons license
USECASES Apache Maven
Licensed under a Creative Commons license
SECURE YOUR CREDENTIALS Apache 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
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>!
Licensed under a Creative Commons license
BUILD A PART OF YOUR PROJECT Apache 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
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
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
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, …
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
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.
Licensed under a Creative Commons license
RELEASE YOUR PROJECT Apache 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
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
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
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.
Licensed under a Creative Commons license
Maven Release Plugin
Licensed under a Creative Commons license
Configuration and Prerequisites ● Project version (must be a SNAPSHOT version) ● Dependencies and plugins versions mustn’t be
SNAPSHOTs
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
Licensed under a Creative Commons license
SCM configuration
<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>!
● 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
Licensed under a Creative Commons license
Distribution Management
<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>!
● Where you want to upload released binaries ● The url of a repository dedicated for your project/
corporate maven deliveries in your repository manager
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 ...
Licensed under a Creative Commons license
Repository credentials
<settings>! ...! <servers>! <server>! <id>repository.acme.com</id>! <username>aheritier</username>! <password>{ABCDEFGHIJKLMNOPQRSTUVWYZ}</password>! </server>! ...! </servers>! ...!</settings>!
This id is the one defined in distributionManagement entry of the project to release
● 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 …)
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>! ...! </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
● 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.
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</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 Don’t use the default profile
Our customized profile
Licensed under a Creative Commons license
SETUP A GLOBAL MIRROR Apache Maven
Licensed under a Creative Commons license
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
Licensed under a Creative Commons license
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> !
Send all requests to this url
Enable snapshots
make the profile active all the time
Use « central » id to override default maven configuration
Licensed under a Creative Commons license
BACK TO THE FUTURE Apache Maven
Licensed under a Creative Commons license
PRODUCT Apache 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
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 - Reactor command line options
● Last release : 2.2.1
Licensed under a Creative Commons license
Apache Maven 3.x ● Do not be afraid !!!!! ● Full compatibility with maven 2.x projects
- Or at least at 99,99999% ● Availability in 2010 (2nd half) ● Why Maven 3.X ?
- To build new foundations for the future - The major part of the code was reviewed / rewritten
● 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 ● …
Licensed under a Creative Commons license
Apache Maven 3.x - robustness ● 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
● Backward compatibility - Several thousands of integration tests
Licensed under a Creative Commons license
Apache Maven 3.x - performances ● Many optimizations ● New support of parallel builds of modules ● New incremental (partial) build
- To improve IDE integration
Licensed under a Creative Commons license
Apache Maven 3.x – new features ● Any-source POM
- If you don’t like XML, choose another DSL ● Versionless parent elements
- If you don’t use versions or release plugins to automatically update them
● Mixins - a compositional form of Maven POM configuration
● Global excludes
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 - Bye bye Plexus, welcome JSR 330 & Google Guice - Well defined and documented APIs
Licensed under a Creative Commons license
Apache Maven 3.x – New tools ● mvnsh
- A cross-platform shell dedicated to maven
● Tycho - Maven ready for OSGI and
Eclipse developments
Licensed under a Creative Commons license
In Apache Maven 3.0 ? ● A backward compatibility near to 100% for projects
and plugins ● A totally new implementation
- A greater robustness with a better reporting and more readable logs
- Performances improvements and new parallel builds - A better integration for others tools like IDE or
continuous integration servers ● No change in current POM format
Licensed under a Creative Commons license
COMMUNITY Apache Maven
Licensed under a Creative Commons license
Users Mailing List
● Blue : - Number of subscribers
● Red : - Number of messages per
day
● [email protected] - Traffic statistics cover a total
of 1697 days. - Current subscribers: 1861 - Current digest subscribers:
47 - Total posts (1697 days):
80633 - Mean posts per day: 47.52
● http://pulse.apache.org/
Licensed under a Creative Commons license
Apache Maven Web Site
Licensed under a Creative Commons license
Dowloads
● Per month downloads ● http://people.apache.org/~vgritsenko/stats/projects/
maven.html
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,
Licensed under a Creative Commons license
Commit Statistics
Licensed under a Creative Commons license
CONCLUSION Apache 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. Maven 3.0 is a new start. ● Many things to do
- We need you !
Licensed under a Creative Commons license
QUESTIONS ? Apache 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/
Licensed under a Creative Commons license
TO GO FURTHER … Apache Maven
Licensed under a Creative Commons license
DOCUMENTATIONS Apache 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
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
Licensed under a Creative Commons license
Books ● Sonatype / O’Reilly :
- The Definitive Guide - http://www.sonatype.com/
books - Free download - Available in several
languages
Licensed under a Creative Commons license
Books ● Exist Global
- Better builds with Maven - http://www.maestrodev.com/
better-build-maven - Free download
Licensed under a Creative Commons license
SUPPORT Apache 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 many others companies