SlideShare a Scribd company logo
Using Maven2
Free Maven Books Maven: The Definitive Guide (alpha)‏ www.sonatype.com/book Better Builds with Maven www.mergere.com
The Maven Site http://maven.apache.org/
What is Maven? Build lifecycle Dependency management tool Artifact repository Collection of plugins Project reporting tool Set of conventions Distilled experience
What Else is Maven? Succinct command line tool Designed for Java/Java EE/other Holder/publisher of project documentation Generator of project metrics Customisable: environment, lifecycle, etc Inheritable Declarative Encourager of modularity and reuse Integrated with SCM tools Integrated with IDEs Integrated with Ant System of repositories Project kick starter Release manager Deployer Enabler of portable build knowledge Encourager of best practice Community Not perfect
Quick Start Download Maven2, unzip, add bin directory to $PATH Configure proxy in ~/.m2/settings.xml if required $ mvn archetype:create  \ -DgroupId=com.example  \ -DartifactId=my-app
Directory Structure Convention Java sources: src/main/java Unit tests: src/test/java pom.xml
pom.xml – The Project Object Model <project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd&quot;> <modelVersion>4.0.0</modelVersion> <groupId> com.example </groupId> <artifactId> my-app </artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>my-app</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project>
Directory Structure Convention Added: My app sources Properties file: src/main/resources/ messages.poperties My unit test
Killer App package com.example; public class Hello { public static void main(String[] args){ ResourceBundle messages = ResourceBundle.getBundle(&quot;messages&quot;); MessagePrinter mp = new MessagePrinter(); mp.printMessage(messages.getString(&quot;message1&quot;), System.out); mp.printMessage(&quot;\n&quot;, System.out); } } public class MessagePrinter { public void printMessage(String message, OutputStream os){ PrintWriter pw = new PrintWriter(os); pw.print(message); pw.flush(); } }
My Application POM <project ...> ... <name> My Application </name> <url>http://localhost:8080/my-app</url> ... <build> <plugins> <plugin> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <mainClass> com.example.Hello </mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build> </project>
Eclipse Integration Maven2 plugin for Eclipse;  either  from project root execute: $ mvn eclipse:eclipse and import with Eclipse,  or  create the project in Eclipse and add the Maven2 project nature
Eclipse Integration
Ready for Take Off $ mvn package
stdout [INFO] Scanning for projects... [INFO] ---------------------------------------------------------------------------- [INFO] Building My Application [INFO]  task-segment: [package] [INFO] ---------------------------------------------------------------------------- [INFO] [resources:resources] [INFO] Using default encoding to copy filtered resources. [INFO] [compiler:compile] [INFO] Compiling 1 source file to /home/russell/Desktop/maven-presentation/example/my-app/target/classes [INFO] [resources:testResources] [INFO] Using default encoding to copy filtered resources. [INFO] [compiler:testCompile] [INFO] Compiling 1 source file to /home/russell/Desktop/maven-presentation/example/my-app/target/test-classes [INFO] [surefire:test] [INFO] Surefire report directory: /home/russell/Desktop/maven-presentation/example/my-app/target/surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.example.AppTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.022 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] [jar:jar] [INFO] Building jar: /home/russell/Desktop/maven-presentation/example/my-app/target/my-app-1.0-SNAPSHOT.jar [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESSFUL [INFO] ------------------------------------------------------------------------ [INFO] Total time: 3 seconds [INFO] Finished at: Wed Jul 04 11:11:55 NZST 2007 [INFO] Final Memory: 4M/11M [INFO] ------------------------------------------------------------------------
The (Almost) Finished Product Classes and test classes compiled Resources copied to classes directory Test reports created Jar file created $ java -jar my-app-1.0-SNAPSHOT.jar Hello World!
Plugins & Goals A plugin contains one or more goals (Goal a.k.a. Mojo; Maven + Pojo = Mojo   ?!@! )‏ A plugin is a Maven artifact A goal is uniquely referenced/invoked by: groupId:artifactId:version:goal e.g: org.apache.maven.plugins:maven-eclipse-plugin:eclipse defaults shorten this to: eclipse:eclipse
Anatomy of a Maven Command 1. Invoke a specific goal: $ mvn [options] plugin:goal [parameter]... e.g: $ mvn -e eclipse:eclipse -> Generate Eclipse configuration, print verbose error messages 2. Invoke goals bound to the lifecycle(s) up to and including a phase: $ mvn [options] phase... [parameter]... e.g: $ mvn clean package -Dmaven.test.skip=true ->  Clean target, build package, skip tests
Maven Lifecycles Three built-in lifecycles: default clean site You can create your own lifecycle, but only if you have really weird build requirements!
The Default Build Lifecycle
Project Packaging <project ...> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>my-app</artifactId> <packaging> jar </packaging> <version>1.0-SNAPSHOT</version> ... </project>
Lifecycle Bindings
Build Lifecycle $ mvn package
stdout [INFO] Scanning for projects... [INFO] ---------------------------------------------------------------------------- [INFO] Building My Application [INFO]  task-segment: [package] [INFO] ---------------------------------------------------------------------------- [INFO] [resources:resources] [INFO] Using default encoding to copy filtered resources. [INFO] [compiler:compile] [INFO] Compiling 1 source file to /home/russell/Desktop/maven-presentation/example/my-app/target/classes [INFO] [resources:testResources] [INFO] Using default encoding to copy filtered resources. [INFO] [compiler:testCompile] [INFO] Compiling 1 source file to /home/russell/Desktop/maven-presentation/example/my-app/target/test-classes [INFO] [surefire:test] [INFO] Surefire report directory: /home/russell/Desktop/maven-presentation/example/my-app/target/surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.example.AppTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.022 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] [jar:jar] [INFO] Building jar: /home/russell/Desktop/maven-presentation/example/my-app/target/my-app-1.0-SNAPSHOT.jar [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESSFUL [INFO] ------------------------------------------------------------------------ [INFO] Total time: 3 seconds [INFO] Finished at: Wed Jul 04 11:11:55 NZST 2007 [INFO] Final Memory: 4M/11M [INFO] ------------------------------------------------------------------------
Dependencies <project ...> ... <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project> Explicitly declared, including version Resolved by Maven, not required in project directory / source control repository Scoped: compile, provided, runtime, test SNAPSHOT dependencies updated Transitive Strictly acyclic (a DAG not a tree)‏
Killer App Reloaded public class Hello { public static void main(String[] args) { ReloadableResourceBundleMessageSource messages = new ReloadableResourceBundleMessageSource(); messages.setCacheSeconds(1); messages.setBasename(&quot;messages&quot;); MessagePrinter mp = new MessagePrinter(); Scanner scanner = new Scanner(System.in); do { String message = messages.getMessage(&quot;message1&quot;, null, Locale.getDefault()); mp.printMessage(message, System.out); mp.printMessage(&quot;\n&quot;, System.out); mp.printMessage(&quot;Keep playing? [Y/n]\n&quot;, System.out); } while (!&quot;n&quot;.equals(scanner.nextLine())); } }
Dependencies <project ...> ... <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version> [2.0,) </version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> </exclusion> ...   </project> Version ranges Use exclusions to trim unwanted dependencies
Transitive Dependencies
Reloadable Message Source Hello World! Keep playing? [Y/n] y Hello Again World! Keep playing? [Y/n] n Note for anyone trying this at home: there's a bit of classpath config required to get this working nicely. It's easiest to run it on the Eclipse console, and modify the target messages.properties
Configuring Plugins e.g. Ant <project...> ... <build> <plugins> <plugin> <artifactId>maven-antrun-plugin</artifactId> <executions> <execution> <phase>generate-sources</phase> <configuration> <tasks> <!-- Place any ant task here. You can add anything you can add between <target> and </target> in a build.xml. --> </tasks> </configuration> <goals> <goal>run</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
Standard Maven Plugins clean compiler deploy install resources site surefire verifier ear ejb jar rar war changelog changes checkstyle clover doap docck javadoc jxr pmd project-info-reports surefire-report ant antlr antrun archetype assembly dependency enforcer gpg help invoker one plugin release remote-resources repository scm source eclipse idea Codehaus: build-helper castor javacc jdepend native sql taglist Other: cargo jaxme jetty jalopy Listed at: http://maven.apache.org/plugins/
POM Inheritance <project> <modelVersion>4.0.0</modelVersion> <groupId> com.example </groupId> <artifactId> my-app </artifactId> <version>1.0-SNAPSHOT</version> </project> No source or target defined in POM, yet this works: $ mvn compile
Super POM <project> <build> ... <outputDirectory> target/classes </outputDirectory> ... <sourceDirectory> src/main/java </sourceDirectory> ... <resources> <resource> <directory> src/main/resources </directory> </resource> </resources> ... </build> </project> To fully resolve the POM: $ mvn help:effective-pom | less
POM Inheritance <project> <parent> <groupId>com.example</groupId> <artifactId>org-pom</artifactId> <version>1</version> </parent> <groupId>com.example</groupId> <artifactId>my-app</artifactId> ... </project> <project> <groupId>com.example</groupId> <artifactId>org-pom</artifactId> <version>1</version> <!-- configure JDK version, e.g: 1.5 standard reports, etc. --> </project>
Maven Repositories Repositories store artifacts: plugins project dependencies Central:  http://repo1.maven.org/maven2 (or mirror)‏ Local: ~/.m2/repository The first execution of a plugin, or requirement for a dependency pulls the artifact from central and caches it locally
Maven Repositories Problems: Reliant on network and external repository for dependencies and plugins Can't deploy to Central Maven repository for reuse as dependencies of other projects (though usually wouldn't want to)‏
Organisation Repository No longer reliant on network or external repository for dependencies and plugins Can deploy to organisation repository in order to share artifacts Multiple repository configurations possible Multiple repository tools available: Archiva, Proximity, Artifactory
Archiva
Install and Deploy $ mvn deploy
Install and Deploy $ mvn deploy
SCM Integration Fully implemented: Bazaar CVS Mercurial Perforce StarTeam Subversion CM Synergy Partially implemented: ClearCase File system Visual Source Safe
Configuring SCM <project> <groupId>com.example</groupId> <artifactId>my-app</artifactId> ... <scm> <connection> scm:svn:http://example.com/svn-read/my-app/trunk   </connection> <developerConnection> scm:svn:http://example.com/svn-dev/my-app/trunk </developerConnection> <url> http://example.com/view.cvs </url> </scm> </project>
SCM Integration, What For? Use SCM agnostic commands: $ mvn scm:checkin -Dmessage=&quot;to the cause&quot; $ mvn scm:update Project bootstrapping:  $ mvn scm:bootstrap Available for use by Maven tools, e.g: documented and linked in project website, published in Archiva summary Continuous Integration, SCM details located in project rather than CI tool Release management
Cutting a Release $ mvn release:prepare [-DdryRun=true] Checks SCM for modifications Checks for use of SNAPSHOT dependencies or plugins Runs $ mvn clean integration-test Requests release info: version numbers Creates new POMs: pom.xml for tag pom.xml for next version release-pom.xml Creates tag in SCM $ mvn release:perform Uses release-pom.xml, deploys project, generates site, etc.
Website / Reports (1)‏ Project website: Conventions for structuring documentation, supporting various formats: DocBook simple, FML, XDOC, APT, Twiki Directory structure conventions, supporting multiple types of documentation, e.g: public, user, developer, etc. Configurable, skinnable site Project info from POM: contact details: organisation, developers; SCM details, etc.
Website / Reports (2)‏ Metrics, checks, and project reports (on website): Javadoc Test results Code coverage (Cobertura)‏ Checkstyle, PMD, JDepend, Clirr Database documentation (Hibernate)‏ Dependency report TODO report (//TODO, FIXME, configurable)‏ Linked and line-numbered HTML sources Release notes and roadmap from issue tracker
Quick Tour
In Brief (1)‏ Java EE support: WAR, EAR packaging Rapid web app development Integration (in container) testing Deployment to environments Multi-module projects Enable / encourage reuse between projects Maven inter-module dependency eliminates cycles between modules Nicely supported in NetBeans Not nicely supported in Eclipse – nested projects
In Brief (2)‏ Continuous Integration: CruiseControl Continuum Reuses project information as defined in POM Profiles Build activity carried out under different conditions, e.g: personal requirements, dev / test / release, continuous integration Maven settings Help
Problems History: Maven 1, might have left a bad taste Steep learning curve Once you've got it, the knowledge is portable to other projects built with Maven Complex needs require complex configuration Alan Kay: Simple things should be simple. Complex things should be possible Verbose XML config Docs aren't great, but getting better Error messages often do not provide much (or any) detail (e.g. archetype problem)‏ Ensuring the project is buildable and testable in the IDE as well as with Maven can be complex Multi-module projects not supported by Eclipse (but they are in Netbeans)‏
Stuff to Look at Buildr – a build system configured in Ruby that reuses parts of Maven: repositories; directory structure conventions; Rake – a Ruby build tool
Still Interested? Get reading and enjoy the ride
Questions?

More Related Content

PPT
Gerência de Configuração com Maven
PPTX
PPT
Demystifying Maven
PDF
Java Builds with Maven and Ant
PPTX
Maven
PPTX
PPTX
Apache maven 2 overview
PPT
Maven 2 features
Gerência de Configuração com Maven
Demystifying Maven
Java Builds with Maven and Ant
Maven
Apache maven 2 overview
Maven 2 features

What's hot (20)

PPTX
Development Tools - Maven
PPTX
Introduction to Maven
PPT
Using Maven 2
PPTX
An Introduction to Maven
PDF
Note - Apache Maven Intro
PPTX
Maven 2 Introduction
PPSX
Maven Presentation - SureFire vs FailSafe
PPT
Maven Overview
PDF
Hands On with Maven
PPTX
An introduction to Maven
PDF
Maven tutorial
PPTX
Apache Maven
PPT
Maven Introduction
PPTX
Maven Basics - Explained
PDF
Maven 3 Overview
PPT
Selenium-Browser-Based-Automated-Testing-for-Grails-Apps
ODP
An Introduction to Maven Part 1
PPTX
Log management (elk) for spring boot application
PPTX
Maven ppt
PDF
Maven tutorial for beginners
Development Tools - Maven
Introduction to Maven
Using Maven 2
An Introduction to Maven
Note - Apache Maven Intro
Maven 2 Introduction
Maven Presentation - SureFire vs FailSafe
Maven Overview
Hands On with Maven
An introduction to Maven
Maven tutorial
Apache Maven
Maven Introduction
Maven Basics - Explained
Maven 3 Overview
Selenium-Browser-Based-Automated-Testing-for-Grails-Apps
An Introduction to Maven Part 1
Log management (elk) for spring boot application
Maven ppt
Maven tutorial for beginners
Ad

Similar to Using Maven2 (20)

PPTX
(Re)-Introduction to Maven
PDF
Intelligent Projects with Maven - DevFest Istanbul
PPT
Maven 2.0 - Improve your build patterns
PPTX
20091112 - Mars Jug - Apache Maven
PPTX
Apache Maven - eXo VN office presentation
PDF
BMO - Intelligent Projects with Maven
PPT
Maven, Eclipse And OSGi Working Together
PPTX
ODP
Maven in Java EE project
PDF
Introduction to maven, its configuration, lifecycle and relationship to JS world
PPTX
Maven
PPT
Maven basic concept
PDF
Apache maven, a software project management tool
PDF
Maven and j unit introduction
PPTX
Maven in mulesoft
PPT
PPTX
Build Tools & Maven
PPTX
Apache Maven basics
(Re)-Introduction to Maven
Intelligent Projects with Maven - DevFest Istanbul
Maven 2.0 - Improve your build patterns
20091112 - Mars Jug - Apache Maven
Apache Maven - eXo VN office presentation
BMO - Intelligent Projects with Maven
Maven, Eclipse And OSGi Working Together
Maven in Java EE project
Introduction to maven, its configuration, lifecycle and relationship to JS world
Maven
Maven basic concept
Apache maven, a software project management tool
Maven and j unit introduction
Maven in mulesoft
Build Tools & Maven
Apache Maven basics
Ad

More from elliando dias (20)

PDF
Clojurescript slides
PDF
Why you should be excited about ClojureScript
PDF
Functional Programming with Immutable Data Structures
PPT
Nomenclatura e peças de container
PDF
Geometria Projetiva
PDF
Polyglot and Poly-paradigm Programming for Better Agility
PDF
Javascript Libraries
PDF
How to Make an Eight Bit Computer and Save the World!
PDF
Ragel talk
PDF
A Practical Guide to Connecting Hardware to the Web
PDF
Introdução ao Arduino
PDF
Minicurso arduino
PDF
Incanter Data Sorcery
PDF
PDF
Fab.in.a.box - Fab Academy: Machine Design
PDF
The Digital Revolution: Machines that makes
PDF
Hadoop + Clojure
PDF
Hadoop - Simple. Scalable.
PDF
Hadoop and Hive Development at Facebook
PDF
Multi-core Parallelization in Clojure - a Case Study
Clojurescript slides
Why you should be excited about ClojureScript
Functional Programming with Immutable Data Structures
Nomenclatura e peças de container
Geometria Projetiva
Polyglot and Poly-paradigm Programming for Better Agility
Javascript Libraries
How to Make an Eight Bit Computer and Save the World!
Ragel talk
A Practical Guide to Connecting Hardware to the Web
Introdução ao Arduino
Minicurso arduino
Incanter Data Sorcery
Fab.in.a.box - Fab Academy: Machine Design
The Digital Revolution: Machines that makes
Hadoop + Clojure
Hadoop - Simple. Scalable.
Hadoop and Hive Development at Facebook
Multi-core Parallelization in Clojure - a Case Study

Recently uploaded (20)

PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
Review of recent advances in non-invasive hemoglobin estimation
PDF
Network Security Unit 5.pdf for BCA BBA.
PPTX
MYSQL Presentation for SQL database connectivity
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
Approach and Philosophy of On baking technology
PDF
Electronic commerce courselecture one. Pdf
PDF
Encapsulation_ Review paper, used for researhc scholars
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PDF
KodekX | Application Modernization Development
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PPTX
Cloud computing and distributed systems.
PDF
Spectral efficient network and resource selection model in 5G networks
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Diabetes mellitus diagnosis method based random forest with bat algorithm
Review of recent advances in non-invasive hemoglobin estimation
Network Security Unit 5.pdf for BCA BBA.
MYSQL Presentation for SQL database connectivity
Unlocking AI with Model Context Protocol (MCP)
Approach and Philosophy of On baking technology
Electronic commerce courselecture one. Pdf
Encapsulation_ Review paper, used for researhc scholars
Reach Out and Touch Someone: Haptics and Empathic Computing
Digital-Transformation-Roadmap-for-Companies.pptx
KodekX | Application Modernization Development
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
Per capita expenditure prediction using model stacking based on satellite ima...
The Rise and Fall of 3GPP – Time for a Sabbatical?
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
20250228 LYD VKU AI Blended-Learning.pptx
Cloud computing and distributed systems.
Spectral efficient network and resource selection model in 5G networks

Using Maven2

  • 2. Free Maven Books Maven: The Definitive Guide (alpha)‏ www.sonatype.com/book Better Builds with Maven www.mergere.com
  • 3. The Maven Site http://maven.apache.org/
  • 4. What is Maven? Build lifecycle Dependency management tool Artifact repository Collection of plugins Project reporting tool Set of conventions Distilled experience
  • 5. What Else is Maven? Succinct command line tool Designed for Java/Java EE/other Holder/publisher of project documentation Generator of project metrics Customisable: environment, lifecycle, etc Inheritable Declarative Encourager of modularity and reuse Integrated with SCM tools Integrated with IDEs Integrated with Ant System of repositories Project kick starter Release manager Deployer Enabler of portable build knowledge Encourager of best practice Community Not perfect
  • 6. Quick Start Download Maven2, unzip, add bin directory to $PATH Configure proxy in ~/.m2/settings.xml if required $ mvn archetype:create \ -DgroupId=com.example \ -DartifactId=my-app
  • 7. Directory Structure Convention Java sources: src/main/java Unit tests: src/test/java pom.xml
  • 8. pom.xml – The Project Object Model <project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd&quot;> <modelVersion>4.0.0</modelVersion> <groupId> com.example </groupId> <artifactId> my-app </artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>my-app</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project>
  • 9. Directory Structure Convention Added: My app sources Properties file: src/main/resources/ messages.poperties My unit test
  • 10. Killer App package com.example; public class Hello { public static void main(String[] args){ ResourceBundle messages = ResourceBundle.getBundle(&quot;messages&quot;); MessagePrinter mp = new MessagePrinter(); mp.printMessage(messages.getString(&quot;message1&quot;), System.out); mp.printMessage(&quot;\n&quot;, System.out); } } public class MessagePrinter { public void printMessage(String message, OutputStream os){ PrintWriter pw = new PrintWriter(os); pw.print(message); pw.flush(); } }
  • 11. My Application POM <project ...> ... <name> My Application </name> <url>http://localhost:8080/my-app</url> ... <build> <plugins> <plugin> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <mainClass> com.example.Hello </mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build> </project>
  • 12. Eclipse Integration Maven2 plugin for Eclipse; either from project root execute: $ mvn eclipse:eclipse and import with Eclipse, or create the project in Eclipse and add the Maven2 project nature
  • 14. Ready for Take Off $ mvn package
  • 15. stdout [INFO] Scanning for projects... [INFO] ---------------------------------------------------------------------------- [INFO] Building My Application [INFO] task-segment: [package] [INFO] ---------------------------------------------------------------------------- [INFO] [resources:resources] [INFO] Using default encoding to copy filtered resources. [INFO] [compiler:compile] [INFO] Compiling 1 source file to /home/russell/Desktop/maven-presentation/example/my-app/target/classes [INFO] [resources:testResources] [INFO] Using default encoding to copy filtered resources. [INFO] [compiler:testCompile] [INFO] Compiling 1 source file to /home/russell/Desktop/maven-presentation/example/my-app/target/test-classes [INFO] [surefire:test] [INFO] Surefire report directory: /home/russell/Desktop/maven-presentation/example/my-app/target/surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.example.AppTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.022 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] [jar:jar] [INFO] Building jar: /home/russell/Desktop/maven-presentation/example/my-app/target/my-app-1.0-SNAPSHOT.jar [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESSFUL [INFO] ------------------------------------------------------------------------ [INFO] Total time: 3 seconds [INFO] Finished at: Wed Jul 04 11:11:55 NZST 2007 [INFO] Final Memory: 4M/11M [INFO] ------------------------------------------------------------------------
  • 16. The (Almost) Finished Product Classes and test classes compiled Resources copied to classes directory Test reports created Jar file created $ java -jar my-app-1.0-SNAPSHOT.jar Hello World!
  • 17. Plugins & Goals A plugin contains one or more goals (Goal a.k.a. Mojo; Maven + Pojo = Mojo  ?!@! )‏ A plugin is a Maven artifact A goal is uniquely referenced/invoked by: groupId:artifactId:version:goal e.g: org.apache.maven.plugins:maven-eclipse-plugin:eclipse defaults shorten this to: eclipse:eclipse
  • 18. Anatomy of a Maven Command 1. Invoke a specific goal: $ mvn [options] plugin:goal [parameter]... e.g: $ mvn -e eclipse:eclipse -> Generate Eclipse configuration, print verbose error messages 2. Invoke goals bound to the lifecycle(s) up to and including a phase: $ mvn [options] phase... [parameter]... e.g: $ mvn clean package -Dmaven.test.skip=true -> Clean target, build package, skip tests
  • 19. Maven Lifecycles Three built-in lifecycles: default clean site You can create your own lifecycle, but only if you have really weird build requirements!
  • 20. The Default Build Lifecycle
  • 21. Project Packaging <project ...> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>my-app</artifactId> <packaging> jar </packaging> <version>1.0-SNAPSHOT</version> ... </project>
  • 23. Build Lifecycle $ mvn package
  • 24. stdout [INFO] Scanning for projects... [INFO] ---------------------------------------------------------------------------- [INFO] Building My Application [INFO] task-segment: [package] [INFO] ---------------------------------------------------------------------------- [INFO] [resources:resources] [INFO] Using default encoding to copy filtered resources. [INFO] [compiler:compile] [INFO] Compiling 1 source file to /home/russell/Desktop/maven-presentation/example/my-app/target/classes [INFO] [resources:testResources] [INFO] Using default encoding to copy filtered resources. [INFO] [compiler:testCompile] [INFO] Compiling 1 source file to /home/russell/Desktop/maven-presentation/example/my-app/target/test-classes [INFO] [surefire:test] [INFO] Surefire report directory: /home/russell/Desktop/maven-presentation/example/my-app/target/surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.example.AppTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.022 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] [jar:jar] [INFO] Building jar: /home/russell/Desktop/maven-presentation/example/my-app/target/my-app-1.0-SNAPSHOT.jar [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESSFUL [INFO] ------------------------------------------------------------------------ [INFO] Total time: 3 seconds [INFO] Finished at: Wed Jul 04 11:11:55 NZST 2007 [INFO] Final Memory: 4M/11M [INFO] ------------------------------------------------------------------------
  • 25. Dependencies <project ...> ... <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project> Explicitly declared, including version Resolved by Maven, not required in project directory / source control repository Scoped: compile, provided, runtime, test SNAPSHOT dependencies updated Transitive Strictly acyclic (a DAG not a tree)‏
  • 26. Killer App Reloaded public class Hello { public static void main(String[] args) { ReloadableResourceBundleMessageSource messages = new ReloadableResourceBundleMessageSource(); messages.setCacheSeconds(1); messages.setBasename(&quot;messages&quot;); MessagePrinter mp = new MessagePrinter(); Scanner scanner = new Scanner(System.in); do { String message = messages.getMessage(&quot;message1&quot;, null, Locale.getDefault()); mp.printMessage(message, System.out); mp.printMessage(&quot;\n&quot;, System.out); mp.printMessage(&quot;Keep playing? [Y/n]\n&quot;, System.out); } while (!&quot;n&quot;.equals(scanner.nextLine())); } }
  • 27. Dependencies <project ...> ... <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version> [2.0,) </version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> </exclusion> ... </project> Version ranges Use exclusions to trim unwanted dependencies
  • 29. Reloadable Message Source Hello World! Keep playing? [Y/n] y Hello Again World! Keep playing? [Y/n] n Note for anyone trying this at home: there's a bit of classpath config required to get this working nicely. It's easiest to run it on the Eclipse console, and modify the target messages.properties
  • 30. Configuring Plugins e.g. Ant <project...> ... <build> <plugins> <plugin> <artifactId>maven-antrun-plugin</artifactId> <executions> <execution> <phase>generate-sources</phase> <configuration> <tasks> <!-- Place any ant task here. You can add anything you can add between <target> and </target> in a build.xml. --> </tasks> </configuration> <goals> <goal>run</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
  • 31. Standard Maven Plugins clean compiler deploy install resources site surefire verifier ear ejb jar rar war changelog changes checkstyle clover doap docck javadoc jxr pmd project-info-reports surefire-report ant antlr antrun archetype assembly dependency enforcer gpg help invoker one plugin release remote-resources repository scm source eclipse idea Codehaus: build-helper castor javacc jdepend native sql taglist Other: cargo jaxme jetty jalopy Listed at: http://maven.apache.org/plugins/
  • 32. POM Inheritance <project> <modelVersion>4.0.0</modelVersion> <groupId> com.example </groupId> <artifactId> my-app </artifactId> <version>1.0-SNAPSHOT</version> </project> No source or target defined in POM, yet this works: $ mvn compile
  • 33. Super POM <project> <build> ... <outputDirectory> target/classes </outputDirectory> ... <sourceDirectory> src/main/java </sourceDirectory> ... <resources> <resource> <directory> src/main/resources </directory> </resource> </resources> ... </build> </project> To fully resolve the POM: $ mvn help:effective-pom | less
  • 34. POM Inheritance <project> <parent> <groupId>com.example</groupId> <artifactId>org-pom</artifactId> <version>1</version> </parent> <groupId>com.example</groupId> <artifactId>my-app</artifactId> ... </project> <project> <groupId>com.example</groupId> <artifactId>org-pom</artifactId> <version>1</version> <!-- configure JDK version, e.g: 1.5 standard reports, etc. --> </project>
  • 35. Maven Repositories Repositories store artifacts: plugins project dependencies Central: http://repo1.maven.org/maven2 (or mirror)‏ Local: ~/.m2/repository The first execution of a plugin, or requirement for a dependency pulls the artifact from central and caches it locally
  • 36. Maven Repositories Problems: Reliant on network and external repository for dependencies and plugins Can't deploy to Central Maven repository for reuse as dependencies of other projects (though usually wouldn't want to)‏
  • 37. Organisation Repository No longer reliant on network or external repository for dependencies and plugins Can deploy to organisation repository in order to share artifacts Multiple repository configurations possible Multiple repository tools available: Archiva, Proximity, Artifactory
  • 39. Install and Deploy $ mvn deploy
  • 40. Install and Deploy $ mvn deploy
  • 41. SCM Integration Fully implemented: Bazaar CVS Mercurial Perforce StarTeam Subversion CM Synergy Partially implemented: ClearCase File system Visual Source Safe
  • 42. Configuring SCM <project> <groupId>com.example</groupId> <artifactId>my-app</artifactId> ... <scm> <connection> scm:svn:http://example.com/svn-read/my-app/trunk </connection> <developerConnection> scm:svn:http://example.com/svn-dev/my-app/trunk </developerConnection> <url> http://example.com/view.cvs </url> </scm> </project>
  • 43. SCM Integration, What For? Use SCM agnostic commands: $ mvn scm:checkin -Dmessage=&quot;to the cause&quot; $ mvn scm:update Project bootstrapping: $ mvn scm:bootstrap Available for use by Maven tools, e.g: documented and linked in project website, published in Archiva summary Continuous Integration, SCM details located in project rather than CI tool Release management
  • 44. Cutting a Release $ mvn release:prepare [-DdryRun=true] Checks SCM for modifications Checks for use of SNAPSHOT dependencies or plugins Runs $ mvn clean integration-test Requests release info: version numbers Creates new POMs: pom.xml for tag pom.xml for next version release-pom.xml Creates tag in SCM $ mvn release:perform Uses release-pom.xml, deploys project, generates site, etc.
  • 45. Website / Reports (1)‏ Project website: Conventions for structuring documentation, supporting various formats: DocBook simple, FML, XDOC, APT, Twiki Directory structure conventions, supporting multiple types of documentation, e.g: public, user, developer, etc. Configurable, skinnable site Project info from POM: contact details: organisation, developers; SCM details, etc.
  • 46. Website / Reports (2)‏ Metrics, checks, and project reports (on website): Javadoc Test results Code coverage (Cobertura)‏ Checkstyle, PMD, JDepend, Clirr Database documentation (Hibernate)‏ Dependency report TODO report (//TODO, FIXME, configurable)‏ Linked and line-numbered HTML sources Release notes and roadmap from issue tracker
  • 48. In Brief (1)‏ Java EE support: WAR, EAR packaging Rapid web app development Integration (in container) testing Deployment to environments Multi-module projects Enable / encourage reuse between projects Maven inter-module dependency eliminates cycles between modules Nicely supported in NetBeans Not nicely supported in Eclipse – nested projects
  • 49. In Brief (2)‏ Continuous Integration: CruiseControl Continuum Reuses project information as defined in POM Profiles Build activity carried out under different conditions, e.g: personal requirements, dev / test / release, continuous integration Maven settings Help
  • 50. Problems History: Maven 1, might have left a bad taste Steep learning curve Once you've got it, the knowledge is portable to other projects built with Maven Complex needs require complex configuration Alan Kay: Simple things should be simple. Complex things should be possible Verbose XML config Docs aren't great, but getting better Error messages often do not provide much (or any) detail (e.g. archetype problem)‏ Ensuring the project is buildable and testable in the IDE as well as with Maven can be complex Multi-module projects not supported by Eclipse (but they are in Netbeans)‏
  • 51. Stuff to Look at Buildr – a build system configured in Ruby that reuses parts of Maven: repositories; directory structure conventions; Rake – a Ruby build tool
  • 52. Still Interested? Get reading and enjoy the ride