Wenn ich bei Intelij javafx mit maven importieren will, muss ich das in die pom.xml reintun, aber warum noch in module-info.java?

berserkerdq2

Bekanntes Mitglied
Wenn ich bei Intelij javafx mit maven importieren will, muss ich das in die pom.xml reintun, aber warum noch in module-info.java?

Hab ein altes Projekt gefunden, welches ich ohne Javafx erstellt habe damals. Wollte darauf nun Javafx nutzen, konnte aber die Klassen nicht importieren, dann bin ich in die pom.xml

Und habe 1x das eingegeben:

<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>18.0.2</version>
</dependency>

Danach kam die Fehlermeldung, dass ich in die module-info.java Ergänzungen vornehmen muss, warum? Und was muss da rein?
 
Hast Du denn schon mal versucht herauszufinden, was denn welche Einträge bewirken und was diese machen? Es ist immer hilfreich, wenn man auch etwas versteht, was man da überhaupt macht.

- Was macht denn das Eintragen der Dependency im Maven Projekt?
Da ist die Maven Dokumentation sinnvoll und die findet sich für diesen Aspekt unter https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html

- Was macht denn diese module-info.java?
Da scheint es ja um das Java Modulsystem zu gehen. Dann sollte man sich das einmal in Ruhe ansehen. Und da gibt es viele tolle Erklärungen - meist zur Java 9 Zeit geschrieben, denn da ist es eingeführt worden.

Das einfach einmal lesen und wenn dann noch Fragen sind, dann erläutern wir diese sehr gerne.
 
IntelliJ kann von Haus mit JavaFX umgehen: File - New - Project - "JavaFX" (liefert aber auch eine pom.xml sowie module.info mit JavaFX-Anteilen)
Evtl. könnte es besser sein die Vorlage zu nehmen und das alte Projekt darin zu integrieren.

Welche Ergänzungen in module.info noch vorzunehmen wären, hängt von diversen Faktoren ab. Im Standardfall sieht module.info so aus:
Code:
module com.example.demo1 {
    requires javafx.controls;
    requires javafx.fxml;


    opens com.example.demo1 to javafx.fxml;
    exports com.example.demo1;
}
 
IntelliJ kann von Haus mit JavaFX umgehen: File - New - Project - "JavaFX" (liefert aber auch eine pom.xml sowie module.info mit JavaFX-Anteilen)
Evtl. könnte es besser sein die Vorlage zu nehmen und das alte Projekt darin zu integrieren.
Das JavaFX Projekt von IntelliJ bietet nichts magisches oder so. Es wird ein Maven oder Gradle Projekt erzeugt mit openjfx Plugin.

Da er schon ein Maven Projekt hat, wäre maximal die Frage, ob er das Plugin braucht oder nicht und dann könnte er das Plugin hinzu fügen. Da ist es also nicht notwendig, ein Projekt zu migrieren. Das Plugin ist nett, aber es kann nicht mit dem Fall umgehen, dass einer Abhängigkeit die Modulbeschreibung fehlt. Das ist leider immer noch nicht vom Tisch, wobei ich hoffe, dass es bald verschwunden sein wird, wo jetzt Jakarta EE, Spring und co auch das Modulsystem unterstützen. Bis dahin ist mein Vorschlag immer noch das gute alte Moditect Plugin.

Und in dem module-info.java sind die Module anzugeben, auf die man zugreifen will. Und wenn man fxml nutzen will mit FXMLLoader incl. angegebenen Controller, dann muss das eigene Moful geöffnet werden. Da gibt es dann mehrere Möglichkeiten:
a) das ganze Modul komplett öffnen - dann hat man einfach ein "open module .... " im Kopf.
b) die Namespaces, in denen Controller sind, öffnen also dann in der Modulbeschreiben neben dem "exports my.project.controller;" noch ein "opens my.project.controller".
c) Wenn man aber wirklich das Öffnen minimieren will, dann kann man das auch noch gezielt öffnen. also ein "opens my.project.controller to javafx.fxml;"

Generell geht es aber um eine Anwendung. Da wird das Modul also nicht von außen verwendet. Daher ist hier diese Kapselung (um das handelt es sich halt) schlicht unnötig. Daher ist a) der Weg, den ich empfehlen würde.
 

Zurück
Oben