JavaFX: Maven und Gradle

Ein schneller, kurzer Überblick über Maven und Gradle. Dies kann keine Einführung in der Tiefe sein – dazu wäre jeweils eine ganze Blog-Serie notwendig und da ist es sinnvoller, die offizielle Dokumentation zu verwenden!

Teile der JavaFX Serie (aktualisiert)

Teile der JavaFX Serie (alt / geplant)

Code der JavaFX Serie

Der Source Code sowie alle Dokumente finden sich auf GitHub: https://github.com/kneitzel/blog-javafx-series

Was sind Maven und Gradle?

Bei Maven und Gradle handelt es sich um Tools, mit denen ein Projekt verwaltet und gebaut werden kann. Ein wichtiges Feature ist dabei die Verwaltung von Abhängigkeiten, die vom Tool automatisch in der gewünschten Version von einem Repository heruntergeladen und bereitgestellt werden.

Dies verringert die Aufwände bezüglich Einrichtung eines Arbeitsplatzes enorm, da die Anzahl der Abhängigkeiten, die installiert werden müssen, minimiert werden.

Vorteile

Der große Vorteil dieser Build Tools ist, dass diese von den gängigen Entwicklungsumgebungen (IntelliJ, Eclipse, Netbeans) unterstützt werden. Damit ist ein Projekt unabhängig von einer Entwicklungsumgebung und jeder Entwickler kann mit der Umgebung arbeiten, die er bevorzugt.

Maven

Übersicht

Maven entstand im Jahr 2003 (Version 1.x) / 2004 (Version 1.0) und kann somit auf eine recht lange Entwicklungszeit zurückblicken.

Das Tool zeichnet sich dadurch aus, dass es ein festen Lebenszyklus vorgibt, der feste Phasen umfasst in dem viele Dinge standardmäßig verankert sind, so dass oft nur wenig Anpassungen notwendig sind.

Folgende Phasen sind in Maven vorgesehen:

archetype

Dient u.a. der Erstellung von Templates, Abhängigkeiten werden aufgelöst und ggf. herunter geladen.

validate

Validierung des Projektes. Ist die Struktur des Projekts ok?

compile

Übersetzen des Codes.

test

Ausführung der automatischen Tests mit Hilfe geeigneter Testframeworks.

package

Die Ergebnisse werden zusammengepackt. Häufig handelt es sich um eine jar Datei.

integration-test

Das erstellte Paket wird an einen anderen Ort kopiert und dort getestet. Dies kann z.B. ein Anwendungsserver sein.

verify

Das erstellte Softwarepaket wird überprüft, um sicher zu stellen, dass die Struktur korrekt ist.

install

Das Softwarepaket wird im lokalen Maven Repository bereitgestellt.

deploy

Das Softwarepaket wird im entfernten Maven Repository bereitgestellt.

Dies kann durch Plugins und Maven Archetypen erweitert und verändert werden, so dass z.B. Docker Container gebaut und verteilt werden können.

Wrapper

Zu Maven gibt es einen Wrapper, der es ermöglicht, dass Maven nicht mehr systemweit auf einem System installiert werden muss. Da unterschiedliche Projekte ggf. unterschiedliche, nicht zueinander kompatible, Versionen von Maven nutzen wollen, ist eine systemweite Installation nicht zielführend.

Stattdessen gibt es ein Script welches die notwendige Version von Maven herunter lädt und innerhalb des Projektverzeichnisses entpackt.

Erzeugung des Wrappers
Es ist möglich, mittels maven ein Wrapper für ein Projekt zu erzeugen. Dazu geht man in das Verzeichnis des Projekts und ruft auf:
„mvn -N io.takari:maven:wrapper“.

Installation

Auch wenn eine Installation nicht notwendig ist, ist dies natürlich jederzeit möglich. Das Tool kann einfach als ZIP File heruntergeladen werden. Eine komplexe Installation ist nicht notwendig. Es reicht, das ZIP an einer beliebigen Stelle zu entpacken.

Dateien und Verzeichnisse

pom.xml

Das Projekt wird in einer pom.xml (POM = Project Object Model) beschrieben, welches sich in dem Projektverzeichnis befindet.

src

Das src Verzeichnis enthält alle Sourcen der Projekts. Diese sind in der Regel aufgeteilt in mehrere Unterordner: src/main für das eigentliche Projekt und src/test für die automatisierten Tests, die nicht mit ausgeliefert werden. Java Quellcode kommt in ein weiteres Unterverzeichnis java und die Ressourcen in das weitere Unterverzeichnis resources.

target

Alle Dateien, die erzeugt werden, werden in dem Verzeichnis target erzeugt. Je nach Art der erzeugten Datei, werden diese in einem entsprechenden Unterverzeichnis angelegt, z.B. target/classes für die class Dateien.

mvnw / mvnw.cmd / .mvn

Scripte und Verzeichnis des Wrappers. Das Skript mvnw kann statt mvn bei Maven Aufrufen verwendet werden. Die Dateien des Wrappers incl. Konfiguration finden sich in .mvn/wrapper.

Beispiel einer pom.xml

