Maven IntelliJ, Maven und JavaFX + SceneBuilder

LouCyphre

Bekanntes Mitglied
Hallo,

Ich möchte ein neues Projekt starten und das zum ersten mal mit Maven. Darüber hinaus möchte ich JavaFx inclusive SceneBuilder integrieren.

Ich habe bei https://openjfx.io/openjfx-docs/ gelesen, wie ich so ein Maven mit JavaFX Projekt anlegen kann.

Dazu Frage Nr. 1. : Es wird im Link unter non - modular/modular unterschieden. Worauf bezieht sich dieser Unterschied hier und was hat er für Auswirkungen?

Außerdem habe ich bei https://www.jetbrains.com/help/idea/opening-fxml-files-in-javafx-scene-builder.html gelesen wie ich den SceneBuilder in IntelliJ einbinde.

Was mir aufgefallen ist, dass das setup augenscheinlich über new Project -> JavaFX ... beschrieben wird und nicht über eine mögliche Lösungen mit Maven.

Ich könnte es jetzt via trail & error versuchen, aber ich dachte es können bestimmt die erfahrenen Mitglieder hier, mir mögliche Fallstricke im Vorfeld nennen und was es noch im Falle zu beachten gibt!?

Danke schonmal!
Lou
 
M

Mart

Gast
new Project -> JavaFX ... beschrieben wird und nicht über eine mögliche Lösungen mit Maven.
eine umwandlung von einem javafx projekt in ein maven projekt ist immer möglich, ansich nimmst du deine projekt box und legst sie in die maven box rein das ist immer möglich zb in eclipse machst du rechtsklick drauf und wandelst es in ein maven projekt um und fertig
 
K

kneitzel

Gast
Also ich werde da ehrlich gesagt aus dem Link den Du da gefunden hast, nicht ganz schlau. Da wird scheinbar einfach nur ein möglicher Weg genannt, wie man vorgehen kann.

Aber das sind zwei paar Schuhe aus meiner Sicht: Wie Du das Projekt aufbaust ist unabhängig von der SceneBuilder Integration in IntelliJ.

Du kannst also jederzeit einfach ein Maven Projekt mit JavaFX aufbauen. Das ist übrigens immer der Weg, den ich gehe. Neue Projekte erstelle ich eigentlich immer durch manuelle Erstellung einer POM (aus einer existierenden Datei). Das ist am einfachsten und schnellsten.

Und die Einbinsung des SceneBuilders in IntelliJ: Da ist eigentlich nichts zu machen. Du öffnest einfach eine fxml Datei und dann bekommst Du den Inhalt angezeigt. Unten kannst Du dann in Tabs auf die grafische Darstellung wechseln und das ist der SceneBuilder.
Beim ersten Mal läuft das auf einen Fehler - ihm fehlt der SceneBuilder. Oben bekommst Du dann ein Link zur Fehlerbehebung angezeigt -> Anclicken und IntelliJ lädt dann den SceneBuilder selbst runter.
Dann kommt der nächste Fehler: Die JavaFX Runtime fehlt Intellij, aber wieder gleiches Vorgehen: Link oben anklicken und IntelliJ lädt alles runter
==> Fertig, SceneBuilder ist im IntelliJ integriert.

Non Modular vs Modular: Ab Java 9 kennd Java Module. Non Modular bedeutet einfach nur, dass Du von dem System so wenig wie möglich nutzen willst und daher keine module-info.java erzeugst. Dann ist deine Applikation immer noch modular, aber alles ist in dem anonymen Modul.

Das bringt aber diverse Probleme mit sich, daher wäre mein Ratschlag, dass Du Dir das Modulsystem anschaust und damit vertraut wirst.

Ich fand die Getting Started Dokumentation von openjfx.io lange Zeit sehr gut. Aber leider musste ich feststellen, dass dies leider sehr begrenzt ist.Du kannst damit sehr gut starten, aber aus meiner Sicht kommt man früher oder später zu einem Punkt, an dem das nicht ausreicht und man dann das openjfx Plugin raus schmeisst um statt dessen andere Plugins (u.a. moditect) zu verwenden. Zumindest hatte ich hier keine Alternativen gefunden. Aber das ist etwas, auf das man dann kommt, wenn es soweit ist.
 

LouCyphre

Bekanntes Mitglied
in eclipse machst du rechtsklick drauf und wandelst es in ein maven projekt um und fertig
In IntelliJ funktioniert das hoffentlich genau so einfach.
Oben bekommst Du dann ein Link zur Fehlerbehebung angezeigt -> Anclicken und IntelliJ lädt dann den SceneBuilder selbst runter.
Okay super, das klingt simple.
Neue Projekte erstelle ich eigentlich immer durch manuelle Erstellung einer POM (aus einer existierenden Datei). Das ist am einfachsten und schnellsten.
Aber habe ich auch eine existierende POM? 🙃
Ich kann mir gerade nicht genau vorstellen wie du das funktioniert.

Hast du Lust das nochmal kurz auszuführen?

Aber Danke erstmal an euch für die Hinweise!
 
K

kneitzel

Gast
Also wenn Du selbst noch kein solches Projekt hast, dann muss man natürlich bei anderen Projekten "klauen".

Oder man generiert es selbst.

Die drei Möglichkeiten, die ich sehe (und bei denen ich zu der letzten Variante raten würde):

