Maven command line usage

Figure 260. CLI example Slide presentation
mvn --batch-mode -e archetype:generate \
-DgroupId=de.hdm_stuttgart.mi.sd1 -DartifactId=second -Dversion=0.9 \
-DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4

[INFO] Scanning for projects...
      ...
[INFO] BUILD SUCCESS ...

See artifact reference.


The MI department provides modified archetypes supporting more current versions of unit testing software. These are being provided by a Maven repository server:

Figure 261. Supplementary MI Maven archetypes Slide presentation

Create an empty .m2 Maven related directory below your home directory ~. The -p option avoids an error message in case ~/.m2 already exists.

Use a text editor creating (or adding) the following content in ~/.m2/settings.xml. Any text editor like (vim, nano, emacs, IntelliJ,...) will do:

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">

  <profiles>
    <profile>
      <id>development</id>
      <repositories>
        <repository>
          <id>archetypeMI</id>
          <name>Supplementary MI archetypes and artifacts</name>
          <url>https://maven.mi.hdm-stuttgart.de/nexus/repository/mi-maven</url>
          <releases><enabled>true</enabled></releases>
          <snapshots><enabled>true</enabled></snapshots>
        </repository>
      </repositories>
    </profile>
  </profiles>

  <activeProfiles>
    <activeProfile>development</activeProfile>
  </activeProfiles>

</settings>

https://maven.mi.hdm-stuttgart.de/nexus/repository/mi-maven refers to a Sonatype Nexus repository manager instance hosting supplementary Maven archetypes and artifacts.


After editing you should test your configuration by creating a dummy project (copy and paste to a terminal window):

Figure 262. CLI archetype test Slide presentation
  mvn --batch-mode -e archetype:generate \
-DgroupId=de.hdm_stuttgart.mi.sd1 -DartifactId=second -Dversion=0.9 \
-DarchetypeGroupId=de.hdm_stuttgart.mi -DarchetypeArtifactId=mi-maven-archetype-quickstart -DarchetypeVersion=2.1
[INFO] Error stacktraces are turned on.
[INFO] Scanning for projects...
      ...
[INFO] BUILD SUCCESS ...

Figure 263. CLI archetype details Slide presentation

Defining archetype and project details:

mvn --batch-mode  -e archetype:generate  \
                                              \
 -DarchetypeGroupId=de.hdm_stuttgart.mi \ 
 -DarchetypeArtifactId=mi-maven-archetype-quickstart \
 -DarchetypeVersion=2.1 \
                        \
 -DgroupId=de.hdm_stuttgart.mi.sd1  \
 -DartifactId=first  \
 -Dversion=0.9

During project generation Maven shall work in batch mode not asking for user input.

Create a Maven project using an archetype being specified by .

archetypeGroupId, archetypeArtifactId and archetypeVersion uniquely identify an archetype.

mi-maven-archetype-quickstart denotes one of several available archetypes.

Likewise groupId, artifactId and version are intended to uniquely define a project being generated. Moreover the groupId property defines the project's default base package to be explained in Objects and Classes.


Figure 264. Generated project layout Slide presentation
> cd first        # Enter project directory
> find . -type f  # Search recursively for files
./.gitignore 
./src/main/java/de/hdm_stuttgart/mi/sd1/App.java 
./pom.xml 

Exclude specific files from version git based control.

Java source file containing an executable main() class.

The Project Object Model file defining build rules.


Figure 265. Maven compile Slide presentation
> mvn compile
[INFO] Scanning for projects...
       ...
[INFO] Building first 0.9
   ...
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to /ma/goik/first/target/classes
[INFO] --------------------------------------------------------
[INFO] BUILD SUCCESS

Figure 266. Compilation file view Slide presentation
> find target/classes -type f
./target/classes/de/hdm_stuttgart/mi/sd1/App.class
...

Figure 267. Execution Slide presentation
> cd target/classes 
> java de.hdm_stuttgart.mi.sd1.App 
Hi there, let's have
fun learning Java! 

Change to base directory containing compiled Java classes.

Application execution. Note:

Our App class is being prefixed by the package name de.hdm_stuttgart.mi.sd1 defined by the groupId parameter in Figure 263, “CLI archetype details ”.

The expected output result.

Note

Executing this particular class requires a configuration in our project's pom.xml file:

...
<archive>
  <manifest>
    <mainClass>de.hdm_stuttgart.mi.sd1.test.ShowReachedPoints</mainClass>
  </manifest>
</archive> ...

Figure 268. Maven package Slide presentation
> mvn package
...
 T E S T S
...
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
   ...
[INFO] Building jar: /ma/goik/first/target/first-0.9.jar
...
[INFO] Replacing /ma/goik/first/target/first-0.9.jar with 
         /ma/goik/first/target/first-0.9-shaded.jar
...
[INFO] BUILD SUCCESS

Figure 269. Executing Java archive first-0.9.jar Slide presentation
java -jar target/first-0.9.jar
Hi there, let's have
fun learning Java!

Remark: This will execute HelloWorld.class being contained in first-0.9.jar.


exercise No. 112

Details on execution

Q:

In Figure 269, “Executing Java™ archive first-0.9.jar we saw successful execution of:

java -jar target/first-0.9.jar

How does this actually work? There might be multiple executable classes containing main() methods within a given project? How is de/hdm_stuttgart/mi/sd1/App.class being selected for execution?

Tip

Have a closer look on your project's pom.xml. Also unzip your generated first-0.9.jar file to examine the contained file META-INF/MANIFEST.MF.

A:

Our pom.xml defines a single class which must contain a public static void main(String[] args) method:

<project xmlns="http://maven.apache.org/POM/4.0.0" ...>
  <modelVersion>4.0.0</modelVersion>
  ...
    <manifestEntries>
       <Main-Class>de.hdm_stuttgart.mi.sd1.App</Main-Class>
    </manifestEntries>
  ...
</project>

The Maven package processing step wraps this class name into the generated first-0.9.jar archive's manifest file META-INF/MANIFEST.MF:

> cat META-INF/MANIFEST.MF 
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven 3.5.2
Built-By: goik
Build-Jdk: 10.0.2
Main-Class: de.hdm_stuttgart.mi.sd1.App

This allows the Java runtime to choose the class to be executed.

Figure 270. Maven javadoc:javadoc Slide presentation
> mvn javadoc:javadoc
[INFO] Scanning for projects...
...
Generating /ma/goik/First/target/site/apidocs/allclasses-noframe.html...
Generating /ma/goik/First/target/site/apidocs/index.html...
Generating /ma/goik/First/target/site/apidocs/overview-summary.html...
Generating /ma/goik/First/target/site/apidocs/help-doc.html...

See e.g. class String documentation.


Figure 271. Maven clean Slide presentation
> mvn clean
...
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ first ---
[INFO] Deleting /ma/goik/first/target
[INFO] ------------------------------------------------------------------------
[