IntelliJ Maven Projekt erstellen

MiMa

Top Contributor
Aktuell möchte ich in IJ ein Maven Projekt erstellen.
Ich habe mir etwas Literatur besorgt, muss aber zu IJ hier mal anfragen welche Projekterstellung am besten gewählt werden sollte.

1. New Projekt in dem Java, GIT und Maven ausgewählt werden kann
IntelliJNewProject.JPG

2. Maven Archetyp
IntelliJNewMaven.JPG

Danke
 
Also bei der zweiten Methode steht schon im Fenster: "To create a general Maven project, go to the New Project page,"

Wenn Du ein neues ("generelles") Maven Projekt erstellen willst, dann nutzt Du die erste Version.

Dieses Maven Archetype ist sowas wie ein Projekt-Template. Wenn Dir also ein Archetype angegeben wurde, dann kannst Du es nutzen, um gleich ein entsprechendes Projekt mit vielen Einstellungen zu bekommen. Du aknnst es Dir ja mal ansehen - Du wirst merken, wie unübersichtlich das ist. Ich würde davon also klar abraten!

Die üblichen Wege, die ich nutze, wenn ich ein neues Projekt haben will:

a) Wenn das Framework einen Wizard bietet zur Erzeugung eines Projektes, dann nutze ich diesen sehr gerne. Beispiele wären hier Spring Boot (start.spring.io), Vaadin (start.vaadin.io), Quarkus (code.quarkus.io), ... Wobei ich hier gestehen muss, dass ich es nicht mag, dass da ein Parent Projekt so viel vorgibt. ==> Bei Spring Projekten habe ich in der Vergangenheit die Einstellungen übernommen und dann die Parent POM raus geworfen. Das ist somit auch nur für schnelle Starts eine Lösung.

b) Ansonsten greife ich auf mein "Standard Projekt" zurück und kopiere mir da einfach die POM. Das oberste Motto bei Maven ist aus meiner Sicht das, was die Prinzen vor langer Zeit schon gesungen haben: "Das ist alles nur geklaut".

c) Den Weg über New Projekt nutze ich ggf. auch hin und wieder. Aber eigentlich ist diese Lösung schon gestrichen.

Eine große Problematik, die ich sehe: Es fehlt einfach zu viel. Zu einem Software Projekt gehören gewisse Dinge, die einfach ein Muss sind:
  • Bei dem Weg c fehlt die Ausführung der Unit Tests! Absolutes No Go! => Da muss also immer noch mindestens das surface Plugin eingefügt werden.
  • Dann gibt es eine statische Codeanalyse. PMD, Spotbugs, .... Sowas muss sein. Das gehört also definitiv dazu und muss reinkopiert werden in die POM.
  • Die Prüfung der Abhängigkeiten kann eine CI/CD Pipeline machen. Aber ich packe sowas gerne direkt in das Projekt - das nächste Plugin. Und da hier einige Warnungen kommen, wenn Versionen nicht festgelegt wurden, hat man direkt noch: Enforcer Plugin für Maven Version und die Festlegung der Version für alle Plugins.
  • Dann kommen ggf. so Dinge wie GraalVM mit Native Image oder JLink/JPackage (incl. Moditect!).

Daher ist bei meinen Projekten eigentlich immer der Weg über eines meiner "Template" Projekte. Davon habe ich derzeit zwei:
 
Hallo Konrad,

die Lösung ohne Module finde ich super. Mir ist nur eine Sache aufgefallen. Wenn man das Image mit jPackage erzeugen lässt, gibt es ein Problem mit dem Aufruf der "main class". Befindet sich die Main Class auf der zweiten Package Ebene, wird die Klasse ausgeführt.

Klasse "Main.java" in "net.schusser"
POM: <main.class>net.schusser.Main</main.class>
Geht!

Klasse "Main.java" in "net.schusser,consoletest"
POM: <main.class>net.schusser.consoletest.Main</main.class>
Geht nicht!

Das ist schon sehr sonderbar.

Aber die beiden POMs für Console und JavaFX sind super und hilfreicht.
 
Hallo Michael,

das sollte aber ebenso funktionieren.