03 helloword – maven/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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>de.kneitzel</groupId>
  <artifactId>hellofx</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>hellofx</name>
  <url>https://blog.kneitzel.de</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>    
	<maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.openjfx</groupId>
      <artifactId>javafx-controls</artifactId>
      <version>11.0.2</version>
    </dependency>
    <dependency>
      <groupId>org.openjfx</groupId>
      <artifactId>javafx-fxml</artifactId>
      <version>11.0.2</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-maven-plugin</artifactId>
        <version>0.0.3</version>
        <configuration>
          <mainClass>helloworld.HelloWorld</mainClass>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

Diese Datei kann am Anfang immer so übernommen werden. Folgende Werte sind dabei anzupassen:

groupId / artifactId / version / name / url

Die ersten drei Werte bilden die id des Projekts, welches eindeutig sein sollte. Die übrigen sollten aber auch angepasst werden.

maven.compiler.source / maven.compiler.target

Dies kennzeichnet die Java Version, die wir nutzen wollen. In dem Beispiel ist dies Java 11.

dependencies

Die Abhängigkeiten sind hier einzutragen. Die vorhandenen Libraries auf maven central kann man sich auf https://mvnrepository.com/ ansehen.

build/plugins

Für JavaFX Applikationen wird das javafx-maven-plugin benötigt. Dieses muss eingebunden werden. Weiterhin wird die Klasse mit der main Methode angegeben, damit das plugin die Applikation auch starten kann.

Ausprobieren

Wir können maven einfach direkt mit dem Beispielprojekt ausprobieren. Dazu wechseln wir in das Verzeichnis „03 helloworld – maven“ und geben da einen der folgenden Befehle ein:

  • mvnw clean
    Dies bereinigt das Projekt.
  • mvnw package
    Dies übersetzt das Projekt und baut ein jar File. Dies kann in dem Verzeichnis Target in den diversen Verzeichnissen etwas nachvollzogen werden.
  • mvnw javafx:run
    Dies baut das Projekt und führt die Anwendung danach aus.

Gradle

Übersicht

Gradle ist etwas jünger und entstand 2007. Es hat diverse Dinge von Maven übernommen wie z.B. die Verzeichnisstruktur und das automatische Laden von Abhängigkeiten aus Maven Repositories.

So wie Maven auch, gibt es weitgehende Standards, so dass die Projekt-Konfiguration sehr klein ausfallen kann. Für ein Java Projekt könnte eine Zeile „apply plugin: ‚java’“ ausreichend sein.

Statt einer XML Datei hat Gradle eine eigene Domänenspezifische Sprache für die Konfiguration.

Wrapper

So wie bei Maven existiert auch für Gradle ein Wrapper.

Erzeugung des Wrappers
Es ist möglich, mittels gradle ein Wrapper für ein Projekt zu erzeugen. Dazu geht man in das Verzeichnis des Projekts und ruft auf: „gradle wrapper“.

Installation

Auch wenn eine Installation nicht notwendig ist, ist dies natürlich jederzeit möglich. Das Tool kann einfach als ZIP File heruntergeladen werden. Eine komplexe Installation ist nicht notwendig. Es reicht, das ZIP an einer beliebigen Stelle zu entpacken.

Dateien und Verzeichnisse

build.gradle / settings.gradle / gradle.properties

Das Projekt wird in einer build.gradle beschrieben, welches sich in dem Projektverzeichnis befindet. Die anderen Dateien sind optional.

src

Das src Verzeichnis enthält alle Sourcen der Projekts. Diese sind in der Regel aufgeteilt in mehrere Unterordner: src/main für das eigentliche Projekt und src/test für die automatisierten Tests, die nicht mit ausgeliefert werden. Java Quellcode kommt in ein weiteres Unterverzeichnis java und die Ressourcen in das weitere Unterverzeichnis resources.

gradlew / gradlew.bat / gradle

Scripte und Verzeichnis des Wrappers. Das Skript gradlew kann statt gradle bei Gradle Aufrufen verwendet werden. Die Dateien des Wrappers incl. Konfiguration finden sich in gradle/wrapper.

Beispiel einer build.gradle

plugins {
    id 'application'
    id 'org.openjfx.javafxplugin' version '0.0.8'
}

javafx {
    version = "11.0.2"
    modules = [ 'javafx.controls', 'javafx.fxml' ]
}

group 'de.kneitzel'
version '1.0-SNAPSHOT'

mainClassName = 'helloworld.HelloWorld'

repositories {
    mavenCentral()
}

dependencies {
    compile group: 'org.openjfx', name: 'javafx-controls', version: '11.0.2'
    compile group: 'org.openjfx', name: 'javafx-fxml', version: '11.0.2'
    testCompile group: 'junit', name: 'junit', version: '4.12'
}

Ähnlich wie in Maven findet sich die id der Projekts (group/version – name ist in settings.gradle) und es wird ein javafx Plugin eingebunden.

Die Klasse mit der main Methode wird benannt und die Dependencies aufgelistet.

Zusätzlich ist es aber noch notwendig, die javafx Version sowie die verwendeten Module anzugeben.

Links

Änderungsnachweis

  • 2020-11-02 Überarbeitung Layout
  • 2020-10-30 Erste Veröffentlichung