BuildManagement:Maven: Unterschied zwischen den Versionen

Aus Alexander's Wiki
K
 
(8 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 31: Zeile 31:
</source>
</source>
Diese erstellt man (inkl. der Verzeichnisse) mit dem Befehl:
Diese erstellt man (inkl. der Verzeichnisse) mit dem Befehl:
<source lang="bash">
<source lang="bash" encl="div">
mvn archetype:generate -DgroupId=de.kluge.project-group -DartifactId=project -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
mvn archetype:generate -DgroupId=de.kluge.project-group -DartifactId=project -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
</source>
</source>
Zeile 37: Zeile 37:


== Bauen ==
== Bauen ==
Es gibt die '''build phase''' und '''goals'''. Die ''build phase'' besteht aus den Schritten:
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:
Ein gemixted Kommando könnte so aussehen:
Zeile 48: Zeile 54:
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.
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.)
(Meistens benötigt man clean und install, was zum Befehl ''mvn clean install'' führt.)
Die Plugin-Syntax lautet:
<source lang="bash" encl="div">
mvn [plugin-name]:[goal-name]
</source>
== 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.
<source lang="bash" encl="div">
  ....
<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>
....
</source>
Das geht auch in den anderen Lifecycles:
<source lang="bash" encl="div">
....
<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>
....
</source>
== Eigene Bibliotheken ==
Das JAR in das Verzeichnis src/lib kopieren und das POM analog unten (ldapjdk.jar) modifizieren:
<source lang="bash" encl="div">
....
  <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>
....
</source>
== Profile ==
Im pom.xml wird der Abschnitt <build> gekappselt:
<source lang="bash" encl="div">
....
<profiles>
      <profile>
      <id>test</id>
      <build>
          ....
      </build>
      </profile>
  </profiles>
....
</source>
Das Profil lässt sich dann als Parameter auswählen:
<source lang="bash" encl="div">
mvn test -Ptest
</source>
Es geht auch über die ''%M2_HOME%\conf\settings.xml'', ''Umgebungsvariablen'', ''Betriebssystem'' oder ''present/missing file''.
Genaueres lässt sich z.B. [https://www.tutorialspoint.com/maven/maven_build_profiles.htm hier] nachlesen.
== Eigene Plugins entwickeln ==
Das kann man z.B. [https://www.javacodegeeks.com/2015/04/there-is-a-mojo-in-my-dojo-how-to-write-a-maven-plugin.html hier] nachlesen.


== Ausführen ==
== Ausführen ==

Aktuelle Version vom 10. November 2016, 22:01 Uhr


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