Presentation is loading. Please wait.

Presentation is loading. Please wait.

Using Maven2. Free Maven Books Maven: The Definitive Guide (alpha)‏ www.sonatype.com/book Better Builds with Maven www.mergere.com.

Similar presentations


Presentation on theme: "Using Maven2. Free Maven Books Maven: The Definitive Guide (alpha)‏ www.sonatype.com/book Better Builds with Maven www.mergere.com."— Presentation transcript:

1 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="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 4.0.0 com.example my-app jar 1.0-SNAPSHOT my-app http://maven.apache.org junit 3.8.1 test

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("messages"); MessagePrinter mp = new MessagePrinter(); mp.printMessage(messages.getString("message1"), System.out); mp.printMessage("\n", 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... My Application http://localhost:8080/my-app... maven-jar-plugin com.example.Hello

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

13 Eclipse Integration

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 4.0.0 com.example my-app jar 1.0-SNAPSHOT...

22 Lifecycle Bindings

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... junit 3.8.1 test 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("messages"); MessagePrinter mp = new MessagePrinter(); Scanner scanner = new Scanner(System.in); do { String message = messages.getMessage("message1", null, Locale.getDefault()); mp.printMessage(message, System.out); mp.printMessage("\n", System.out); mp.printMessage("Keep playing? [Y/n]\n", System.out); } while (!"n".equals(scanner.nextLine())); }

27 Dependencies... org.springframework spring-context [2.0,) org.springframework spring-aop... Version ranges Use exclusions to trim unwanted dependencies

28 Transitive 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... maven-antrun-plugin generate-sources <!-- Place any ant task here. You can add anything you can add between and in a build.xml. --> run

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 4.0.0 com.example my-app 1.0-SNAPSHOT No source or target defined in POM, yet this works: $ mvn compile

33 Super POM... target/classes... src/main/java... src/main/resources... To fully resolve the POM: $ mvn help:effective-pom | less

34 POM Inheritance com.example org-pom 1 com.example my-app... com.example org-pom 1 <!-- configure JDK version, e.g: 1.5 standard reports, etc. -->

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

38 Archiva

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 com.example my-app... scm:svn:http://example.com/svn-read/my-app/trunk scm:svn:http://example.com/svn-dev/my-app/trunk http://example.com/view.cvs

43 SCM Integration, What For? Use SCM agnostic commands: $ mvn scm:checkin -Dmessage="to the cause" $ 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

47 Quick Tour

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

53 Questions?


Download ppt "Using Maven2. Free Maven Books Maven: The Definitive Guide (alpha)‏ www.sonatype.com/book Better Builds with Maven www.mergere.com."

Similar presentations


Ads by Google