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

JavaFX: Installation

Eine kleine Übersicht über die notwendigen Abhängigkeiten von JavaFX – das sich zum Glück rein auf die Abhängigkeit zu Java reduzieren lässt, so dass es in diesem Blog nach minimaler Einstufung von JavaFX in erster Linie um die Installation der „richtigen“ Java Version geht.

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

Übersicht über JavaFX

JavaFX ist ein modernes Framework zur Erstellung von graphischen Oberflächen in Java. JavaFX ist eine eigenständige Komponente, die oft nicht im Java Development Kit integriert ist. Bei Oracle / OpenJDK war JavaFX in den Downloads ab Java SE 7 Update 2 bis einschließlich Version 10. Ab Version 11 war dies nicht mehr dabei. Es gibt aber teilweise Anbieter, die auch aktuelle OpenJDK Versionen mit integriertem JavaFX anbieten.

Unterschied zu Swing

Ein wichtiger Unterschied zu Swing ist, dass eine Oberfläche in einem separaten File beschrieben werden kann, statt diese in Java selbst zusammen zu stellen (deklarative Oberfläche im Gegensatz zu der programmierten Oberfläche).

Des Weiteren bietet JavaFX einige technische Aspekte wie z.B. das Binding von Controls an Modelle.

Installation

Da es nicht mehr fester Bestandteil von Java ist, sind manuelle Aktivitäten notwendig. Dazu gibt es zwei Möglichkeiten:

Eigenständige Installation

Es zwei Möglichkeiten für eine Installation. Zum einen kann auf ein JDK zurückgegriffen werden, in dem das JavaFX noch eingebunden ist. Dies ist sehr einfach, aber alle Entwickler am Projekt müssen genau solch eine Installation wählen.

Oder das JavaFX wird eigenständig installiert. Damit dies aber gefunden wird, muss der Ort konfiguriert werden, indem ein Module Path gesetzt wird. Dies erfordert Angaben bei in der Entwicklungsumgebung oder auf der Kommandozeile, die dann auch jeder Entwickler machen muss.

Wenn dieser Weg gewählt wird, dann kann auch ein JDK mit eingebautem JavaFX benutzt werden. Dann ist keine komplexe Konfiguration notwendig, aber die Entwickler sind auf eines der eher raren Angebote angewiesen. Ein solches JDK findet sich u.a. auf https://bell-sw.com/.

Gradle / Maven Build Tool

JavaFX kann als Abhängigkeit in den Build Tools Gradle oder Maven eingetragen werden. Neben den Abhängigkeiten sind auch noch ein paar weitere Einträge notwendig, aber diese sind für alle Entwickler an einem Projekt gleich. Die Entwickler müssen auf ihren Computern keine weiteren Dinge installieren.

Dies ist die Methode, welche ich im Rahmen der JavaFX Serie nutzen werde und euch im Detail vorstellen werde. Dabei werde ich mich vor allem auf Gradle konzentrieren, aber ich werde auch ein Maven Projekt kurz vorstellen.

Hinweis
Bei den Build Tools ist in der Regel keine systemweite Installation notwendig. Statt dessen wird ein sogenannter Wrapper im Projekt integriert, der die korrekte Version des Build Tools im Projektverzeichnis zur Verfügung stellt.

Java Version

Bei der Auswahl der richtigen Java Installation sind ein paar Punkte zu beachten.

JRE vs. JDK

Generell wird bei Java zwischen dem Runtime Environment (JRE) und dem Development Kit (JDK) unterschieden.

Um Java Programme auszuführen wird nur ein JRE benötigt. Das JDK enthält neben einem JRE noch alle Komponenten, die der Entwicklung von Java Programmen dienen, z.B. den Java Compiler.

Wichtig
Wir benötigen somit auf jeden Fall ein JDK.
Achtung
Oracle bietet auf http://java.com ein altes JRE an. Dieses sollte man nicht installieren! Es wird nicht benötigt und neigt eher dazu, Probleme zu bereiten!

Java vs. OpenJDK

Es gibt das Produkt Java von Oracle, welches unter einer speziellen Lizenz von Oracle steht und frei heruntergeladen werden kann. Des Weiteren gibt es das OpenJDK, welches die open source Variante ist und einem vollwertigen Java entspricht und das auch von vielen Firmen aktiv weiterentwickelt wird. (z.B. IBM, Azul, …)

Tipp
Die OpenJDK Lizenz gibt einem deutlich mehr Freiheiten und birgt bei der Nutzung deutlich geringere Risiken einer Lizenzverletzung. Oracle Java lässt sich meist frei nutzen, aber es ist die Lizenz zu prüfen um sicher zu gehen, dass die Nutzung abgedeckt ist und keine kommerzielle Lizenz erworben werden muss!

LTS vs. aktueller Version

Java wird aktiv weiterentwickelt und es kommen regelmäßig neue Versionen. Aktuell sind wir zum Zeitpunkt dieser Bearbeitung bei Java 15. Sobald eine neue Version herausgegeben wurde, wird die alte Version in der Regel nicht mehr aktualisiert. Für Security Updates ist es dann notwendig, dass die neue Version installiert wird – was leider auch zu Kompatibilitätsproblemen führen kann.

Diese Problematik wird gelöst, indem sogenannte Long Time Support (LTS) Version bereitgestellt werden. Diese Versionen werden deutlich länger mit Updates versorgt und verringern die Wahrscheinlichkeit, dass es bei dem Installieren eines neueren Builds der LTS Version zu Problem kommt. Derzeit werden die LTS Version Java 8 und Java 11 bereitgestellt.

Diverse JVM

Es gibt teilweise unterschiedliche Java Virtual Machines (JVM). Die original JVM ist die HotSpot JVM von Oracle. Die Eclipse Foundation hat die OpenJ9 JVM entwickelt, die mehr Wert auf schnelle Startzeit und geringen Speicherverbrauch legt. Bei AdoptOpenJDK kann zwischen den beiden Varianten gewählt werden. Da beide universell einsetzbar sein, ist dies eine Wahl, bei der man nicht viel falsch machen kann.

Empfehlung
Ich rate zu der Version 11 eines OpenJDK. Unter Windows / macOS kann auf ein JDK von https://adoptopenjdk.net zurück gegriffen werden.
Unter Linux wird einfach das OpenJDK aus dem Repository verwendet, z.B. mittels
sudo apt-get install openjdk-11-jdk

Links

  • JavaFX / openjfx Homepage: https://openjfx.io/
  • Java OpenJDK AdoptOpenJDK
  • Entwicklungsumgebungen: JetBrains IntelliJ Community, Eclipse, Netbeans
  • Repository mit Code für diese JavaFX Blog Serie: https://github.com/kneitzel/blog-javafx-series

Änderungsnachweis

  • 2020-11-16 Einfügen YouTube Video
  • 2020-10-29 Komplette Überarbeitung
  • 2020-07-03 Wechsel zu einem Repository für die ganze Serie.