User Tools

Site Tools


start:maven:totalnewbieintro

This is an old revision of the document!


Total newbie introduction to Maven

This article is currently being written.

Anybody who wanted to to start with Apache Maven probably at least skimmed through the official guide and I wasn't an exception. While reading, I started to think, what the hell… it was supposed to be simple. Instead of it, I had to enter this crazy command into shell just to create a basic empty project:

mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app \
                       -DarchetypeArtifactId=maven-archetype-quickstart \
                       -DinteractiveMode=false

Oh God, whyyyy!? So let's fiddle with it…

Empty project structure

What really happens when you run aforementioned command is that it creates directory structure, pom.xml (Maven project file, so called Project Object Model) and a Hello world app (and its test):

fiisch@mothership:~> cd /tmp/
fiisch@mothership:/tmp> mkdir mvn-test
fiisch@mothership:/tmp> cd mvn-test/
fiisch@mothership:/tmp/mvn-test> mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app \
>                        -DarchetypeArtifactId=maven-archetype-quickstart \
>                        -DinteractiveMode=false
[INFO] Scanning for projects...
...
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.808 s
[INFO] Finished at: 2016-08-12T11:21:32+02:00
[INFO] Final Memory: 14M/343M
fiisch@mothership:/tmp/mvn-test> find
.
./my-app
./my-app/src
./my-app/src/main
./my-app/src/main/java
./my-app/src/main/java/com
./my-app/src/main/java/com/mycompany
./my-app/src/main/java/com/mycompany/app
./my-app/src/main/java/com/mycompany/app/App.java
./my-app/src/test
./my-app/src/test/java
./my-app/src/test/java/com
./my-app/src/test/java/com/mycompany
./my-app/src/test/java/com/mycompany/app
./my-app/src/test/java/com/mycompany/app/AppTest.java
./my-app/pom.xml

Also there is a generated pom.xml file which you have to edit if you take it seriously. Now let me explain the project-generation command:

  • mvn - Execute Maven binary.
  • archetype:generate - Use an archetype, archetypes are Maven plugins; we tell Maven that we want to run genereate plugin - which generates something from scratch.
  • -DgroupId=com.mycompany.app - Base namespace for your application. This is what you write to the package clause in your Java sources, in this case it would be package com.company.myapp;. Of course, this does not prevent you from creating subpackages.
  • -DartifactId=my-app - Root directory of your project. There is a pom.xml and src and test directories. There also appears target directory after you compile your application.
  • -DarchetypeArtifactId=maven-archetype-quickstart - This option specifies which artifact (= base setting) of the generate archetype will Maven use.
  • -DinteractiveMode=false - This is to not scare off beginners, see this section.

Creating empty project by hand

Now we will try to create empty project by hand. First, create directory for your project and then a structure the archetype originally created for you:

fiisch@mothership:/tmp> mkdir mvn-test-hand
fiisch@mothership:/tmp> cd mvn-test-hand/
fiisch@mothership:/tmp/mvn-test-hand>

# now we are starting to create project
# create equivalent of -DartifactId=my-app
fiisch@mothership:/tmp/mvn-test-hand> mkdir my-app

# create directory structure for -DgroupId=com.mycompany.app
fiisch@mothership:/tmp/mvn-test-hand> cd my-app/
fiisch@mothership:/tmp/mvn-test-hand/my-app> mkdir -pv src/{main,test}/java/com/mycompany/app
mkdir: created directory ‘src’
mkdir: created directory ‘src/main’
mkdir: created directory ‘src/main/java’
mkdir: created directory ‘src/main/java/com’
mkdir: created directory ‘src/main/java/com/mycompany’
mkdir: created directory ‘src/main/java/com/mycompany/app’
mkdir: created directory ‘src/test’
mkdir: created directory ‘src/test/java’
mkdir: created directory ‘src/test/java/com’
mkdir: created directory ‘src/test/java/com/mycompany’
mkdir: created directory ‘src/test/java/com/mycompany/app’

# create minimal pom.xml in the my-app folder
fiisch@mothership:/tmp/mvn-test-hand/my-app> cat pom.xml
<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/xsd/maven-4.0.0.xsd">

	<modelVersion>4.0.0</modelVersion>
	<groupId>com.mycompany.app</groupId>
	<artifactId>my-app</artifactId>
	<version>1.0-SNAPSHOT</version>
</project>

# now try to compile empty project
fiisch@mothership:/tmp/mvn-test-hand/my-app> mvn compile
[INFO] Scanning for projects...
...
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.395 s
[INFO] Finished at: 2016-08-12T12:05:05+02:00
[INFO] Final Memory: 9M/481M

And that's it. We managed to setup empty project without using the archetype.

Please note that this project (and also its pom.xml) is emptier than the generated one. It is because I skipped Hello world app and whole tests thing. Also in the pom.xml I left out project name, url, description and whole lot of other sections to keep it truly minimal.

Interactive mode and problem of too many choices

start/maven/totalnewbieintro.1471008827.txt.gz · Last modified: 2016/08/12 13:33 by fiisch