Hands On with Maven


Published on

Hands On with Maven -- a gentle introduction to Maven

Published in: Technology
1 Comment
No Downloads
Total views
On SlideShare
From Embeds
Number of Embeds
Embeds 0
No embeds

No notes for slide

Hands On with Maven

  1. 1. Hands On WithMavenSid Anand (LinkedIn)July 19, 2012
  2. 2. OverviewMaven is a build system providing A standard directory structure A standard build lifecycle The ability to override default behaviors via plug-ins Dependency management
  3. 3. The Maven Directory Structure
  4. 4. The Maven Directory Structure• A standard directory structure means that the build tool and the user agree on where different types of files can be found.• These conventions make coming up to speed on new projects much easier • Java Source Tree goes under /src/main/java • Property files goes under /src/main/resources • Web App files go under /src/main/webapp • /src/main/webapp/WEB-INF • /src/main/webapp/WEB-INF/web.xml • /src/main/webapp/*.jsp • /src/main/webapp/*.html
  5. 5. The Maven Directory Structure Path Description/src/main/java root of source tree (e.g. com/linkedin/...)/src/main/resources Place configuration & property files here/src/main/scripts Place scripts here/src/main/webapp Place web resources here (e.g. .jsp, .html) root of test source tree (e.g. com//src/test/java linkedin/test/...) Place configuration & property files/src/test/resources needed for tests Generated during build. Contains all build/target/ output
  6. 6. The Default Maven Life Cycle
  7. 7. The Default Maven Life Cycle• A default Maven Life Cycle means that you do not need to manually specify build- steps and chain them together in each project: • target = “package” dependsOn = “unit-test” • target = “unit-test” dependsOn = “compile” • target = “compile” dependsOn = “validate”• If you have worked with other build-tools (e.g. Make, Scala Build Tool, Ant, etc...), you will find that you are copying build-specs and specifying this boiler-plate logic often• Maven specifies a set of standard build steps and also automatically chains them together• This is part of the Maven framework and is not the responsibility of the user to define
  8. 8. The Default Maven Life Cycle Build Phase DescriptionValidate Validate things like the pom.xml files Compile sources after resolving andCompile downloading dependenciesTest Run Unit TestsPackage Create JAR or WARIntegration-test Run integration tests against the packageVerify Does the package meet quality criteria?Install Install in local repository• Calling “mvn <build phase>” will call all steps before it in order • e.g. calling “mvn install” will call validate, then compile, then test, then .....
  9. 9. Understanding the POM.xml
  10. 10. Understanding the POM.xmlThe pom.xml file is Maven’s build spec file (e.g. build.xml in Ant)
  11. 11. Understanding the POM.xml <project> <modelVersion>4.0.0</modelVersion> <!-- The Basics --> <groupId>...</groupId> <artifactId>...</artifactId> <version>...</version> <packaging>...</packaging> <dependencies>...</dependencies> <parent>...</parent> <dependencyManagement>...</dependencyManagement> <modules>...</modules> <properties>...</properties> <!-- Build Settings --> <build>...</build> <reporting>...</reporting> <!-- More Project Information --> <name>...</name> <description>...</description> <url>...</url> <inceptionYear>...</inceptionYear> <licenses>...</licenses> <organization>...</organization> <developers>...</developers> <contributors>...</contributors> <!-- Environment Settings --> <issueManagement>...</issueManagement> <ciManagement>...</ciManagement> <mailingLists>...</mailingLists> <scm>...</scm> <prerequisites>...</prerequisites> <repositories>...</repositories> <pluginRepositories>...</pluginRepositories> <distributionManagement>...</distributionManagement> <profiles>...</profiles></project>
  12. 12. Understanding the POM.xml<project> <modelVersion>4.0.0</modelVersion> <!-- The Basics --> <groupId>...</groupId> <artifactId>...</artifactId> <version>...</version> <packaging>...</packaging> <dependencies>...</dependencies> <parent>...</parent> <dependencyManagement>...</dependencyManagement> <modules>...</modules> <properties>...</properties> <!-- Build Settings --> The elements you will likely use <build>...</build> <reporting>...</reporting> <!-- More Project Information --> <name>...</name> <description>...</description> <url>...</url> <inceptionYear>...</inceptionYear> <licenses>...</licenses> <organization>...</organization> <developers>...</developers> <contributors>...</contributors> <!-- Environment Settings --> <issueManagement>...</issueManagement> <ciManagement>...</ciManagement> <mailingLists>...</mailingLists> <scm>...</scm> <prerequisites>...</prerequisites> <repositories>...</repositories> <pluginRepositories>...</pluginRepositories> <distributionManagement>...</distributionManagement> <profiles>...</profiles></project>
  13. 13. The Basics (POM)
  14. 14. Understanding the POM.xmlThe <groupId, artifactId, version> tuple forms a <project>unique address for a project (and its artifact) <modelVersion>4.0.0</modelVersion> •It is aptly known as a Maven coordinate <!-- The Basics -->packaging defaults to jar. Other options include pom <groupId>...</groupId>and war <artifactId>...</artifactId> <version>...</version>dependencies refers to a set of dependency <packaging>...</packaging>elements, each of which define a jar that this projects <dependencies>...</dependencies>depends on. <parent>...</parent> <modules>...</modules> <properties>...</properties>For example, if this project required Log4J, you wouldspecify a dependency element containing a Maven ......coordinate as shown below: </project><dependencies> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency></dependencies>
  15. 15. Understanding the POM.xmlTo figure out the co-ordinates for a jar when faced with a <project>ClassNoDefFound exception: <modelVersion>4.0.0</modelVersion><dependencies> <!-- The Basics --> <dependency> <groupId>...</groupId> <groupId>log4j</groupId> <artifactId>...</artifactId> <artifactId>log4j</artifactId> <version>...</version> <version>1.2.17</version> <packaging>...</packaging> </dependency> <dependencies>...</dependencies></dependencies> <parent>...</parent> <modules>...</modules> <properties>...</properties>1. Try searching on Jarvana ( http://jarvana.com/ ......jarvana/ ). This will give you the names of jars </project>containing the Class in question2. If you know the JAR name, search on Maven Centralfor all versions of the JAR. Pick the version you like.Both Maven Central and Jarvana provide Mavencoordinates.
  16. 16. Understanding the POM.xmlThe parent and modules elements are needed for <project>parent-child projects. <modelVersion>4.0.0</modelVersion> <!-- The Basics -->To illustrate, imagine a typical search-indexing project <groupId>...</groupId>called Foo. <artifactId>...</artifactId> <version>...</version>In our Foo project, imagine that we have 3 build artifacts: <packaging>...</packaging> <dependencies>...</dependencies>1. An indexer.jar for Indexing code <parent>...</parent> <modules>...</modules>2. A search.war for Lucene-based servlet code <properties>...</properties>3. A ui.war for UI-specific code ...... </project>One way to structure the code is to create 3 Maven modules(ui, indexer, and search) under a common parent (Foo)
  17. 17. Understanding the POM.xml Hence, we will have a directory structure as shown below: a Foo directory containing 3 sub-directories and 1 parent pom.xml: • a search sub-directory • this follows the standard Maven Directory structure • it contains a pom.xml for the search module • an indexer sub-directory • this follows the standard Maven Directory structure • it contains a pom.xml for the indexer module • a ui subdirectory • this follows the standard Maven Directory structure • it contains a pom.xml for the ui module Foo • a parent pom.xml file searchsearch pom.xml indexerindexer pom.xml ui ui pom.xmlpom.xml
  18. 18. Understanding the POM.xml <project><project> <modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion> <!-- The Basics --> <!-- The Basics --> <groupId>com.linkedin</groupId> <artifactId>Foo-search</artifactId> <groupId>com.linkedin</groupId> <version>1.0</version> <artifactId>Foo</artifactId> <packaging>war</packaging> <version>1.0</version> <parent>Foo</parent> <packaging>pom</packaging> ...... <modules> </project> <module>ui</module> <project> <module>search</module> <modelVersion>4.0.0</modelVersion> <module>indexer</module> <!-- The Basics --> </modules> <groupId>com.linkedin</groupId>...... <artifactId>Foo-indexer</artifactId> <version>1.0</version></project> <packaging>jar</packaging> <parent>Foo</parent> ...... </project> search <project> search <modelVersion>4.0.0</modelVersion> pom.xml indexer <!-- The Basics --> <groupId>com.linkedin</groupId> indexer <artifactId>Foo-ui</artifactId> pom.xml ui <version>1.0</version> <packaging>war</packaging> ui <parent>Foo</parent> pom.xml ...... </project>pom.xml
  19. 19. Understanding the POM.xml <project><project> <modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion> <!-- The Basics --> <!-- The Basics --> <groupId>com.linkedin</groupId> <artifactId>Foo-search</artifactId> <groupId>com.linkedin</groupId> <version>1.0</version> <artifactId>Foo</artifactId> <packaging>war</packaging> <version>1.0</version> <parent>Foo</parent> <packaging>pom</packaging> ...... <modules> </project> <module>ui</module> <project> <module>search</module> <modelVersion>4.0.0</modelVersion> <module>indexer</module> <Parent> Tag <!-- The Basics --> </modules> in child <groupId>com.linkedin</groupId>...... pom.xml <artifactId>Foo-indexer</artifactId> <version>1.0</version></project> <packaging>jar</packaging> <parent>Foo</parent> ...... search </project> <project> search <modelVersion>4.0.0</modelVersion> pom.xml indexer <!-- The Basics --> <groupId>com.linkedin</groupId> indexer <artifactId>Foo-ui</artifactId> pom.xml ui <version>1.0</version> <packaging>war</packaging> ui <parent>Foo</parent> pom.xml ...... </project>pom.xml
  20. 20. Understanding the POM.xml <project><project> <modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion> <!-- The Basics --> <groupId>com.linkedin</groupId> <!-- The Basics --> <artifactId>Foo-search</artifactId> <groupId>com.linkedin</groupId> <version>1.0</version> <artifactId>Foo</artifactId> <packaging>war</packaging> <parent>Foo</parent> <version>1.0</version> pom <packaging>pom</packaging> <packaging> ...... <modules> type </project> <module>ui</module> <project> <modelVersion>4.0.0</modelVersion> <module>search</module> <module>indexer</module> 3 <Module> <Parent> Tag <!-- The Basics --> </modules> Tags in the in child <groupId>com.linkedin</groupId>...... parent pom.xml <artifactId>Foo-indexer</artifactId> <version>1.0</version></project> pom.xml <packaging>jar</packaging> <parent>Foo</parent> ...... </project> search <project> search <modelVersion>4.0.0</modelVersion> pom.xml indexer <!-- The Basics --> <groupId>com.linkedin</groupId>indexer <artifactId>Foo-ui</artifactId> pom.xml ui <version>1.0</version> <packaging>war</packaging> ui <parent>Foo</parent> pom.xml ...... </project>pom.xml
  21. 21. Understanding the POM.xml Some Useful Information -- The child POMs inherit the settings in the parent POM. -- Calling “mvn <command>” on the parent causes all child POMs to be executed -- Calling “mvn <command>” on a child POM executes on that single child POM, but does correctly inherit settings from parent POM Foo searchsearch pom.xml indexerindexer pom.xml ui ui pom.xmlpom.xml
  22. 22. More Project Information (POM)
  23. 23. Understanding the POM.xml <!-- More Project Information --> <name>...</name> <description>...</description> <url>...</url>These fields are pretty self- <inceptionYear>...</inceptionYear>explanatory. Good to include, <licenses>...</licenses> <organization>...</organization>especially for open-source projects. <developers>...</developers> <contributors>...</contributors>
  24. 24. Environment Settings (POM)
  25. 25. Understanding the POM.xmlThe repositories tag refers to refers to repositories that Mavenshould refer to when looking for the jars listed in the dependenciessection that we already covered. <!-- Environment Settings --> <issueManagement>...</issueManagement>If you do not specify a repositories tag, Maven will look in the default <ciManagement>...</ciManagement>repository : http://search.maven.org/#browse (a.k.a. http:// <mailingLists>...</mailingLists>repo.maven.apache.org/maven2/ ) <scm>...</scm> <prerequisites>...</prerequisites>If you need to access jars from a private repository (e.g. LinkedIn’s <repositories>...</repositories>Artifactory) and from the default public repository: <pluginRepositories>...</ pluginRepositories>repositories> <distributionManagement>...</ <repository> distributionManagement> <id>public-central</id> <profiles>...</profiles> <url> http://repo.maven.apache.org/maven2/ </url> </project> <snapshots> <enabled>false</enabled> </snapshots> </repository> <repository> <id>central-private</id> <url> http://artifactory.corp.linkedin.com......./artifactory/release </url> <snapshots> <enabled>false</enabled> </snapshots> </repository>
  26. 26. Understanding the POM.xmlThe SCM tag refers to Source Control Management. Maven offerspretty advanced plug-ins for Git and SVN. <!-- Environment Settings -->An example Git SCM tag is shown below. With this enabled, you <issueManagement>...</issueManagement>can use powerful features in Maven such as release. “mvn <ciManagement>...</ciManagement>release:perform” can release a WAR or JAR to Artifactory or to a <mailingLists>...</mailingLists>public Maven repo. <scm>...</scm> <prerequisites>...</prerequisites>Once complete, Maven will automatically up-rev the pom.xml <repositories>...</repositories>version and commit/push the new pom.xml to the Git “origin” <pluginRepositories>...</server using the Git connect strings in the SCM tag. pluginRepositories> <distributionManagement>...</ distributionManagement><scm> <profiles>...</profiles> <connection> </project> scm:git:git@gitli.corp.linkedin.com:ds-platform/listt.git </connection> <url> scm:git:git@gitli.corp.linkedin.com:ds-platform/listt.git </url> <developerConnection> scm:git:git@gitli.corp.linkedin.com:ds-platform/listt.git </developerConnection></scm>
  27. 27. Understanding the POM.xmlThe distributionManagement tag is the reverse of therepositories tag -- it refers to the repository where the build <!-- Environment Settings -->artifact (i.e. JAR or WAR) will be stored. <issueManagement>...</issueManagement> <ciManagement>...</ciManagement> <mailingLists>...</mailingLists>From the previous “mvn release:perform” example, the information <scm>...</scm>in the distributionManagement tag tells Maven where to post the <prerequisites>...</prerequisites>jar. <repositories>...</repositories> <pluginRepositories>...</<distributionManagement > pluginRepositories> <repository> <distributionManagement>...</ <id>central-private</id> distributionManagement> <url> <profiles>...</profiles> http://artifactory.corp.linkedin.com......./artifactory/ </project> release </url> <snapshots> <enabled>false</enabled> </snapshots> </repository></distributionManagement >
  28. 28. Some Useful Commands
  29. 29. Some Useful CommandsAll commands must be run in the same directory containing the pom.xml.• mvn clean, compile --> cleans the project, then compiles it• mvn clean package --> previous step + create WAR or JAR• mvn clean install --> previous step + run integration tests and install the WAR or JAR in thelocal repository• mvn release:prepare --> Does the following: • prompts the user for the version of the jar • alters the version in the POM.xml (i.e. 1.0-SNAPSHOT --> 1.0) • runs a clean-compile-test-package cycle • and generates a release.properties file• mvn release:perform --> Does the following: • pushes the JAR/WAR to Artifactory or some public repo • If successful, bumps up the version in the pom.xml file (i.e. 1.0 --> 1.1-SNAPSHOT) • You should never need to alter the version in the POM.xml file!