a) Man nutzt die IDE um sich irgend was generieren zu lassen. Geht, aber da kommt oft genug der größte Unsinn bei raus. So ist das Umwandeln eines Eclipse Projekts in ein Maven Projekt ein Garant für Schrott (Sorry, wenn ich das so hart formuliere, aber das meine Meinung. Erläuterung kommt weiter unten!) Aber die meisten IDE bieten auch einen Weg, ein sauberes, neues Maven Projekt zu erstellen. Man kann dann ein Archetyp auswählen und wenn man da org.openjfx auswählt, dann wird man das erhalten, was man auch bei Schritt b) erhalten würde. (Setzt aber voraus, dass man es findet. Bei IntelliJ wird man erschlagen von tausenden möglichen Archetypen....

b) Man generiert einfach mittels Maven ein Projekt. Da wäre z.B. auf https://openjfx.io/openjfx-docs/maven zu finden:
Java:
mvn archetype:generate \
        -DarchetypeGroupId=org.openjfx \
        -DarchetypeArtifactId=javafx-archetype-simple \
        -DarchetypeVersion=0.0.3 \
        -DgroupId=org.openjfx \
        -DartifactId=sample \
        -Dversion=1.0.0 \
        -Djavafx-version=11

Aber da beisst sich die Katze leider auch in den Schwanz, denn um den Befehl ausführen zu können, braucht man eine Maven Installation (die ich eigentlich ablehne bzw. als unnötig ansehe).

c) Man klaut bei anderen Projekten oder woanders. Ich finde hier das Forum z.B. auch eine gute Quelle. Wobei da die Stärke nicht die Erstellung eines POM sondern mehr die Anpassung ist, um Probleme zu lösen.

Ein Ort, bei dem Du "klauen" kannst: https://github.com/kneitzel/blog-javafx-series
Dort findet Du in 03 helloworld - maven ein kleines Maven Projekt für JavaFX, welches Dir ein erstes, minimales Projekt gibt, das das openjfx Plugin nutzt.

Was da auch dabei ist: Der Maven wrapper. Das ist ein Satz von Scripten (Windows und Unix/Mac) das dann aus .mvnw etwas startet, dass Maven herunter lädt und im Homeverzeichnis entpackt. Das ist besser als eine lokale Installation, denn jedes Projekt kann dann genau die Maven Version bekommen, für die es entwickelt wurde.

Das ist ein guter Start. Evtl. wirst Du aber an gewisse Limitierungen stoßen, die dann dazu führen, dass wir das Plugin raus werfen und andere Plugins einbringen (moditect + paar andere). Dazu kommen wir aber erst später - Es macht durchaus Sinn, erst einmal so klein anzufangen.



Nun aber noch zu der Erläuterung, wieso es Müll ist, ein bestehendes Projekt in ein Maven Projekt umzuwandeln (wie es das Eclipse bietet, bei IntelliJ weiss ich es nicht, denn sowas habe ich nie gewollt so dass ich da nie danach geschaut habe!):

Bei Maven gilt: Convention over Configuration

Das bedeutet, dass es für vieles einen Standard Weg gibt. An den sollte man sich halten und schon hat kleine, einfache Projekte, weil vieles nicht konfiguriert werden muss. Das fängt schon damit an, dass Java Files von Ressourcen getrennt sind. Test und Produktion sind getrennt. Du hast also src/main/java für Java Dateien, src/main/resourcen für Resource Dateien. Wenn Du ein Eclipse Projekt hast, dann hast Du einfach nur src. Ist ok, kann man auch mit Maven machen. Dann findet sich halt die Konfiguration, dass die Sourcen in src liegen und die Ressourcen sind auch in src aber alle java Dateien werden ausgeschlossen.
Und wo ist das Problem? Da geht es dann auch wieder zu Dingen, die man beim Clean Code beachtet:
- Auch die POM sollte übersichtlich sein und bleiben
- Man hat nicht das, was man erwartet. Einfaches Beispiel: Man kommt zu einem Projekt, sieht die pom.xml und was erwartet man dann?

Und so einfach wie diese einfache POM erst einmal war: Die Komplexität nimmt ja weiter zu: Denn wenn Du dann irgend etwas weiteres Konfigurierst (irgend welche weiteren Plugins und so), dann zieht sich so eine Anpassung ggf. weiter durch. Viele Dinge sind gerade am Anfang ein "copy & paste". Du willst irgendwas einbauen? -> eine kurze Suche: Plugin xyz macht das und es gibt sofort ein kleines Beispiel wie das anzuwenden ist.....

Das erklärt dann auch die typischen Threads: "Bei mir funktioniert etwas nicht. Meine POM ist <riesige POM voll mit solchen dubiosen Konfigurationen>" und dann fast immer die Antwort: "WTF, räum die POM auf, nimm am besten diese hier: <kurze, übersichtliche POM>" (Und das nicht von mir, weil ich hier eine seltsame Position vertrete sondern das kommt von Anderen hier :) )

Daher: Aus Eclipse Projekt ein Maven Projekt machen: Ja, jederzeit. Aber nicht mit einem Kopfdruck sondern in dem man eine saubere POM erstellt und die Dateien entsprechend verschiebt.

Edit: Das POM in dem blog von mir ist etwas alt und entspricht nicht dem Aufbau, wie ich ihn derzeit vertreten und vorschlagen würde. Aber es ist ein valider Anfang so wie er auch vermutlich erzeugt würde. Ich ziehe "Literale" aber in die Properties, so dass ich dann z.B. die ganzen Versionen und so in den Properties finde.
 

LouCyphre

Bekanntes Mitglied
@kneitzel
Danke dir für die ausführliche Antwort.

Ich hab nur noch ein kleines Noob Problem bevor ich anfangen kann es mal zu testen, bzgl. GitHub

