Eclipse und Gradle

Leider ist das Debuggen bzw. die Anlage einer Debugkonfiguration in Eclipse nicht ganz so trivial, wenn man das Java Modulesystem verwendet und Gradle als Buildsystem einsetzt. Dann liegt die Verantwortung der Dependencies bei Gradle und das Buildship Plugin von Eclipse stellt diese dann in Eclipse zur Verfügung.

Fehlermeldung beim Start

Startet man eine neu angelegte Debugkonfiguration (im Buildpath von ist JUnit 5 nicht angelegt und braucht sie auch nicht), dann erhält man eine Could not run test Fehlermeldung auf der Konsole:

java.lang.IllegalAccessError: class org.junit.platform.launcher.core.LauncherFactory (in unnamed module @0x3f200884) cannot access class org.junit.platform.commons.util.Preconditions (in module org.junit.platform.commons) because module org.junit.platform.commons does not export org.junit.platform.commons.util to unnamed module @0x3f200884

JUnit5 anpassen

Der ist das die Packages org.junit.platform.commons.util und org.junit.platform.commons.logging die ALL-UNNAMED Packages exportieren. Daher muss in den Debugkonfiguration die folgenden VM Parameter anhängen, dann verschwinden die Start Fehlermeldungen unter Eclipse und das Programm kann debugged werden.

--add-exports org.junit.platform.commons/org.junit.platform.commons.util=ALL-UNNAMED --add-exports org.junit.platform.commons/org.junit.platform.commons.logging=ALL-UNNAMED

Nun lässt sich mit Klick auf Debug die Anwendung debuggen.

Gradle Wrapper wirft Excetion

Beim Bauen eines Projektes mit dem Gradle Wrapper in der Verison 4.8 kommt es zu einer Excetion

> java.lang.ExceptionInInitializerError

wenn Gradle Wrapper mit OpenJDK > 9 gestartet wird. Mit JDK 8 und 9 tritt der Fehler nicht auf.

Neue statische Methoden in Java 9

Die Collection in Java 9 haben alle eine statische Methode .of(…) erhalten. Die Anzahl der fixen Parameter ist auf 10 Elemente in der API begrenzt. Heir kommt Map.ofEntries in Spiel.

Hier ein Beispiel:

// Java 8
Set ss =
Collections.unmodifiableSet(
new HashSet<>(
Arrays.asList("a", "b", "c")));

// Java 9
Set ss = Set.of("a", "b", "c"); // unmodifiable

Map.ofEntries

Mit Map.ofEntries() kann man nun eine unbegrenzte Anzahl an Elementen einfügen.

Map<Integer, Integer> reverse20 = Map.ofEntries(
entry(0, 20),
entry(1, 19),
entry(2, 18),
entry(3, 17),
entry(4, 16),
entry(5, 15),
entry(6, 14),
entry(7, 13),
entry(8, 12),
entry(9, 11),
entry(10, 10),
entry(11, 9),
entry(12, 8),
entry(13, 7),
entry(14, 6),
entry(15, 5),
entry(16, 4),
entry(17, 3),
entry(18, 2),
entry(19, 1),
entry(20, 0)
);

Java 9 Module Support für Jool

Jool ist ein Baustein auf dem Jooq aufbaut. Mit der Modularisierung seit Java 9 müssen noch etliche Java Frameworks an das neue Modulsystem angepasst werden. Mit der Version 0.9.13 wird Jool in 2 Versionen ausgeliefert. Die alte für Java 8 hat ein Suffix -java-8 bekommen.

  • Java 8: ArtifactId jool-java-8
  • Java 9: ArtifactId jool

SmartGIT

SmartGIT ist ein umfangreicher GIT Client. SmartGIT ist in Java geschrieben und benötigt bis Version 17.1 Java 8. Hat man ein aktuelles ArchLinux oder Manjaro System, dann ist Java in der 9 an Bord.

Java unter ArchLinux

ArchLinux unterstützt parallele Installation von Java Versionen. Diese befinden sich unter dem Vereichnis /usr/lib/jvm/. Der Pfad zur JRE kann im bin Verzeichnis von SmartGIT angegeben werden. Dazu muss in der smartgit.vm die Variabel jre gesetzt werden.

jre=/usr/lib/jvm/java-8-jdk/jre/

Verwendet man eine ältere Version des Gradle Wrapper, so kann Gradle –> Refresh Gradle Project folgender Fehler in Eclipse angezeigt werden

unbound classpath container: 'JRE System Library [JavaSE-1.9]' in project 'XXX'

Ursache ist das Eclipse keine JRE für Java 9 finden kann. Es hat sich in Eclispe das Namensschema geändert, so dass eine installierte Java 9 JRE nicht erkannt wird bzw. einen anderen Namen bekommt. Updated man den Wrapper, dann wird beim aktualisieren des Projektes die neue Schreibweise [JavaSE-9] in Eclipse eingetragen und somit auch die JRE erkannt und der Fehler unbound classpath container verschwindet.

Gleiche gilt auch für die neueren Versionen von Java 10 und 11.

Siehe Artikel Wrapper aktualisieren

Gradle Wrapper aktualisieren

Der gradle-wrapper kann mit

./gradlew wrapper --gradle-version=4.3.1 --distribution-type=bin

aktualisiert werden. Es wird in der gradle-wrapper.properties die URL angepasst. Die aktuellste Version kann unter Gradle gefunden werden.

Java 9

Ältere Versionen des Wrappers laufen nicht unter Java 9. Wenn auf dem System gradle installiert ist kann mit:

gradle wrapper --gradle-version=4.5.1
gradle --version

der Wrapper auf eine aktuelle Version angehoben werden. Dies funktioniert auch unter Java 9. Die eigentliche Aktualisierung erfolgt erst bei aufruf des Wrappers mit z.B. ./gradlew –version.

Damit man Eclipse unter Java 9 starten kann muss die Konfigurationsdatei eclipse.ini im Root-Verzeichnis der Eclipse Installation angepasst werden. Wegen Projekt Jigsaw sind nicht alle Module exportiert und somit auch nicht sichtbar. Daher müssen die Argumente zum Starten der VM in der .ini angepasst werden.

--add-modules=ALL-SYSTEM

Der Eintrag muss unterhalb von

-vmargs

stehen. Es ist ja schließlich ein Parameter für die virtuelle Maschine.