Maven 3 Tutorial – Project Setup

June 11th, 2011 by David Kessler Leave a reply »
  • Overview
    • What is Maven?
    • Plugins
    • Why not Ant and Ivy?
    • But It Downloads the Internet
  • Getting Started
    • Install
    • What is a POM?
    • Convention over Configuration
    • New Project
  • Project Management
    • Parent POM
    • Local Maven Repository
    • Multiple Artifacts from a Single Source
    • Release Plugin
    • Aggregate POM
    • Dependency Management
    • Distribution Zip
  • Conclusions

Overview

What is Maven?

Maven is a software project management and comprehension tool that includes: build tools, dependency management, project reporting and much more.  I say “much more” because at the core Maven is a plugin execution framework.  There are plugins supported by the Maven project (http://maven.apache.org/plugins/index.html), plugins supported by Mojo Project (http://mojo.codehaus.org/plugins.html), and third party plugins.  If you can find or write a plugin, Maven can run it.

Plugins

Plugins are configured to run during specific phases in the Maven lifecycle.  The high-level phases that make up the build lifecycle include: validation, compile, test, package, integration-test, verify, install, and deploy.  An exhaustive list of build phases can be found at http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Lifecycle_Reference.

Why not Ant and Ivy?

People always gravitate to this question of whether Maven is better than Ant and Ivy.  Unfortunately this is not a fare comparison.  Ant is a build tool and Ivy is a dependency management tool.  Maven is not just a build tool or just a dependency management tool.  On the contrary, Maven is a project management tool that embodies software development best practices.

To illustrate this point I will share a story from my early years in software development.  Our shop used Ant without Ivy.  Ivy didn’t become a full fledged Apache project until October, 2007.  Each team had their own Ant build.  As we began to move from team to team we had to find out which targets needed to be run.  Over time we decided on a set of names that every team needed to implement.  This helped but just because the target was named the same thing it did not mean they worked the same way.

Long story short, we began to meet to create a shared standard.  During this long process we were introduced to Maven.  Ironically, Maven had accepted standards for many of the issues that we were trying address.  Maven was not just a standard for our company it was a standard for all Maven users.  New employees that were familiar with Maven had a good grasp of how we managed our projects.

Maven provided a standard that not only addressed our concerns as software developers.  It provided a standard solution that supported our corporate: audits, disaster recovery, tracability, and the list goes on.  We were trying to reinvent the wheel with Ant when the Maven community had already solved these problems.

Ant and Ivy are powerful ingredients for designing a custom build process.  Maven however is a powerful solution for building and managing software.  In our case we wanted a solution instead of the ingredients and tools to create our own solution.  Maven satisfied our needs and saved us significant time and money.

But It Downloads the Internet

I can’t tell you how many people have told me that they don’t like Maven because it “downloads the internet”. I find it ironic that many of them like Ivy.  I hate to break the news, but Ivy downloads the internet too. I’m not sure why this is a concern.  Is there a fear that Maven will fill up their hard drive?  Disk space is cheap.  The computer I am working on right now has 150GB of hard disk space and my Maven local repository is eating up 300MB of it.  This computer has pleanty of room for more of the internet.

I recall the first time that I tried to setup a new project without a dependency management tool.  I spent over a week trying to download the correct version of each JAR.  I was ready to take a vacation by the time I finished this ugly puzzle.  After using Maven and Ivy for managing my  dependencies I will never go back.  By the time I downloaded all the JARs that we needed, I felt like I had in fact downloaded the entire internet.

I love dependency management tools and they can have as much of my hard drive as they need.

Advertisement

35 comments

  1. Akrem Saed says:

    I always wanted to start using Maven along with Archiva for some time now, and this just helped me to jump start that … excellent post, thanks david

  2. mark says:

    acording to mvn -help it should be “mvn –version” instead of “mvn -version”

  3. mark says:

    I guess that’s a wordpress issue (- – instead of -)

  4. mark says:

    ‘eclipze.exe’ should be ‘eclipse.exe’. and thanks thanks thanks for the extremely helpful post

  5. David Kessler says:

    I fixed ‘eclipze.exe’. Nice catch. Thank you.

  6. David Kessler says:

    Both ‘mvn –version’ and ‘mvn -version’ work for me. I updated it to the latter. Thank you.

  7. greg says:

    correcting the corrector

    acording to mvn -help it should be “mvn –version” instead of “mvn -version”

  8. Akrem Saed says:

    one little issue I encountered was maven was not downloading dependencies from repository locations defined in a project pom.xml

    the pom had the following :
    <repositories>
    <repository>
    <id>springbyexample.org</id>
    <name>Spring by Example</name>
    <url>http://www.springbyexample.org/maven/repo</url&gt;
    </repository>

    <repository>
    <id>com.springsource.repository.bundles.release</id>
    <name>SpringSource Enterprise Bundle Repository – SpringSource Bundle Releases</name>
    <url>http://repository.springsource.com/maven/bundles/release</url&gt;
    </repository>
    <repository>
    <id>com.springsource.repository.bundles.external</id>
    <name>SpringSource Enterprise Bundle Repository – External Bundle Releases</name>
    <url>http://repository.springsource.com/maven/bundles/external</url&gt;
    </repository>
    <repository>
    <id>spring.maven.milestone</id>
    <name>Spring Milestone Maven Repo</name>
    <url>http://repository.springsource.com/maven/bundles/milestone</url&gt;
    </repository>

    <repository>
    <id>maven2-repository.dev.java.net</id>
    <name>Java.net Maven 2 Repository</name>
    <url>http://download.java.net/maven/2</url&gt;
    </repository>
    </repositories>

    but since I configured Archiva to ONLY mirror central maven2-repository.dev.java.net but in the maven settings.xml file we used
    <mirror>
    <id>archiva.default</id>
    <url>http://localhost:8095/archiva/repository/internal/</url&gt;
    <mirrorOf>*</mirrorOf>
    </mirror>

    the * was the problem because we are telling maven to always use archiva as the mirror , but Archiva is only mirroring two repositories . To fix this , we changed the last one to

    <mirror>
    <id>archiva.default</id>
    <url>http://localhost:8095/archiva/repository/internal/</url&gt;
    <mirrorOf>central,maven2-repository.dev.java.net</mirrorOf>
    </mirror>

  9. john says:

    Your screenshots are .bmp files. I just can’t believe it. Page 3 of this article nearly weights 100 MB. I’m glad you made this tutorial but, seriously, .bmp?

  10. David Kessler says:

    Good catch. I updated it with smaller .jpg files. Thank you.

  11. Andi says:

    after many days – with this tutorial maven run , thanks

  12. Apache Omega says:

    I’ve been trying for days to get maven running and it just wont work.
    I type in mvn -version and it says mvn is not recognized
    what the hell am i doing wrong?

  13. Travis Klotz says:

    Omega,

    It sounds like you do not have M2_HOME/bin on your Path. So when you try to execute the command, it had no idea where the program is.

    T

  14. Adel M says:

    Very nice overview of Maven! but please do something about the missing xml tags on the xml examples. Thanks!

  15. David Kessler says:

    Thank you. Nice catch. I’m not sure how the xml tags got stripped off of this post but I added them back.

  16. Alvi says:

    Hei,

    I follow the tutorial very well but when i run mvn install i got following error. Can some one tell me what i miss.. thanks

    [ERROR] Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.1.1:war (default-war) on project onlineweb: Error assembling WAR: webxml attribute i
    s required (or pre-existing WEB-INF/web.xml if executing in update mode) -> [Help 1]
    org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.1.1:war (default-war) on project inmo
    bilweb: Error assembling WAR: webxml attribute is required (or pre-existing WEB-INF/web.xml if executing in update mode)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:217)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:320)
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156)
    at org.apache.maven.cli.MavenCli.execute(MavenCli.java:537)
    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196)
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:141)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352)
    Caused by: org.apache.maven.plugin.MojoExecutionException: Error assembling WAR:
    webxml attribute is required (or pre-existing WEB-INF/web.xml if executing in update mode)
    at org.apache.maven.plugin.war.WarMojo.execute(WarMojo.java:175)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209)
    … 19 more
    Caused by: org.codehaus.plexus.archiver.ArchiverException: webxml attribute is required (or pre-existing WEB-INF/web.xml if executing in update mode)
    at org.codehaus.plexus.archiver.war.WarArchiver.initZipOutputStream(WarArchiver.java:149)
    at org.codehaus.plexus.archiver.zip.AbstractZipArchiver.createArchiveMain(AbstractZipArchiver.java:346)
    at org.codehaus.plexus.archiver.zip.AbstractZipArchiver.execute(AbstractZipArchiver.java:250)
    at org.codehaus.plexus.archiver.AbstractArchiver.createArchive(AbstractArchiver.java:871)
    at org.apache.maven.archiver.MavenArchiver.createArchive(MavenArchiver.java:543)
    at org.apache.maven.plugin.war.WarMojo.performPackaging(WarMojo.java:225)
    at org.apache.maven.plugin.war.WarMojo.execute(WarMojo.java:159)
    … 21 more
    [ERROR]
    [ERROR] Re-run Maven using the -X switch to enable full debug logging.
    [ERROR]
    [ERROR] For more information about the errors and possible solutions, please read the following articles:
    [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

  17. David Kessler says:

    I was able to reproduce this issue with the following steps.
    1. Create new Maven Project
    2. check ‘Create a simple project (skip archetype selection)
    3. next
    4. add groupId/artifactId
    5. change the packaging to ‘war’
    6. finish
    7. Run As -> Maven install

    The reason that you’re getting this message is that there isn’t a ‘web.xml’ file in ‘src/main/java/webapp/WEB-INF’

    You can either add a ‘web.xml’ file to this directory or you can use a Maven archetype. To use an archetype follow these steps.

    1. Create new Maven Project
    2. uncheck ‘Create a simple project (skip archetype selection)
    3. next
    4. select ‘All Catalogs’
    5. Filter = ‘maven-archetype-webapp’
    6. select ‘maven-archetype-webapp’
    7. next
    8. add groupId/artifactId
    9. finish

    This will create a ‘web.xml’ file for you.

    Hope this helps.

  18. Alvi says:

    Thanks David kessler now its work

  19. This post is great I’m glad I found it

  20. Tory Barren says:

    This is simply supurb, very indepth, thank you.

  21. Mara says:

    very good submit, i definitely love this website, carry on it

  22. Abdul Mannan Khan says:

    kudos.. Great tutorial for start-up.

  23. Vikas says:

    Great!!!! Above steps worked for me. Thanks.

  24. Jay Ungerland says:

    “Build Success!”

    Many, many thanks for this detailed and lucid tutorial.

  25. oussama smiai says:

    Your tutorial is very helpful, I wish I can find a tutorial about configuring settings.xml and M2_REPO variable

  26. vishu says:

    its very good…..

    thanks

  27. shamna says:

    Could you please help me how to create a login and registration page using maven??

  28. David Kessler says:

    Maven is not a web framework. You need to look into Spring MVC or Grails or some kind of web framework to create a login and registration page.

  29. when i am opening pom.xml,acoording to this ,i have select plug-in.but i am not geeting that option when i was open pom.xml.i am geeting window like Overview ……what i have to do ,to select plug-in

  30. saad says:

    thank so much

  31. baba khan says:

    very good tutorial.. and so helpfull

Leave a Reply

*