Ich wollte mir gerade das Maven Projekt von dir ziehen. Allerdings habe ich es bisher immer so gemacht, dass ich über den grünen Code Button die URL kopiert habe und so in IntelliJ importiert habe. Wenn ich das aber jetzt bei deinem Repo mache, dann lade ich ja das komplette Projekt inklusive den ganzen anderen Kram ( Gradle etc.).

Wie kann ich nur das 03 helloworld - maven ziehen?
 
K

kneitzel

Gast
Git unterstützt das nicht. Github unterstützt aber auch svn und mittels svn wäre dies möglich:
svn co https://github.com/kneitzel/blog-javafx-series/trunk/03%20helloworld%20-%20maven
 
K

kneitzel

Gast
Das wäre ein Kommandozeilen-Aufruf so Du svn installiert hast.

Dann bekommst Du ein Verzeichnis mit dem Projekt und dieses kannst Du in IntelliJ öffnen.
 

LouCyphre

Bekanntes Mitglied
Okay. ich habs jetzt erstmal so gemacht, dass ich doch das komplette Repo geladen habe und dann aus dem maven project ein neues erstellt habe.
Hab gerade keine Lust mich den Git Kram auseinander zusetzen.

Soweit hat deine Erklärung von #3 problemlos geklappt.
Danke!

Ich werd jetzt erstmal bisschen rumtesten und versuchen mich zurecht zu finden.

Das einzige was ich an der Stelle noch kurz fragen will, weil ich die Verzeichnisstruktur nicht gleich verhauen will.

Ich habe das test.fxml einfach über new -> FMXL File in dem helloworld Unterordner erzeugt. Das sollte doch aber eigentlich in die Ressourcen rein, nech? Allerdings gibts bei mir gar kein Ressourcen Ordner. Was muss ich tun, damits diesen gibt?
 
K

kneitzel

Gast
Das Problem bei git ist, dass leere Verzeichnisse nicht vorgesehen sind.

In src/main kannst du einfach einen Ordner resources anlegen. (Und dann auch helloworld wenn Du die Struktur nicht verändern willst.)
 

LouCyphre

Bekanntes Mitglied
Hallo,

@kneitzel ich habe mal auf deinem Blog https://blog.kneitzel.de/2020/06/29/javafx-mvvm/ den Beitrag zu MVVM angesehen. Und werde das versuchen als Gerüst nachzuahmen. Ich habe auch die verlinkten Dokus gelesen.

Ich habe jetzt nochmal ein paar Fragen dazu:

Frage 2 - 4 beziehen sich alle auf https://github.com/kneitzel/blog-ja.../src/main/java/helloworld/HelloWorldView.java

1. Du schreibst zu den Abhängigkeiten, dass du da die mvvmFx Lib benutzt und gibst auch einen Satz ( compile group: 'de.saxsys', name: 'mvvmfx', version: '1.8.0' ) an der in die build.gradle dependency Block rein soll. Bezieht sich die Versions Nr. auf die Java Version? und Wo finde ich den dependency Block bei maven?

2. Die Annotationen, vor allem das @InjectViewModel, geben ja einfach eine Referenz auf das Objekt. Also ist das dann quasi in dem Falle ein " Import" des models?

3. Die @FXML Annotationen sind quasi die Bekanntmachung an die FXML/GUI, ja?

4. Was hat es mit der initalize() Methode aufsich, bzw. was soll das mit der URL? das versteh ich überhaupt nicht
 
K

kneitzel

Gast
zu 1. Nein, das ist die Version der Abhängigkeit. https://mvnrepository.com/artifact/de.saxsys/mvvmfx/1.8.0 zeigt die Abhängigkeit und auch den Dependency Block.

zu 2. Die Annotation sagt der genutzten mvvmfx Library, dass in diese Variable das ViewModel hinein soll.

zu 3. Die @FXML Annotations kommen vom FXMLLoader. Das ist ein Hinweis, dass in die Variable die Referenz von dem Element mit der fx:id mit dem Namen der Variablen.

zu 4. Es gibt einen Lifecycle mit mehreren Phasen. Den Konstruktor kennst Du ja bestimmt von Java. Das wird aber direkt nach der Erstellung aufgerufen und das reicht nicht. Denn die Klassen, die die Instanz erzeugen, machen ja noch weitere Dinge: Z.B. das Setzen der Variablen mit @FXML Annotation. Nun willst Du aber ggf. noch Dinge machen, nachdem diese Initialisierung von Außen erfolgt ist: Das ist die initialize Methode.
Und in dem Beispiel siehst Du, dass da einfach das Binding gesetzt wird.

Falls Du da noch paar weitere Abhängigkeiten einbaust erwischst Du evtl. noch Abhängigkeiten, die keine Moduldefinition haben. Da werde ich dir vermutlich noch eine neue POM ohne openjfx Plugin und mit moditect & co fertig machen dürfen. Ich bin so nach und nach dabei, das alles in einer Art Maven Referenz zusammen zu tragen, aber ich komme irgendwie nicht wirklich viel zu der Dokumentation.
 

LouCyphre

Bekanntes Mitglied
zu 1. Nein, das ist die Version der Abhängigkeit. https://mvnrepository.com/artifact/de.saxsys/mvvmfx/1.8.0 zeigt die Abhängigkeit und auch den Dependency Block.
Das wird dann einfach in die POM in den dependencies Block reingehauen, wenn ich das jetzt richtig sehe? Also :

