Java8 Eclipse Nutzer will auf Java14 wechseln

sirbender

Top Contributor
Hallo,

ich nutze durchgehend Java8. Ich bin testweise oft schon auf eine hoehere Version gewechselt, aber durch das neue Modulsystem hatte ich dauernd Probleme (Sichtbarkeit von Klassen usw.). Ich brauche das Modulsystem absolut nicht. Meistens habe ich dann frustriert zurück zu Java8 gewechselt wo alles tadellos funktioniert.

Kann ich irgendwie von der Funktionsweise bei Java8 bleiben (also ohne je das Modulsystem in den Projekteigenschaften überhaupt zu sehen) aber trotzdem alle neue Klassen und Language-Features von Java14 geniessen?

Wie muss da das Projektsetup aussehen?

Auch generiere ich mein .classpath und .project oft mit Gradle basierend auf einem von mir geschriebenen build.gradle. Nun macht Gradle komische Sachen abhängig davon ob ich es mit Java8 oder Java14 laufen lasse. D.h. die .classpath/.project Dateien sind anderst und mir wird das Modulsystem irgendwie reingedrückt wenn ich mit Java14 Gradle die Projektdateien generieren lasse.
 
Also je nachdem, was Du machst, kannst Du das Modulsystem ignorieren. Hier ist dann aber wichtig, dass Du keine modul-info.java hast.

Dann hast Du ein sogenanntes "unnamed modul", welches automatisch ein require auf alle anderen Module hat und alles exportiert.
Siehe z.B. https://www.logicbig.com/tutorials/core-java-tutorial/modules/unnamed-modules.html

Damit kannst Du dann erst einmal sehr gut anfangen. Aber früher oder später würde ich Dir schon empfehlen, Dich etwas intensiver mit dem Thema Module zu beschäftigen.

Ich kenne Eclipse nicht, aber ggf. reicht es schon aus, ein module-info.java einfach aus dem Projekt zu löschen.
 
Vielen Dank. Bei Eclipse aendert sich halt sehr vieles in den Projekt-Einstellungen wenn man Java9+ nutzt. Kann sein, dass das nur an module-info.java liegt und dass Gradle die automatisch generiert wenn Java9+ bei Ausfuehrung des Gralde tasks vorliegt. Muss ich mal checken.

Wenn jemand der sich mit Eclipse auskennt noch mehr Insight hat nur her damit 😉
 
Nutze weder Eclipse noch Gradle, aber grundsätzlich geht der Umstieg problemlos (man muss vielleicht ein paar Dependencies updaten).
Das Modulsystem kann man völlig ignorieren, indem man einfach keine module-info erstellt. Soweit ich weiß macht Gradle das auch nicht einfach automatisch (was sowieso nur in Teilen möglich wäre).
 
Hänge mich hier auch Mal rein. Hab da auch so meine Probleme...
Wenn du die konkreten Probleme beschreibst, dann wird man Dir bestimmt helfen können....
Und mag sein, dass Eclipse bei der Erstellung eines neuen Java Projekts entsprechende Dinge erst mal mit anlegt, aber da sollte sonst nicht viel spezielles zu beachten sein.
 
Wenn du die konkreten Probleme beschreibst, dann wird man Dir bestimmt helfen können....
Und mag sein, dass Eclipse bei der Erstellung eines neuen Java Projekts entsprechende Dinge erst mal mit anlegt, aber da sollte sonst nicht viel spezielles zu beachten sein.

ok also im Moment hab ich irgendwie mehrere Baustellen, die mir Probleme machen. Aber die muss ich selbst hinkriegen. Hier gehts erstmal nur um Java Module.