Das Komma im Package ist vermutlich nur ein Tippfehler?
Bei IntelliJ muss man nach Änderungen am Maven Projekt dieses in IntelliJ aktualisieren.
Und wenn sich der Name / das Package der Klasse mit der main Methode geändert hat, dann muss man die Run Configuration ggf. auch anpassen wenn man aus IntelliJ starten möchte. Das darf man nicht vergessen.
Und einmal das Maven Ziel clean ausführen, damit dann beim nächsten Maven Lauf alles neu gebaut wird.

Du kannst aber auch gerne einmal die genauen Details zeigen. Entweder hier im Forum oder auch gerne einfach einmal per Email an mich senden. Dann schaue ich gerne einmal über so ein Projekt.
 
Hallo Konrad,

ja das war ein Typo.

Ich hatte immer das Paket gebaut mit:
mvn -PImage clean install

Trotzdem ging es nicht. Jetzt habe ich "target" mit dem Explorer gelöscht und jetzt geht es. Sehr seltsam, irgendwas hatte in "target" gestört.
 
Ok, der Aufruf hätte so ok sein sollen und das Löschen auch machen sollen. Lief evtl. noch ein Prozess im Hintergrund, der das Löschen verhindert hat?

Aber wichtig ist, dass es jetzt geht und das manuelle Löschen von taget war auf jeden Fall auch ein richtiger gut guter Schritt. Super, dass es jetzt geht!
 
Hallo Konrad,

ich habe jetzt versucht mein erstes Projekt nach Java 17 zu konvertieren. Leider hänge ich wieder etwas. Das Projekt besteht aus zwei Unterprojekte. Das erste ist eine Konsolenanwendung und scannt mein Fotoverzeichnis nach EXIF Tags und baut eine Historie auf. Diese wird in eine MySQL Datenbank gespeichert. Dieser Teil läuft als Scheduled Task. Der zweite Teil ist die Anzeige der Historie in einer JAVA FX GUI. Ich habe Deine beiden Beispiele als Startpunkt verwendet. Das erst Projekt Image läuft Das zweite Projekt Image startet nicht. Ich habe den STDERR in eine Datei umgeleitet:

Code:
javafx.fxml.LoadException:
file:/D:/Projects_11/PictureTagView/target/jpackage/picturetagview/app/picturetagview-1.0-SNAPSHOT.jar!/net/schusser/picturetagview/gui/app.fxml

    at javafx.fxml@21/javafx.fxml.FXMLLoader.constructLoadException(Unknown Source)
    at javafx.fxml@21/javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml@21/javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml@21/javafx.fxml.FXMLLoader.load(Unknown Source)
    at net.schusser.picturetagview.Main.initRootLayout(Main.java:47)
    at net.schusser.picturetagview.Main.start(Main.java:38)
    at javafx.graphics@21/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(Unknown Source)
    at javafx.graphics@21/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(Unknown Source)
    at javafx.graphics@21/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(Unknown Source)
    at java.base/java.security.AccessController.doPrivileged(Unknown Source)
    at javafx.graphics@21/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(Unknown Source)
    at javafx.graphics@21/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source)
    at javafx.graphics@21/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at javafx.graphics@21/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(Unknown Source)
    at java.base/java.lang.Thread.run(Unknown Source)
Caused by: java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.base/java.lang.reflect.Method.invoke(Unknown Source)
    at com.sun.javafx.reflect.Trampoline.invoke(Unknown Source)
    at jdk.internal.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.base/java.lang.reflect.Method.invoke(Unknown Source)
    at javafx.base@21/com.sun.javafx.reflect.MethodUtil.invoke(Unknown Source)
    at javafx.fxml@21/com.sun.javafx.fxml.MethodHelper.invoke(Unknown Source)
    ... 14 more
Caused by: java.lang.NoClassDefFoundError: java/sql/SQLException
    at net.schusser.picturetagview.gui.AppController.initialize(AppController.java:99)
    ... 24 more
Caused by: java.lang.ClassNotFoundException: java.sql.SQLException
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source)
    at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
    ... 25 more

Der JDBC Treiber wird nicht gefunden. Ich habe die beiden Dumps der Maven logs angehängt. Die GUI startet mit javafx:run. Das Problem liegt in dem Classpath oder Modulepath.
Hier sind die beiden POMS.