XML:
  <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>
    <!-- hier -->
    <dependency>
     <groupId>de.saxsys</groupId>
     <artifactId>mvvmfx</artifactId>
     <version>1.8.0</version>
     <scope>provided</scope>
    </dependency>
    <!-- hier -->
  </dependencies>
Falls Du da noch paar weitere Abhängigkeiten einbaust erwischst Du evtl. noch Abhängigkeiten, die keine Moduldefinition haben. Da werde ich dir vermutlich noch eine neue POM ohne openjfx Plugin und mit moditect & co fertig machen dürfen. Ich bin so nach und nach dabei, das alles in einer Art Maven Referenz zusammen zu tragen, aber ich komme irgendwie nicht wirklich viel zu der Dokumentation.
Es gibt hier natürlich keine Pflicht! der Hinweis auf das moditect plugin ist ja schon ein guter Hinweis und falls es dann Probleme gibt, kann ich ja nochmal schauen ob ich es hinbekomme
 
K

kneitzel

Gast
Ja, das ist soweit richtig. Wobei ich mich gerade wundere: Das provided würde da aus meiner Sicht nicht hin gehören. Warum das so aufgeführt wurde, kann ich gerade nicht nachvollziehen.

Dieder Hinweis bedeutet, dass die Abhängigkeit nicht mit der Applikation mitgegeben werden soll. Die Laufzeitumgebung wird dies schon bereit stellen. Nur eben das ist so eigentlich nicht der Fall. Daher vorsichtshalber das <scope>provided</scope> raus löschen.

Bezüglich Moditect Plugin - da finden sich hier im Forum bestimmt auch Threads. Auch meine Varianten damit gehen streng genommen auf ein Beispiel zurück, dass @mrBrown einmal hier im Forum bereit gestellt hat als GitHub Link.
 

LouCyphre

Bekanntes Mitglied
Hallo,

ich brauche mal bitte ein kleines troubleshooting.
Reminder: ich hatte aus @kneitzel s github das maven Projekt verwendet. Dazu hab ich ein paar Probleme die sich im wesentlichen dazu zusammen fassen lassen, dass ich

1. Probleme mit dem Refactoring der files habe. Soll heißen, ich wollte einfach die HelloWorld.java umbenennen. Jetzt meckert aber IntelliJ rum, dass es die Klasse nicht mehr findet, weil Sie natürlich in der POM noch die alten Namen haben.

[CODE lang="fxml" title="kneitzels POM"]<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>http://maven.apache.org</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>

<organization>
<!-- Used as the 'Vendor' for JNLP generation -->
<name>K. Neitzel Blog</name>
</organization>

<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>
<dependency>
<groupId>de.saxsys</groupId>
<artifactId>mvvmfx</artifactId>
<version>1.8.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<release>11</release>
</configuration>
</plugin>
<plugin>
<groupId>org.openjfx</groupId>
<artifactId>javafx-maven-plugin</artifactId>
<version>0.0.5</version>
<configuration>
<release>11</release>
<jlinkImageName>hellofx</jlinkImageName>
<launcher>hellofx</launcher>
<mainClass>HelloWorld.main/helloworld.HelloWorld</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>
[/CODE]

Dann dachte ich mir, naja ändere ich mal alles um was mit hellofx etc. zutun hat.
Dazu die erste Frage : was bringen die ganzen ID Bezeichner hier?

und warum funktioniert es nicht, wenn ich

Java:
 <mainClass>HelloWorld.main/helloworld.HelloWorld</mainClass>
 
 <mainClass>Anders.main/anders.Anders</mainClass>

umändere?

Liegt wahrscheinlich an dem Namespace, was mich zur nächsten Frage bringt :

Ich habe jetzt in das helloworld package noch zwei andere Klassen reingehauen. Liegen bei IntelliJ am gleichen Ort wie HelloWorld.java
werden, aber rot angezeigt. Es meckert nichts und kompiliert auch noch, aber es scheint ja nicht korrekt zu sein?

Zusatzfrage:

Wenn ich eine neue Datei ins Projekt einfüge, werde ich immer gefragt ob ich das in kneitzels Github laden will. Wie kann ich das Projekt generell von kneitzels Github entkoppeln?
 
K

kneitzel

Gast
Da wäre erst einmal wichtig, das Du die dort angegebenen Daten richtig verstehst. Die mainClass Property enthält den Namen des Moduls (Also das, was in module-info.java als Name vergeben wird) und dann nach dem / das Package mit der Klasse.

Daher einmal prüfen: Was steht in der module-info.java? Und in welcher Klasse ist Deine main Methode?

Ich habe in neueren pom.xml das auch alles in die Properties gezogen, so dass da innerhalb der weiteren Struktur keine weiteren Dinge angegeben werden müssen. Das macht dann das eine oder andere einfacher.

Ich habe eine kleine JavaFX Anwendung "FileBrowser", welche ich zwar nicht wirklich weiter entwickle, da ich die App nicht mehr brauche, aber es dient mir als JavaFX Spielwiese was die POM angeht.

Da steckt jetzt einiges mehr mit drin, als für Dich wichtig ist. Aber man kann sehr schön erkennen, dass da sehr viel in die Properties gewandert ist.

Das ist dann auch eine Variante ohne das openjfx Plugin - statt dessen wird moditect genutzt um ein paar fehlenden Abhängigkeiten eine Modul-Definition unter zu schieben.

Und ich sehe gerade, dass da ppar typische Dinge fehlen:
a) Ich nutze eigentlich ein Plugin, dass beim Start nach neuen Versionen schaut und auf diese hinweist.
b) Es fehlt die statische Codeanalyse mittels PMD
c) Ich lege eigentlich auch noch minimale Versionen von maven fest und so ..

