BuildManagement:Maven

Aus Alexander's Wiki
Zur Navigation springen Zur Suche springen


Installation

  • Java JDK muss installiert sein (echo %JAVA_HOME%, java -version)
  • Download Maven
  • Unzip Maven
  • Das bin-Verzeichnis in den Pfad aufnehmen (mvn -v)

Einstellungen lassen sich im Unterverzeichnis conf in der Datei settings.xml ändern

Struktur

Konzept

Maven nutzt das Convention over Configuration-Konzept. Bei einem Mavenprojekt liegen die Quellen in den Verzeichnisstrukturen src/main/java, src/main/resources und src/test/java vor. Nach dem Ausführen liegen alle Artefakte im Verzeichnis target.

Steuerung

Maven wird durch eine Konfigurationsdatei pom.xml (Project Object Model) gesteuert. Die POMs enthalten goals und plugins. Sie starten mit dem üblichen XML-Header und dann für das Projekt spezifischen Parametern groupId, artifactId, version.

<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>de.kluge.project-group</groupId>
   <artifactId>project</artifactId>
   <version>1.0</version>
 
   ...

</project>

Diese erstellt man (inkl. der Verzeichnisse) mit dem Befehl:

mvn archetype:generate -DgroupId=de.kluge.project-group -DartifactId=project -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Alle POMs leiten von einem Super POM ab, welches man mit mvn help:effective-pom anschauen kann.

Bauen

Es gibt die build phase und goals. Die build phase besteht aus 23 Schritten:

  • ...
  • compile
  • ...
  • test
  • ...
  • package
  • ...
  • install
  • ...

Ein gemixted Kommando könnte so aussehen:

mvn clean dependency:copy-dependencies package

Dann wird zuerst die build phase clean ausgeführt, gefolgt vom goal dependency:copy-dependencies. Und zum Schluss wird die build phase package ausgeführt. (Meistens benötigt man clean und install, was zum Befehl mvn clean install führt.)

Die Plugin-Syntax lautet:

mvn [plugin-name]:[goal-name]

Plugin im Lifecycle

Die build phase clean besteht selber aus den drei goals:

  • clean:pre-clean
  • clean:clean
  • clean:post-clean

Als Beispiel wird mit Hilfe des goals run aus dem Plugin maven-antrun-plugin (maven-antrun-plugin:run) eine Nachricht ausgegeben.

  ....
<build>
<plugins>
   <plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-antrun-plugin</artifactId>
   <version>1.1</version>
   <executions>
      <execution>
         <id>id.pre-clean</id>
         <phase>pre-clean</phase>
         <goals>
            <goal>run</goal>
         </goals>
         <configuration>
            <tasks>
               <echo>pre-clean phase</echo>
            </tasks>
         </configuration>
      </execution>
      <execution>
         <id>id.clean</id>
         <phase>clean</phase>
         <goals>
          <goal>run</goal>
         </goals>
         <configuration>
            <tasks>
               <echo>clean phase</echo>
            </tasks>
         </configuration>
      </execution>
      <execution>
         <id>id.post-clean</id>
         <phase>post-clean</phase>
         <goals>
            <goal>run</goal>
         </goals>
         <configuration>
            <tasks>
               <echo>post-clean phase</echo>
            </tasks>
         </configuration>
      </execution>
   </executions>
   </plugin>
</plugins>
</build>
 ....

Das geht auch in den anderen Lifecycles:

 ....
<executions>
   <execution>
      <id>id.validate</id>
      <phase>validate</phase>
      <goals>
         <goal>run</goal>
      </goals>
      <configuration>
         <tasks>
            <echo>validate phase</echo>
         </tasks>
      </configuration>
   </execution>
   <execution>
      <id>id.compile</id>
      <phase>compile</phase>
      <goals>
         <goal>run</goal>
      </goals>
      <configuration>
         <tasks>
            <echo>compile phase</echo>
         </tasks>
      </configuration>
   </execution>
   <execution>
      <id>id.test</id>
      <phase>test</phase>
      <goals>
         <goal>run</goal>
      </goals>
      <configuration>
         <tasks>
            <echo>test phase</echo>
         </tasks>
      </configuration>
   </execution>
   <execution>
         <id>id.package</id>
         <phase>package</phase>
         <goals>
            <goal>run</goal>
         </goals>
         <configuration>
         <tasks>
            <echo>package phase</echo>
         </tasks>
      </configuration>
   </execution>
   <execution>
      <id>id.deploy</id>
      <phase>deploy</phase>
      <goals>
         <goal>run</goal>
      </goals>
      <configuration>
      <tasks>
         <echo>deploy phase</echo>
      </tasks>
      </configuration>
   </execution>
</executions>
 ....

Eigene Bibliotheken

Das JAR in das Verzeichnis src/lib kopieren und das POM analog unten (ldapjdk.jar) modifizieren:

 ....
  <dependencies>
      <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
         <version>3.8.1</version>
         <scope>test</scope>
      </dependency>

      <dependency>
         <groupId>ldapjdk</groupId>
         <artifactId>ldapjdk</artifactId>
         <scope>system</scope>
         <version>1.0</version>
         <systemPath>${basedir}\src\lib\ldapjdk.jar</systemPath>
      </dependency>
   </dependencies>
 ....

Profile

Im pom.xml wird der Abschnitt <build> gekappselt:

 ....
<profiles>
      <profile>
      <id>test</id>
      <build>
          ....
      </build>
      </profile>
   </profiles>
 ....

Das Profil lässt sich dann als Parameter auswählen:

mvn test -Ptest

Es geht auch über die %M2_HOME%\conf\settings.xml, Umgebungsvariablen, Betriebssystem oder present/missing file.

Genaueres lässt sich z.B. hier nachlesen.

Eigene Plugins entwickeln

Das kann man z.B. hier nachlesen.

Ausführen

java -cp target/my-app-1.0-SNAPSHOT.jar com.mycompany.app.App