Aber als Hintergrund:
Ich hab ein neues Projekt erstellt. Maven. Kein Multimodule, nur eine kleine App. Mit Eclipse und Maven. Es ist ein JavaFX Projekt. Der Prototyp läuft auch. Aber ich kann noch nicht debuggen. Versuche gerade, das rauszufinden. Da normales Debuggen nicht geht (auch eFXClipse installiert, ändert nix), also war mein Gedanke, daß man das eventuell remote debuggen muß (treibe mich dazu hier rum: https://openjfx.io/openjfx-docs/#IDE-Eclipse). Aber dabei ist mir aufgefallen, um remote debuggen zu können, muß ich erstmal überhaupt die JavaFX Application exportieren können. Wie macht man das lauffähig, gab ja keine Main Methode, nur ne Start Methode einer Klasse die Application extended. Dann hab ich rausgefunden, daß man ne Main Methode machen kann, die dann Application.launch(args); aufrufen kann. Aber irgendwie bin ich halt noch neu in dem ganzen JavaFX und dafür braucht man ein SDK, was als Modul dazu geladen wird usw. Ergo möchte ich jetzt mein Projekt auf Module umstellen.

Aktuelles Problem:
Einfaches Maven Projekt, keine esoterischen Abhängigkeiten. SLF4J und JUnit. Ich hab unter src/main/java eine module-info.java angelegt und da fängt das Rätseln schon an. Ich möchte nix exportieren und hab keine verschiedenen Module. Ich brauch nur ne laufende Config. Muß ich jetzt alle Dependencies als Modules eintragen? Wie find ich die Namen dazu? Jar Namen? Ich hab folgendes probiert:

XML:
module myModule {
    
    //javafx
    requires javafx.controls;
    requires javafx.fxml;
    requires javafx.graphics;
    requires javafx.base;
    
    //log4j
    requires org.apache.logging.log4j.core;
    requires org.apache.logging.log4j;
    requires org.apache.logging.log4j.slf4j;
    requires slf4j.api;
    requires junit;

    //another lib
    requires theotherlib;

}

Das module-info bemängelt er nicht und ich seh keine Errors in der Error view in Eclipse. ABER trotz clean und organize imports wenn ich die Klassen aufmache, zeigt er auf einmal die @FXML Annotation und diverse Imports als rot unterringelt an.

Die Frage:
Bei nem ganz simplen Maven Modul, wie stell ich dann auf Java Module um? Ist es mehr als nur module-info anlegen? Und wo krieg ich die Modulnamen her??
 
Im Endeffekt es es wirklich nur die module-info.java. Aber es müssen alle Module drin sein, man muß einiges seiner eigenen Quellen zumindest bei JavaFX anderen Bibs zur Verfügung stellen usw. Aber da kriegt man Compiler Fehler die einem da helfen. slf4j im Modul war nervig, da mußte ich ne neue Maven Dependency einfügen, die vorher nich nötig war. Nur für die Umstellung auf Jigsaw.
 

Ursprünglich war das die hier:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>

Dann hats sauber kompiliert. Allerdings war ich dann doch noch nicht durch. Das JavaFX Maven Plugin ruft dann jlink auf beim Packen eines Jars (da bin ich grad dran). Da gabs dann noch ein zwei Fehler. Also mußte ich alles wieder rauswerfen.

Ich hab JUnit aktualisieren müssen auf:
<!-- Unit testing -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.6.2</version>
<scope>test</scope>
</dependency>

Die ganzen log4j Dependencies mußten wohl raus. Und ich hab aktuell nur
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.0-alpha1</version>
</dependency>

drin. Diese Module sind schon auf Jigsaw gegangen. Also irgendwie muß man alle seine Dependencies umstellen auf Jigsaw Module, weil das Linken keine "automatic" Module mag...

Das hab ich auch alles gemacht, jetzt baut er mir auch ein Jar. Aber lauffähig is es immer noch nicht:
"no main manifest attribute, in ... jar"

Im Endeffekt spiel ich mich gerade noch mit der Seite hier: https://github.com/javafx-maven-plugin/javafx-maven-plugin
Die ist wohl entscheidend, wenn man ein Maven JavaFX Jigsaw Projekt haben möchte. DENKE ich...

Ich finds halt schade, daß es nach wie vor immer try and error ist. Man muß viel probieren. Ich schau Youtube videos an, lies dokus, frag mich durch. Aber den "einen richtigen weg" scheints selten zu geben.
 
Also irgendwie sollte es im Zusammenspiel mit Eclipse einfacher sein Java14 mit all seinen Sprachfeatures zu nutzen und trotzdem beim Java8 Stil zu bleiben.

Wenn ihr in Eclipse den Projekt-Properties-Dialog aufruft seht ihr, dass lauter Modul-Info Kram hinzugefuegt wird, sobald man eine JDK14 als Laufzeitumgebung nutzt. Eine module-info existiert nicht. Das hat primaer was mit Eclipse zu tun.

Neuerrungen:
1. Sprachfeatures
2. Modulsystem
3. neue APIs

Es gibt einen grossen Unterschied zwischen Sprach-Features wie dem neuen instanceof oder switch und dem Modulsystem. Beide haben primaer erstmal nichts miteinander zu tun. Trotzdem wird einem das Modulsystem aufgezwungen nur weil man die neuen Sprachfeatures nutzen will.

Naja, dann bleib ich erstmal bei Java8. Das ist mir alles zu doof.
 
Die ganzen log4j Dependencies mußten wohl raus.
Dann fehlt doch die slf4j-Implementierung?

Das hab ich auch alles gemacht, jetzt baut er mir auch ein Jar. Aber lauffähig is es immer noch nicht:
"no main manifest attribute, in ... jar"
Mit jlink kommt am Ende auch kein jar raus (ginge auch nicht, weil aktuell nur ein Module pro Jar erlaubt ist), sondern eine komplette Java-Runtime. Irgendwo sollte da ein extra Skript zum Starten erzeugt werden.


Trotzdem wird einem das Modulsystem aufgezwungen nur weil man die neuen Sprachfeatures nutzen will.
Wie wird einem das denn aufgezwungen, wenn keine module-info vorhanden ist? Grad wenn du, wie du oben schreibst, gradle nutzt, sollte der Build völlig problemlos laufen.
 
@sirbender die module-info.java ist das einzige, was du brauchst, um Module zu nutzen. Aber du mußt halt dann auch mal deine Dependencies durchchecken. War etwas Zeit, die ich reinstecken mußte anfangs. Aber dann is es gar nich so schwer. Es ist eine Datei (module-info) und die kann vier verschiedene Arten von Einträgen glaub. exports, opens, ... Da kann man sich einlesen. Probiers mit nem kleinen Testprojekt wo du nur log4j und so was als Dependency drin hast. Und dann wenns geklappt hat, machs mit deinem Projekt

@mrBrown ja das mit jlink war mir alles neu, da ich eben noch nich so lang die neuen Java Versionen nutze. Ich hab jetzt tatsächlich kein Jar File, sondern eine gepackte JDK mit all meinen Dependencies und nem Start Script. Daß das ganze nicht im Jar Format ist, ist schon ungewöhnlich. Ich kann quasi meine Files (class files) gar nicht mehr sehen. Und auch die Dependencies nicht. Aber wenns geht.. 😉

Als nächstes werd ich mir ansehen, wie man Debian Files erstellen kann (geht das schon mit JLink oder braucht man dafür https://quarkus.io/) ? Und dann kommt JPro, um mit JavaFX Webanwendungen zu deployen. Vollgas 😉
 

Zurück
Oben