Also immer noch nicht das, was ich einem Kollegen geben würde aber es ist ein vernünftiger Anfang.

XML:
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>de.kneitzel</groupId>
    <artifactId>FileBrowser</artifactId>
    <version>1.0-SNAPSHOT</version>

    <organization>
        <!-- Used as the 'Vendor' for JNLP generation -->
        <name>K. Neitzel</name>
    </organization>

    <properties>
        <!-- Application Properties -->
        <link.name>${project.artifactId}</link.name>
        <launcher>${project.artifactId}</launcher>
        <appName>${project.artifactId}</appName>
        <main.module>FileBrowser</main.module>
        <main.class>de.kneitzel.filebrowser.App</main.class>

        <!-- Dependency Versions -->
        <java.version>16</java.version>
        <javafx.version>16</javafx.version>
        <lombok.version>1.18.20</lombok.version>
        <mvvmfx.version>1.8.0</mvvmfx.version>
        <typetools.version>0.6.3</typetools.version>
        <doc-annotations.version>0.2</doc-annotations.version>
        <slf4j.version>1.7.32</slf4j.version>
        <junit.version>5.7.2</junit.version>

        <!-- Plugin Versions -->
        <maven.compiler.plugin>3.8.1</maven.compiler.plugin>
        <maven.dependency.plugin>3.1.2</maven.dependency.plugin>
        <maven.surfire.plugin>3.0.0-M5</maven.surfire.plugin>
        <moditect.maven.plugin>1.0.0.RC1</moditect.maven.plugin>
        <jpackage.maven.plugin>0.1.2</jpackage.maven.plugin>

        <!-- other properties -->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>${java.version}</maven.compiler.source>
        <maven.compiler.target>${java.version}</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-base</artifactId>
            <version>${javafx.version}</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-graphics</artifactId>
            <version>${javafx.version}</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>${javafx.version}</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>${javafx.version}</version>
        </dependency>

        <dependency>
            <groupId>de.saxsys</groupId>
            <artifactId>mvvmfx</artifactId>
            <version>${mvvmfx.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>net.jodah</groupId>
            <artifactId>typetools</artifactId>
            <version>${typetools.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>${maven.compiler.plugin}</version>
                <configuration>
                    <release>${java.version}</release>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>${lombok.version}</version>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>${maven.surfire.plugin}</version>
                <configuration>
                    <testFailureIgnore>true</testFailureIgnore>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>${maven.dependency.plugin}</version>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/modules</outputDirectory>
                            <overWriteReleases>false</overWriteReleases>
                            <overWriteSnapshots>false</overWriteSnapshots>
                            <overWriteIfNewer>true</overWriteIfNewer>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.moditect</groupId>
                <artifactId>moditect-maven-plugin</artifactId>
                <version>${moditect.maven.plugin}</version>
                <executions>
                    <execution>
                        <id>add-module-info-to-dependencies</id>
                        <phase>package</phase>
                        <configuration>
                            <outputDirectory>${project.build.directory}/modules</outputDirectory>
                            <overwriteExistingFiles>true</overwriteExistingFiles>
                            <modules>
                                <module>
                                    <artifact>
                                        <groupId>de.saxsys</groupId>
                                        <artifactId>mvvmfx</artifactId>
                                    </artifact>
                                    <moduleInfo>
                                        <name>de.saxsys.mvvmfx</name>
                                    </moduleInfo>
                                </module>
                                <module>
                                    <artifact>
                                        <groupId>net.jodah</groupId>
                                        <artifactId>typetools</artifactId>
                                    </artifact>
                                    <moduleInfo>
                                        <name>typetools</name>
                                    </moduleInfo>
                                </module>
                                <module>
                                    <artifact>
                                        <groupId>eu.lestard</groupId>
                                        <artifactId>doc-annotations</artifactId>
                                    </artifact>
                                    <moduleInfo>
                                        <name>docannotations</name>
                                    </moduleInfo>
                                </module>
                                <module>
                                    <artifact>
                                        <groupId>org.slf4j</groupId>
                                        <artifactId>slf4j-api</artifactId>
                                    </artifact>
                                    <moduleInfo>
                                        <name>org.slf4j.slf4japi</name>
                                    </moduleInfo>
                                </module>
                            </modules>

                            <module>
                                <mainClass>${main.class}</mainClass>
                                <moduleInfoFile>${project.build.sourceDirectory}/module-info.java</moduleInfoFile>
                            </module>

                            <jdepsExtraArgs>
                                --ignore-missing-deps
                            </jdepsExtraArgs>
                        </configuration>
                        <goals>
                            <goal>add-module-info</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>create-runtime-image</id>
                        <phase>package</phase>
                        <goals>
                            <goal>create-runtime-image</goal>
                        </goals>
                        <configuration>
                            <modulePath>
                                <path>${project.build.directory}/modules</path>
                            </modulePath>
                            <modules>
                                <module>${main.module}</module>
                            </modules>
                            <launcher>
                                <name>${launcher}</name>
                                <module>${main.module}</module>
                            </launcher>
                            <compression>2</compression>
                            <stripDebug>true</stripDebug>
                            <outputDirectory>${project.build.directory}/jlink-image</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>com.github.akman</groupId>
                <artifactId>jpackage-maven-plugin</artifactId>
                <version>${jpackage.maven.plugin}</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>jpackage</goal>
                        </goals>
                        <configuration>
                            <name>${appName}</name>
                            <type>IMAGE</type>
                            <runtimeimage>${project.build.directory}/jlink-image</runtimeimage>
                            <module>${main.module}/${main.class}</module>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

Evtl. noch ein Wort zu der moditect Variante: Moditect kann eine kleine Diva sein - wenn da mit den Modulen irgendwas nicht stimmig ist, dann neigt es dazu, bei den JavaFX Libraries rumzumotzen. javafx.xyzEMPTY hat keine Modul-info oder so ähnlich. Hintergrund dabei ist, dass die javafx Abhängigkeiten aus mehreren jar Dateien besteht:
javafx-xyz-version.jar --> Leeres jar hat nur ein Manifest das es als javafx.xyzEMPTY ausweist.
javafx-xyz-version-OS.jar -> jar für das jeweilige OS wobei OS linux, windows oder mac sein kann.

Das ist der einzige Grund, wieso ich nicht zu Moditect rate solange es nicht notwendig ist. (Mit dem mvvmfx wurde es leider notwendig bei mir.)

Ich hoffe, ich konnte Dir zum einen Deine Frage beantworten und Dir zum anderen aufzeigen, wie man sowas ggf. besser Strukturieren kann, damit man nicht zig Stellen in der POM anpassen muss bei Änderungen.
 

LouCyphre

Bekanntes Mitglied
He,

Danke erstmal. Die Struktur von deiner POM aus dem letzten Post ist wirklich besser. Ich werde es später mal versuchen anzupassen. Ich habs jetzt auch geschafft zu kompilieren nachdem ich alles umbenannt habe.

Allerdings sind die neu eingefügten Klassen und Interfaces immer noch rot dargestellt. Das kann ich mir auch echt nicht erklären. alle haben das gleiche package.

Das ist die module info
Java:
module QuizApp.main {
    requires javafx.controls;
    requires javafx.fxml;
    requires lombok;
    exports quiz;
}

eigentlich sollte alles passen. Oder ist das gar keine Warnung?

Wenn ich eine neue Datei ins Projekt einfüge, werde ich immer gefragt ob ich das in kneitzels Github laden will. Wie kann ich das Projekt generell von kneitzels Github entkoppeln?
Hat dazu moch wer ne Idee? Ich hab gestern Abend mal bisschen recherchiert, aber bin nicht wirklich fündig geworden. Das einzige was ein bisschen Sinn macht ist den branch zu mergen, aber da sollte letztlich das Projekt immer noch nicht von kneitzel gelöst sein. ?
 
K

kneitzel

Gast
Also bezüglich der Klassen, die rot dargestellt werden: Was genau wird rot dargestellt? Die Dateinamen werden in roter Schrift dargestellt? Das wird vermutlich sein, weil die Datei nicht in git hinzugefügt wurde.

Ansonsten einfach einmal genau beschreiben, was das Problem ist.

Wenn Du etwas per git herunter geladen hast, dann kannst Du einfach das .git Verzeichnis löschen. Dann wäre das Verzeichnis kein git Repository.

Also einfach in IntelliJ schließen, dann .git Verzeichnis löschen. Damit IntelliJ beim erneuten Öffnen nicht meckert, entweder:
- .idea Verzeichnis und alle *.iml Dateien löschen -> Dann wird IntelliJ das Maven Projekt neu laden und alles neu erzeugen.
- .idea/vcs.xml löschen - da drin speichert IntelliJ die Information, dass das Projekt in git verwaltet wird.
Aber wenn Du da nichts machst, dann wird da IntelliJ einmal meckern und du kannst es einmal bestätigen meine ich ...
 

LouCyphre

Bekanntes Mitglied
Wenn Du etwas per git herunter geladen hast, dann kannst Du einfach das .git Verzeichnis löschen. Dann wäre das Verzeichnis kein git Repository.

Also einfach in IntelliJ schließen, dann .git Verzeichnis löschen. Damit IntelliJ beim erneuten Öffnen nicht meckert, entweder:
- .idea Verzeichnis und alle *.iml Dateien löschen -> Dann wird IntelliJ das Maven Projekt neu laden und alles neu erzeugen.
- .idea/vcs.xml löschen - da drin speichert IntelliJ die Information, dass das Projekt in git verwaltet wird.
Aber wenn Du da nichts machst, dann wird da IntelliJ einmal meckern und du kannst es einmal bestätigen meine ich ...
jap. das hat geklappt. Danke.

ICh werde jetzt mal langsam mit der View und dem ViewModel anfangen. Nur nochmal kurz dazu.
Ich habe ja jetzt mehrere Models, also die Card und Player Klasse und das Quiz interface.
Sollte man dann für Player und Card jeweils View und Viewmodel schreiben oder das zu einer verbinden?
gibts da ne best practise?
 
K

kneitzel

Gast
Also Model hast Du das Model der Applikation, also Card, Player, Quiz, ...

Wenn Du nun ein Fenster hast, hast Du für dieses Fenster dann ein ViewModel, d.h. das hält die Daten, die Du für das Fenster benötigst in der Form, wie Du es brauchst. Und die View hast Du dann natürlich auch für ein Fenster.

Wenn Du es nun weiter unterteilen möchtest, dann kannst Du da view / viewmodel auch für Teile schreiben. Das kann einen Bezug zu einem Model haben aber muss nicht. Das kann z.B. interessant sein für Dinge, die Du regelmäßig an diversen Stellen benötigst. Das würde ich aber am Anfang nicht machen. Das kannst Du machen, wenn Du mehr Erfahrung hast und dein Projekt größer wird.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Maven IntelliJ + Maven + JavaFX Tools - Maven, Gradle, Ant & mehr 2
thor_norsk Maven Build Failed: kann nicht von start.spring.io generiertes Projekt auf IntelliJ IDE starten Tools - Maven, Gradle, Ant & mehr 8
N Maven Intellij Maven Projekt erstell keine src Tools - Maven, Gradle, Ant & mehr 4
B Maven und Intellij Tools - Maven, Gradle, Ant & mehr 24
P Maven & Intellij Modul kann nicht aufgelöst werden Tools - Maven, Gradle, Ant & mehr 12
R IntelliJ IDEA und Git - Problem Tools - Maven, Gradle, Ant & mehr 2
Oneixee5 Maven deploy - per SSH Tools - Maven, Gradle, Ant & mehr 6
H Maven kein Hauptmanifestattribut Tools - Maven, Gradle, Ant & mehr 10
M Programm mit Maven erstellen und starten samt Abhängigkeiten Tools - Maven, Gradle, Ant & mehr 27
D Interne Dependencies in Maven Tools - Maven, Gradle, Ant & mehr 51
J log4j2 mit Hibernate über Maven Tools - Maven, Gradle, Ant & mehr 10
H Maven JUnit5 Tests werden ignoriert Tools - Maven, Gradle, Ant & mehr 5
thor_norsk Maven Tools - Maven, Gradle, Ant & mehr 32
ExceptionOfExpectation Maven Build Failed: kann nicht von start.spring.io generiertes Projekt auf Eclipse starten Tools - Maven, Gradle, Ant & mehr 20
Ich kann Maven nicht als UmgebungsVariable hinzufügen Tools - Maven, Gradle, Ant & mehr 2
F Maven JAR Plugin Probleme Tools - Maven, Gradle, Ant & mehr 4
W Was "braucht" man denn alles? Maven, Ant, Git, ... Tools - Maven, Gradle, Ant & mehr 21
N Fehler beim Imgui mit Maven Tools - Maven, Gradle, Ant & mehr 7
M Spring Boot Maven pom.xml-Eintrag Tools - Maven, Gradle, Ant & mehr 17
Encera JavaFX und Maven funktioniert nicht Tools - Maven, Gradle, Ant & mehr 1
B maven multi module Projekt und unnötige/zusätzliche Leerzeilen Tools - Maven, Gradle, Ant & mehr 4
J Maven Konfusion Tools - Maven, Gradle, Ant & mehr 7
Tippster Maven Sqlite integrieren (Eclipse, Maven) Tools - Maven, Gradle, Ant & mehr 4
T Image kreieren mit Maven bei JavaFX und nicht modularen Jars Tools - Maven, Gradle, Ant & mehr 12
T JSON Dependencies in Maven Tools - Maven, Gradle, Ant & mehr 7
T JavaFX, Jar über Maven kreieren Tools - Maven, Gradle, Ant & mehr 2
Encera Libraries Maven Projekt hinzufügen Tools - Maven, Gradle, Ant & mehr 9
Oneixee5 Maven Phase Tools - Maven, Gradle, Ant & mehr 3
Robertop maven copy-resources nicht in WAR Datei Tools - Maven, Gradle, Ant & mehr 2
T Maven: Probleme beim Einbinden der Dependencies Tools - Maven, Gradle, Ant & mehr 9
M Mit Maven eine jar Datei bauen ohne irgendeine main Methode Tools - Maven, Gradle, Ant & mehr 1
M Mit Maven eine jar Datei Bauen ohne irgendeine main Methode Tools - Maven, Gradle, Ant & mehr 18
H Maven Maven: <mainClass>NAME?</mainClass> Tools - Maven, Gradle, Ant & mehr 13
H Maven maven-source-plugin is missing Tools - Maven, Gradle, Ant & mehr 5
M Missing Artifact on selbst gehostestes Maven Paket Tools - Maven, Gradle, Ant & mehr 8
M Error code 409 maven Tools - Maven, Gradle, Ant & mehr 5
M github + maven Fehler beim repository erstellen Tools - Maven, Gradle, Ant & mehr 1
M durch Maven wird "var" nicht gefunden Tools - Maven, Gradle, Ant & mehr 4
LimDul Maven Einzelne Unit Tests in Maven Builds skippen Tools - Maven, Gradle, Ant & mehr 3
M Maven jpackage-image wird nicht gefunden Tools - Maven, Gradle, Ant & mehr 22
M javafx wird in einem alten programm nicht bei maven gefunden Tools - Maven, Gradle, Ant & mehr 15
von Spotz Maven und Spring: "Add to classpath" ? Tools - Maven, Gradle, Ant & mehr 29
Kirby.exe Projekt mit Maven kompilieren Tools - Maven, Gradle, Ant & mehr 13
P Maven Projekt Abhängigkeiten auf bekante Schwachstellen prüfen Tools - Maven, Gradle, Ant & mehr 4
H Maven dependency Problem ? Tools - Maven, Gradle, Ant & mehr 23
P Maven Test werden nicht ausgeführt . Junit . Maven . Surefire . Eclipse Tools - Maven, Gradle, Ant & mehr 12
yakazuqi Maven Eigene API mit Maven einbinden Tools - Maven, Gradle, Ant & mehr 1
M Was ist besser für den Anfang, Maven oder Gradle? Tools - Maven, Gradle, Ant & mehr 6
P Maven Wie die Maven Project version in JSP page verwenden? Tools - Maven, Gradle, Ant & mehr 2
C Maven Multi-Module Projekt Tools - Maven, Gradle, Ant & mehr 2
T Maven Warnings/Fehlermeldungen Tools - Maven, Gradle, Ant & mehr 12
T Maven und Datenbank(treiber) Tools - Maven, Gradle, Ant & mehr 13
T Maven Runnable Jar Tools - Maven, Gradle, Ant & mehr 5
T Grundlagen Maven und Git/Github Tools - Maven, Gradle, Ant & mehr 2
LimDul Maven Maven Surefire Plugin - Warnings upgrade Tools - Maven, Gradle, Ant & mehr 2
G Maven upload Tools - Maven, Gradle, Ant & mehr 0
K Maven - Parent oder Dependency? Tools - Maven, Gradle, Ant & mehr 5
B Maven Maven deploy Tools - Maven, Gradle, Ant & mehr 4
H Jenkins keine Tests gefunden - aber in Maven Tools - Maven, Gradle, Ant & mehr 30
P Mit Maven einen spezifischen Branch nach Tag-Parameter erstellen (in Jenkins-Job) Tools - Maven, Gradle, Ant & mehr 3
P Nur einen Teilbaum in Maven releasen? Tools - Maven, Gradle, Ant & mehr 7
D Cannot invoke "javafx.scene.control.MenuButton.getScene()" nach konvertierung zu maven Tools - Maven, Gradle, Ant & mehr 3
H Maven - keine Durchführung von Tests Tools - Maven, Gradle, Ant & mehr 12
H Jenkins - maven-jar-plugin - kein jar-file Tools - Maven, Gradle, Ant & mehr 38
P JavaFX jar mit Maven Tools - Maven, Gradle, Ant & mehr 9
H Eclipse JUnit erzeugt Fehler im Maven-Test Tools - Maven, Gradle, Ant & mehr 1
H Maven Anfängerproblem - No plugin found for prefix 'archetype' in the current project and in the plugin groups Tools - Maven, Gradle, Ant & mehr 25
sascha-sphw Maven vs Gradle Tools - Maven, Gradle, Ant & mehr 24
D Maven Maven und die Build-Geschwindigkeit Tools - Maven, Gradle, Ant & mehr 11
J Maven Mit Maven eine ZIP Datei erstellen Tools - Maven, Gradle, Ant & mehr 0
K Maven install schlägt fehl Tools - Maven, Gradle, Ant & mehr 10
I Problem: Maven import extern Lib Tools - Maven, Gradle, Ant & mehr 3
Tom299 Maven Maven funktioniert nach Installation nicht Tools - Maven, Gradle, Ant & mehr 1
I Maven Interface hinzugefügt - Error Tools - Maven, Gradle, Ant & mehr 1
M Verständnisfrage Maven Tools - Maven, Gradle, Ant & mehr 2
S Maven installieren - "Befehl wurde nicht gefunden" Tools - Maven, Gradle, Ant & mehr 1
E Maven: Wie Abhängigkeiten analysieren? Tools - Maven, Gradle, Ant & mehr 0
E Maven Maven distributionManagement Vererbung in child POM Tools - Maven, Gradle, Ant & mehr 8
P Maven Parent- Child POMs Tools - Maven, Gradle, Ant & mehr 13
E Release Kandidaten mit Maven bauen Tools - Maven, Gradle, Ant & mehr 4
C Orderstruktur bei Libarys - Wie mit Ant oder Maven lösen? Tools - Maven, Gradle, Ant & mehr 0
G Maven, finde Dependency nicht... Tools - Maven, Gradle, Ant & mehr 2
G Maven Continious Integration mit Jenkins, Maven und Nexus - wie richtig? Tools - Maven, Gradle, Ant & mehr 1
P Maven Parent und Child Poms - dependencies Tools - Maven, Gradle, Ant & mehr 1
reibi Maven Maven + Eclipse Tools - Maven, Gradle, Ant & mehr 0
P Maven add resource Tools - Maven, Gradle, Ant & mehr 0
D [Maven Pluginentwicklung] - Plugin das nur auf Parent pom läuft Tools - Maven, Gradle, Ant & mehr 0
S Maven Maven und Auflösen von JSF EL Tools - Maven, Gradle, Ant & mehr 5
H Maven HSQLDB in den Maven lifecycle einbinden Tools - Maven, Gradle, Ant & mehr 5
S Maven Unterschiedliche Deployments mit Maven Tools - Maven, Gradle, Ant & mehr 2
S Maven buildnumber-maven-plugin / Formatproblem mit timestamp Tools - Maven, Gradle, Ant & mehr 17
P Erzeugen von WebServices mit Maven und Eclipse (external Tool) Tools - Maven, Gradle, Ant & mehr 2
aze Maven downgraden von 3.x auf 2.09 unter Linux Tools - Maven, Gradle, Ant & mehr 4
Rudolf JSF und Maven mit Eclipse Tools - Maven, Gradle, Ant & mehr 5
M Maven-Dependency kann nicht gefunden werden Tools - Maven, Gradle, Ant & mehr 2
M Maven imports aus Modulen Tools - Maven, Gradle, Ant & mehr 4
P multimodul maven in SVN Tools - Maven, Gradle, Ant & mehr 3
D [Maven] neuerdings "No plugin found for prefix ..." errors Tools - Maven, Gradle, Ant & mehr 7
C Automatisches Deployen in ein externes Maven Repository. Tools - Maven, Gradle, Ant & mehr 5
D JUnit Test in Maven fail und in Eclipse erolgreich Tools - Maven, Gradle, Ant & mehr 4

Ähnliche Java Themen

Neue Themen


Oben