picturetags.pom:
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>

    <!-- Edit these to match your project -->
    <groupId>net.schusser</groupId>
      <artifactId>picturetags</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <name>Picture Tags</name>
      <description>Scans picture tags</description>

    <packaging>jar</packaging>

    <!-- Modify or remove -->
    <organization>
        <name>X-RAY S.D.C.</name>
    </organization>

    <!-- Properties of the project - Configuration is done here -->
    <properties>

        <!-- Application Properties -->
        <link.name>${project.artifactId}</link.name>
        <launcher>${project.artifactId}</launcher>
        <appName>${project.artifactId}</appName>
        <main.class>net.schusser.picturetags.EXIFTags</main.class>
        <main.module>AppModule</main.module>
        <java.version>17</java.version>
        <jar.filename>${project.artifactId}-${project.version}</jar.filename>
        <required.maven.version>3.6.3</required.maven.version>

        <!-- Dependency versions -->
           <log4j.version>2.19.0</log4j.version>
        <metadata-extractor.version>2.18.0</metadata-extractor.version>
        <mysql-connector-j.version>8.1.0</mysql-connector-j.version>
        <xmpcore.version>6.1.11</xmpcore.version>
      
      
        <jetbrains.annotations.version>24.0.1</jetbrains.annotations.version>
        <junit.version>5.9.3</junit.version>
        <lombok.version>1.18.26</lombok.version>
        <mockito.version>5.3.1</mockito.version>
        <pmd.version>6.55.0</pmd.version>
        <spotbugs.version>4.7.3</spotbugs.version>

        <!-- Plugin dependencies -->
        <codehaus.version.plugin>2.11.0</codehaus.version.plugin>
        <jpackage.maven.plugin>0.1.3</jpackage.maven.plugin>
        <maven.clean.plugin>3.2.0</maven.clean.plugin>
        <maven.compiler.plugin>3.10.1</maven.compiler.plugin>
        <maven.dependency.plugin>3.3.0</maven.dependency.plugin>
        <maven.deploy.plugin>3.0.0-M2</maven.deploy.plugin>
        <maven.enforcer.plugin>3.1.0</maven.enforcer.plugin>
        <maven.install.plugin>3.0.0-M1</maven.install.plugin>
        <maven.jar.plugin>3.2.2</maven.jar.plugin>
        <maven.pmd.plugin>3.16.0</maven.pmd.plugin>
        <maven.resources.plugin>3.2.0</maven.resources.plugin>
        <maven.site.plugin>4.0.0-M1</maven.site.plugin>
        <maven.surfire.plugin>3.0.0-M6</maven.surfire.plugin>
        <moditect.maven.plugin>1.0.0.RC2</moditect.maven.plugin>
        <native.maven.plugin>0.9.17</native.maven.plugin>
        <spotbugs.maven.plugin>4.7.2.0</spotbugs.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.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>${log4j.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>${log4j.version}</version>
        </dependency>
        
        <dependency>
            <groupId>com.drewnoakes</groupId>
            <artifactId>metadata-extractor</artifactId>
            <version>${metadata-extractor.version}</version>
        </dependency>
        
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <version>${mysql-connector-j.version}</version>
        </dependency>

        <dependency>
            <groupId>com.adobe.xmp</groupId>
            <artifactId>xmpcore</artifactId>
            <version>${xmpcore.version}</version>
        </dependency>


        <!-- Lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
        </dependency>

        <!-- JUnit 5 -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-params</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>

        <!-- Mockito -->
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
            <version>${mockito.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-junit-jupiter</artifactId>
            <version>${mockito.version}</version>
            <scope>test</scope>
        </dependency>

        <!-- Dependency used for @NotNull / @Nullable -->
        <dependency>
            <groupId>org.jetbrains</groupId>
            <artifactId>annotations</artifactId>
            <version>${jetbrains.annotations.version}</version>
            <scope>compile</scope>
        </dependency>

    </dependencies>

    <build>
        <finalName>${jar.filename}</finalName>

        <plugins>
            <!-- Enforcer to enforce min Maven version -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-enforcer-plugin</artifactId>
                <version>${maven.enforcer.plugin}</version>
                <executions>
                    <execution>
                        <id>enforce-versions</id>
                        <goals>
                            <goal>enforce</goal>
                        </goals>
                        <configuration>
                            <rules>
                                <requireMavenVersion>
                                    <version>${required.maven.version}</version>
                                </requireMavenVersion>
                            </rules>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <!-- Compiler including Lombok -->
            <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>

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

          

            <!-- PMD static code analysis -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-pmd-plugin</artifactId>
                <version>${maven.pmd.plugin}</version>
                <dependencies>
                    <dependency>
                        <groupId>net.sourceforge.pmd</groupId>
                        <artifactId>pmd-core</artifactId>
                        <version>${pmd.version}</version>
                    </dependency>
                    <dependency>
                        <groupId>net.sourceforge.pmd</groupId>
                        <artifactId>pmd-java</artifactId>
                        <version>${pmd.version}</version>
                    </dependency>
                    <dependency>
                        <groupId>net.sourceforge.pmd</groupId>
                        <artifactId>pmd-javascript</artifactId>
                        <version>${pmd.version}</version>
                    </dependency>
                    <dependency>
                        <groupId>net.sourceforge.pmd</groupId>
                        <artifactId>pmd-jsp</artifactId>
                        <version>${pmd.version}</version>
                    </dependency>
                </dependencies>
                <configuration>
                    <sourceEncoding>${project.build.sourceEncoding}</sourceEncoding>
                    <minimumTokens>100</minimumTokens>
                    <targetJdk>${java.version}</targetJdk>
                    <rulesets>
                        <ruleset>pmd-ruleset.xml</ruleset>
                    </rulesets>
                    <linkXRef>false</linkXRef>
                </configuration>
                <executions>
                    <execution>
                        <phase>prepare-package</phase>
                        <goals>
                            <!-- pmd does not stop build when violations are found -->
                            <goal>pmd</goal>

                            <!-- check stops the build when violations are found -->
                            <!-- <goal>check</goal> -->
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <!-- Check for new versions in dependencies -->
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>versions-maven-plugin</artifactId>
                <version>${codehaus.version.plugin}</version>
                <executions>
                    <execution>
                        <phase>validate</phase>
                        <goals>
                            <goal>display-dependency-updates</goal>
                            <goal>display-plugin-updates</goal>
                            <goal>display-property-updates</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <!-- clean plugin - to remove the warning regarding version -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-clean-plugin</artifactId>
                <version>${maven.clean.plugin}</version>
            </plugin>

            <!-- deploy plugin - to remove the warning regarding version -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-deploy-plugin</artifactId>
                <version>${maven.deploy.plugin}</version>
            </plugin>

            <!-- install plugin - to remove the warning regarding version -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-install-plugin</artifactId>
                <version>${maven.install.plugin}</version>
            </plugin>

            <!-- jar plugin - to remove the warning regarding version -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>${maven.jar.plugin}</version>
            </plugin>

            <!-- resources plugin - to remove the warning regarding version -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>${maven.resources.plugin}</version>
            </plugin>

            <!-- site plugin - to remove the warning regarding version -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-site-plugin</artifactId>
                <version>${maven.site.plugin}</version>
            </plugin>
        </plugins>
    </build>

    <profiles>

        <!-- Profile that adds compiling to a native binary using
             GraalVM an Native Image https://www.graalvm.org/

             Add -PGraalVM or -DGraalVM to use this profile.
             -->
        <profile>
            <id>GraalVM</id>
            <activation>
                <property>
                    <name>GraalVM</name>
                </property>
            </activation>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.graalvm.buildtools</groupId>
                        <artifactId>native-maven-plugin</artifactId>
                        <version>${native.maven.plugin}</version>
                        <extensions>true</extensions>
                        <executions>
                            <execution>
                                <id>build-native</id>
                                <goals>
                                    <goal>compile-no-fork</goal>
                                </goals>
                                <phase>package</phase>
                            </execution>
                            <execution>
                                <id>test-native</id>
                                <goals>
                                    <goal>test</goal>
                                </goals>
                                <phase>test</phase>
                            </execution>
                        </executions>
                        <configuration>
                            <imageName>${appName}</imageName>
                            <mainClass>${main.class}</mainClass>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>

        <!-- Profile that adds JLink and JPackage runs.

             Add -PImage or -DImage to use this profile.
             -->
        <profile>
            <id>Image</id>
            <activation>
                <property>
                    <name>Image</name>
                </property>
            </activation>
            <build>
                <plugins>
                    <!-- Copy dependencies -->
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-dependency-plugin</artifactId>
                        <version>${maven.dependency.plugin}</version>
                        <executions>
                            <!-- erstmal Abhängigkeiten für den Class-Path kopieren -->
                            <execution>
                                <id>copy-dependencies</id>
                                <phase>package</phase>
                                <goals>
                                    <goal>copy-dependencies</goal>
                                </goals>
                                <configuration>
                                    <outputDirectory>${project.build.directory}/modules</outputDirectory>
                                    <includeScope>runtime</includeScope>
                                    <overWriteReleases>false</overWriteReleases>
                                    <overWriteSnapshots>false</overWriteSnapshots>
                                    <overWriteIfNewer>true</overWriteIfNewer>
                                </configuration>
                            </execution>

                            <!-- dazu noch das Projekt-JAR -->
                            <execution>
                                <id>copy</id>
                                <phase>install</phase>
                                <goals>
                                    <goal>copy</goal>
                                </goals>
                                <configuration>
                                    <outputDirectory>${project.build.directory}/modules</outputDirectory>
                                    <artifactItems>
                                        <artifactItem>
                                            <groupId>${project.groupId}</groupId>
                                            <artifactId>${project.artifactId}</artifactId>
                                            <version>${project.version}</version>
                                            <type>${project.packaging}</type>
                                            <destFileName>${project.build.finalName}.jar</destFileName>
                                        </artifactItem>
                                    </artifactItems>
                                    <overWriteIfNewer>true</overWriteIfNewer>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>

                    <plugin>
                        <groupId>com.github.akman</groupId>
                        <artifactId>jpackage-maven-plugin</artifactId>
                        <version>${jpackage.maven.plugin}</version>
                        <configuration>
                            <name>${appName}</name>
                            <type>IMAGE</type>
                            <mainclass>${main.class}</mainclass>
                            <input>${project.build.directory}/modules</input>
                            <mainjar>${jar.filename}.jar</mainjar>
                        </configuration>
                        <executions>
                            <execution>
                                <phase>install</phase>
                                <goals>
                                    <goal>jpackage</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>

    </profiles>

</project>

picturetagview.pom:
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>

    <!-- Edit these to match your project -->
    <groupId>net.schusser</groupId>
    <artifactId>picturetagview</artifactId>
    <version>1.0-SNAPSHOT</version>


    <organization>
        <name>R-RAY S.D.C.</name>
    </organization>
    
    <packaging>jar</packaging>
    
    <properties>
        <!-- Application Properties -->
        <link.name>${project.artifactId}</link.name>
        <launcher>${project.artifactId}</launcher>
        <appName>${project.artifactId}</appName>
        <main.class>net.schusser.picturetagview.Main</main.class>
        <java.version>17</java.version>
        <required.maven.version>3.6.3</required.maven.version>
        <jar.filename>${project.artifactId}-${project.version}</jar.filename>

        <resource.base>${basedir}/build</resource.base>
        <resource.icon>${resource.base}/icon</resource.icon>
        <resource.source>${resource.base}/data</resource.source>
        <resource.target>${project.build.directory}/jpackage/${appName}</resource.target>
        

        <!-- Dependency versions -->
           <log4j.version>2.20.0</log4j.version>
           <javafx.version>21</javafx.version>
           <controlsfx.version>11.1.2</controlsfx.version>
           <jdom.version>2.0.6.1</jdom.version>
           <mysql-connector-j.version>8.1.0</mysql-connector-j.version>
        
        
        <jetbrains.annotations.version>24.0.1</jetbrains.annotations.version>
        <junit.version>5.9.3</junit.version>
        <lombok.version>1.18.26</lombok.version>
        <mockito.version>5.3.1</mockito.version>

        <!-- Plugin dependencies -->
        <maven.clean.plugin>3.2.0</maven.clean.plugin>
        <maven.compiler.plugin>3.10.1</maven.compiler.plugin>
        <maven.dependency.plugin>3.3.0</maven.dependency.plugin>
        <maven.deploy.plugin>3.0.0-M2</maven.deploy.plugin>
        <maven.enforcer.plugin>3.1.0</maven.enforcer.plugin>
        <maven.install.plugin>3.0.0-M1</maven.install.plugin>
        <maven.jar.plugin>3.2.2</maven.jar.plugin>
        <maven.resources.plugin>3.2.0</maven.resources.plugin>
        <maven.site.plugin>4.0.0-M1</maven.site.plugin>
        <maven.surfire.plugin>3.0.0-M6</maven.surfire.plugin>
        <moditect.maven.plugin>1.0.0.RC2</moditect.maven.plugin>
        <jpackage.maven.plugin>0.1.5</jpackage.maven.plugin>
        <maven.pmd.version>3.16.0</maven.pmd.version>
        <pmd.version>6.55.0</pmd.version>
        <codehaus.version.plugin>2.11.0</codehaus.version.plugin>
        <javafx.maven.plugin>0.0.8</javafx.maven.plugin>
        <spotbugs.maven.plugin>4.7.2.0</spotbugs.maven.plugin>
        <spotbugs.version>4.7.3</spotbugs.version>

        <maven-antrun.version>3.1.0</maven-antrun.version>


        <!-- 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>
        <maven.compiler.release>${java.version}</maven.compiler.release>

    </properties>

    <dependencies>
        <!-- JavaFX dependencies -->
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</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-fxml</artifactId>
            <version>${javafx.version}</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-web</artifactId>
            <version>${javafx.version}</version>
        </dependency>

        <!-- controlsfx -->
        <dependency>
            <groupId>org.controlsfx</groupId>
            <artifactId>controlsfx</artifactId>
            <version>${controlsfx.version}</version>
        </dependency>   

        <!-- log4j -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>${log4j.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>${log4j.version}</version>
        </dependency>


        <!-- jdom2 -->
        <dependency>
            <groupId>org.jdom</groupId>
            <artifactId>jdom2</artifactId>
            <version>${jdom.version}</version>
        </dependency>
        
        <!-- mysql -->
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <version>${mysql-connector-j.version}</version>
        </dependency>

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

        <!-- JUnit 5 -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-params</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>

        <!-- Mockito -->
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
            <version>${mockito.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-junit-jupiter</artifactId>
            <version>${mockito.version}</version>
            <scope>test</scope>
        </dependency>

        <!-- Dependency used for @NotNull / @Nullable -->
        <dependency>
            <groupId>org.jetbrains</groupId>
            <artifactId>annotations</artifactId>
            <version>${jetbrains.annotations.version}</version>
            <scope>compile</scope>
        </dependency>

    </dependencies>

    <build>
        <finalName>${jar.filename}</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-enforcer-plugin</artifactId>
                <version>${maven.enforcer.plugin}</version>
                <executions>
                    <execution>
                        <id>enforce-versions</id>
                        <goals>
                            <goal>enforce</goal>
                        </goals>
                        <configuration>
                            <rules>
                                <requireMavenVersion>
                                    <version>${required.maven.version}</version>
                                </requireMavenVersion>
                            </rules>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <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-clean-plugin</artifactId>
                <version>${maven.clean.plugin}</version>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-deploy-plugin</artifactId>
                <version>${maven.deploy.plugin}</version>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-install-plugin</artifactId>
                <version>${maven.install.plugin}</version>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>${maven.jar.plugin}</version>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>${maven.resources.plugin}</version>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-site-plugin</artifactId>
                <version>${maven.site.plugin}</version>
            </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-pmd-plugin</artifactId>
                <version>${maven.pmd.version}</version>
                <dependencies>
                    <dependency>
                        <groupId>net.sourceforge.pmd</groupId>
                        <artifactId>pmd-core</artifactId>
                        <version>${pmd.version}</version>
                    </dependency>
                    <dependency>
                        <groupId>net.sourceforge.pmd</groupId>
                        <artifactId>pmd-java</artifactId>
                        <version>${pmd.version}</version>
                    </dependency>
                    <dependency>
                        <groupId>net.sourceforge.pmd</groupId>
                        <artifactId>pmd-javascript</artifactId>
                        <version>${pmd.version}</version>
                    </dependency>
                    <dependency>
                        <groupId>net.sourceforge.pmd</groupId>
                        <artifactId>pmd-jsp</artifactId>
                        <version>${pmd.version}</version>
                    </dependency>
                </dependencies>
                <configuration>
                    <sourceEncoding>${project.build.sourceEncoding}</sourceEncoding>
                    <minimumTokens>100</minimumTokens>
                    <targetJdk>${java.version}</targetJdk>
                    <linkXRef>false</linkXRef>
                    <rulesets>
                        <ruleset>pmd-ruleset.xml</ruleset>
                    </rulesets>
                </configuration>
                <executions>
                    <execution>
                        <phase>prepare-package</phase>
                        <goals>
                            <!-- pmd does not stop build when violations are found -->
                            <goal>pmd</goal>

                            <!-- check stops the build when violations are found -->
                            <!-- <goal>check</goal> -->
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>versions-maven-plugin</artifactId>
                <version>${codehaus.version.plugin}</version>
                <executions>
                    <execution>
                        <phase>validate</phase>
                        <goals>
                            <goal>display-dependency-updates</goal>
                            <goal>display-plugin-updates</goal>
                            <goal>display-property-updates</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <!-- JavaFX Plugin to start application -->
            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>${javafx.maven.plugin}</version>
                <configuration>
                    <mainClass>${main.class}</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <profiles>

        <!-- Profile that adds JLink and JPackage runs.

             Add -PImage or -DImage to use this profile.
             -->
        <profile>
            <id>Image</id>
            <activation>
                <property>
                    <name>Image</name>
                </property>
            </activation>
            <build>
                <plugins>
                    <!-- Copy dependencies -->
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-dependency-plugin</artifactId>
                        <version>${maven.dependency.plugin}</version>
                        <executions>
                            <!-- erstmal Abhängigkeiten für den Class-Path kopieren -->
                            <execution>
                                <id>copy-dependencies</id>
                                <phase>package</phase>
                                <goals>
                                    <goal>copy-dependencies</goal>
                                </goals>
                                <configuration>
                                    <outputDirectory>${project.build.directory}/modules</outputDirectory>
                                    <includeScope>runtime</includeScope>
                                    <overWriteReleases>false</overWriteReleases>
                                    <overWriteSnapshots>false</overWriteSnapshots>
                                    <overWriteIfNewer>true</overWriteIfNewer>
                                </configuration>
                            </execution>

                            <!-- dazu noch das Projekt-JAR -->
                            <execution>
                                <id>copy</id>
                                <phase>install</phase>
                                <goals>
                                    <goal>copy</goal>
                                </goals>
                                <configuration>
                                    <outputDirectory>${project.build.directory}/modules</outputDirectory>
                                    <artifactItems>
                                        <artifactItem>
                                            <groupId>${project.groupId}</groupId>
                                            <artifactId>${project.artifactId}</artifactId>
                                            <version>${project.version}</version>
                                            <type>${project.packaging}</type>
                                            <destFileName>${project.build.finalName}.jar</destFileName>
                                        </artifactItem>
                                    </artifactItems>
                                    <overWriteIfNewer>true</overWriteIfNewer>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>

                    <plugin>
                        <groupId>com.github.akman</groupId>
                        <artifactId>jpackage-maven-plugin</artifactId>
                        <version>${jpackage.maven.plugin}</version>
                        <configuration>
                            <name>${appName}</name>
                            <type>IMAGE</type>
                            <icon>${resource.icon}/${appName}.ico</icon>
                            <modulepath>
                                <dependencysets>
                                    <dependencyset>
                                        <includenames>
                                            <includename>javafx\..*</includename>
                                        </includenames>
                                    </dependencyset>
                                </dependencysets>
                            </modulepath>
                            <addmodules>
                                <addmodule>javafx.controls</addmodule>
                                <addmodule>javafx.graphics</addmodule>
                                <addmodule>javafx.fxml</addmodule>
                                <addmodule>javafx.web</addmodule>
                            </addmodules>
                            <mainclass>${main.class}</mainclass>
                            <input>${project.build.directory}/modules</input>
                            <mainjar>${jar.filename}.jar</mainjar>
                        </configuration>
                        <executions>
                            <execution>
                                <phase>install</phase>
                                <goals>
                                    <goal>jpackage</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                     <plugin>
                        <artifactId>maven-resources-plugin</artifactId>
                        <version>3.3.1</version>
                        <executions>
                          <execution>
                            <id>copy-resources</id>
                            <phase>install</phase>
                            <goals>
                              <goal>copy-resources</goal>
                            </goals>
                            <configuration>
                              <outputDirectory>${resource.target}</outputDirectory>
                              <resources>         
                                <resource>
                                  <directory>${resource.source}</directory>
                                  <includes>
                                      <include>**/*</include>
                                 </includes>
                                </resource>
                              </resources>             
                            </configuration>           
                          </execution>
                        </executions>
                      </plugin>
                </plugins>
            </build>
        </profile>

    </profiles>
</project>

Irgend etwas muß noch in dem PicturetagView.pom ergänzt werden.

Vielen Grüße,
Michael
 

Anhänge

Da fehlt dann vermutlich das Modul java.sql. Also einfach mal bei den addmodule Einträgen noch ein solcher Eintrag für java.sql hinzu fügen.
 
Hallo Konrad,

ich habe java.sql aufgenommen:
XML:
                             <addmodules>
                                <addmodule>javafx.controls</addmodule>
                                <addmodule>javafx.graphics</addmodule>
                                <addmodule>javafx.fxml</addmodule>
                                <addmodule>javafx.web</addmodule>
                                <addmodule>java.sql</addmodule>
                            </addmodules>

Hat leider das Problem nicht gelöst.
 
Ok, erste Erkenntnis ist, dass noch mehr Module fehlen. De Module, die man haben möchte, muss man dann doch alle hinzu fügen.

ChatGPT meint zwar, dass Wildcards gehen, aber das geht natürlich nicht. Dann muss man ggf. doch eine module-info.java beisteuern um so dann die Module alle zu bekommen, die man braucht. Wobei es da weiterhin Probleme gibt wie die Lokalisierung - die halt im Modul jdk.localedata sind und man ohne das halt alles mit default (US) locale hat...
 
Ein zweiter Ansatz ist, dass man auf die ganzen Module verzichtet und dann einfach JavaFX mit in dem unnamed Modul vorhält. Das gibt zwar eine Warnung:
WARNUNG: Unsupported JavaFX configuration: classes were loaded from 'unnamed module @59662a0b'
aber das sollte erst einmal gehen.

Ggf. läuft es auf Probleme, wenn man etwas öffnen muss. Sollte sowas zur Laufzeit bemerkt werden, dann müsste man bei dem jpackage plugin in der configuration javaoptions angeben mit dem notwendigen --add-opens.
 
Da mir gerade auffällt, dass ich hier die genauen Details im pom.xml vergessen hatte:
Das jpackage plugin bekommt dann nur diese Einträge:
XML:
                    <plugin>
                        <groupId>com.github.akman</groupId>
                        <artifactId>jpackage-maven-plugin</artifactId>
                        <version>${jpackage.maven.plugin}</version>
                        <configuration>
                            <name>${appName}</name>
                            <type>IMAGE</type>
                            <icon>${resource.icon}/${appName}.ico</icon>
                            <mainclass>${main.class}</mainclass>
                            <input>${project.build.directory}/modules</input>
                            <mainjar>${jar.filename}.jar</mainjar>
                        </configuration>
                        <executions>
                            <execution>
                                <phase>install</phase>
                                <goals>
                                    <goal>jpackage</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
(Das nur für den Fall, dass hier jemand anderes über den Thread stolpert mit so einem Problem. Das Projekt auf GitHub mit dem Template werde ich auch noch etwas anpassen nachdem ich es da etwas mehr getestet habe.)
 
Jetzt geht es! Man muss nur bedenken, dass man zusätzliche Verzeichnisse und Dateien nicht mehr über JPackage dazu bekommt. Der Parameter dafür ist "--input" der wird schon von dem Plugin benutzt um die kompilierten Klassen in das Packet zu bekommen. Ich habe dafür in das Profile Image das folgende Plugin hinzu gefügt:

XML:
<plugin>
    <artifactId>maven-resources-plugin</artifactId>
    <version>${maven-resources-plugin.version}</version>
    <executions>
        <execution>
            <id>copy-resources</id>
            <phase>install</phase>
            <goals>
                <goal>copy-resources</goal>
            </goals>
            <configuration>
                <outputDirectory>${resource.target}</outputDirectory>
                <resources>         
                    <resource>
                        <directory>${resource.source}</directory>
                        <includes>
                            <include>**/*</include>
                        </includes>
                    </resource>
                </resources>             
            </configuration>           
        </execution>
    </executions>
</plugin>
 

Zurück
Oben