Maven Maven: <mainClass>NAME?</mainClass>

  • Themenstarter Themenstarter hk
  • Beginndatum Beginndatum

hk

Bekanntes Mitglied
ich habe das plugin zum Erstellen eines executable JAR in meine pom.xml eingefügt, habe nun aber Probleme mit dem mainClass Namen. Welche Pfadanteile hier angegeben werden müssen. Hier die Fehlermeldung:
C:\Test>java -jar mavenproject1-1.0-snapshot.jar
Error: Could not find or load main class com.mycompany.mavenproject1.App.java
Caused by: java.lang.ClassNotFoundException: com.mycompany.mavenproject1.App.java
<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>com.mycompany</groupId>
<artifactId>mavenproject1</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>13</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- Building an executable JAR -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>App</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<!-- END Building an executable JAR -->

<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.8</version>
<configuration>
<mainClass>com.mycompany.mavenproject1.App</mainClass>
</configuration>
<executions>
<execution>
<!-- Default configuration for running -->
<!-- Usage: mvn clean javafx:run -->
<id>default-cli</id>
</execution>
<execution>
<!-- Configuration for manual attach debugging -->
<!-- Usage: mvn clean javafx:run@debug -->
<id>debug</id>
<configuration>
<options>
<option>-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=localhost:8000</option>
</options>
</configuration>
</execution>
<execution>
<!-- Configuration for automatic IDE debugging -->
<id>ide-debug</id>
<configuration>
<options>
<option>-agentlib:jdwp=transport=dt_socket,server=n,address=${jpda.address}</option>
</options>
</configuration>
</execution>
<execution>
<!-- Configuration for automatic IDE profiling -->
<id>ide-profile</id>
<configuration>
<options>
<option>${profiler.jvmargs.arg1}</option>
<option>${profiler.jvmargs.arg2}</option>
<option>${profiler.jvmargs.arg3}</option>
<option>${profiler.jvmargs.arg4}</option>
<option>${profiler.jvmargs.arg5}</option>
</options>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.2.1</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.3.1</version>
</plugin>
</plugins>
</build>
</project>
 
Die Main Klasse musst du da angeben mit dem Package Namen davor. Wenn du mir Modulen arbeitest, dann sollte da auch der Modulname / davor. Also etwas wie meinmodul/my.package.MainClass
 
Es will nicht klappen! Ich habe alle Möglichkeiten des Pfades bis zum SRC durchgespielt. Immer die gleiche Fehlermeldung.
Hier der absolute Pfad: D:\Heinz\EigeneProgrammeSource\NetBeansProjects\MAVEN-Projekte\mavenproject1\src\main\java\com\mycompany\mavenproject1\App.java
wobei App.java die main-Klasse ist.
Hier nochmals die Fehlermeldung:
C:\Test>java -jar mavenproject1-1.0-snapshot.jar
Error: Could not find or load main class main.java.com.mycompany.mavenproject1.App
Caused by: java.lang.ClassNotFoundException: main.java.com.mycompany.mavenproject1.App
<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>com.mycompany</groupId>
<artifactId>mavenproject1</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>13</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- Building an executable JAR -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>main/java/com.mycompany.mavenproject1.App</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<!-- END Building an executable JAR -->
<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.8</version>
<configuration>
<mainClass>com.mycompany.mavenproject1.App</mainClass>
</configuration>
<executions>
<execution>
<!-- Default configuration for running -->
<!-- Usage: mvn clean javafx:run -->
<id>default-cli</id>
</execution>
<execution>
<!-- Configuration for manual attach debugging -->
<!-- Usage: mvn clean javafx:run@debug -->
<id>debug</id>
<configuration>
<options>
<option>-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=localhost:8000</option>
</options>
</configuration>
</execution>
<execution>
<!-- Configuration for automatic IDE debugging -->
<id>ide-debug</id>
<configuration>
<options>
<option>-agentlib:jdwp=transport=dt_socket,server=n,address=${jpda.address}</option>
</options>
</configuration>
</execution>
<execution>
<!-- Configuration for automatic IDE profiling -->
<id>ide-profile</id>
<configuration>
<options>
<option>${profiler.jvmargs.arg1}</option>
<option>${profiler.jvmargs.arg2}</option>
<option>${profiler.jvmargs.arg3}</option>
<option>${profiler.jvmargs.arg4}</option>
<option>${profiler.jvmargs.arg5}</option>
</options>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.2.1</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.3.1</version>
</plugin>
</plugins>
</build>
</project>
 
Eine Idee wäre ggf, dass Du einmal ein Clean durchlaufen lässt und dann das Projekt als zip bereit stellst (Falls dies ein reines Test Projekt von Dir sein sollte).

Die App.java sollte folgende Zeile enthalten:
package com.mycompany.mavenproject1

Hast Du eine module-info.java? Die solltest Du vermutlich haben und damit hast Du auch einen Modulnamen. Also etwas wie:
module xzy {

Wenn du die module-info hast, dann sollte als main class angegeben werden als: xyz/com.mycompany.mavenproject1.App
Ohne die module-info wäre es nur: com.mycompany.mavenproject1.App

Das wäre so die Theorie - aber wenn es nicht klappt und es möglich ist: Stell ein Zip ein (nach einem clean Lauf der nach Löschen des target Verzeichnisses)
 
Ja, das package ist com.mycompany.mavenproject1

Die module-info.java hat diesen Inhalt:

module com.mycompany.mavenproject1 {
requires javafx.controls;
exports com.mycompany.mavenproject1;
}


Ich habe nun ein clean gemacht und das Projekt dann gezipt.
 

Anhänge

Ok, damit ist dein modul: com.mycompany.mavenproject1
In der pom.xml sollte es also heißen:
Code:
<mainClass>com.mycompany.mavenproject1/com.mycompany.mavenproject1.App</mainClass>
 
Funktioniert leider auch nicht!
Ok, ich hatte mir die Fehlerbeschreibung nicht richtig angesehen. Das Problem ist, dass Du keinen gültigen Aufruf hast!

Du startest Dein Projekt mittels mvn javafx:run

Wenn Du etwas weitergeben willst, dann erstellst Du ein Image. Dies erfolgt mit mvn javafx:jlink
(Deine pom sollte man noch so anpassen, dass er auch Startscripte erzeugt.)
 
Sorry, aber ich verstehe Dich nicht. Was meinst Du mit kein gültiger Aufruf? Den Programmaufruf java -jar ... ?
Ich starte mein Programm nicht mit mvn javafx:run.
Ist es so, dass ich mit NetBean keine verteilbare jar erstellen kann sondern zusätzlich noch mvn Befehle benötige. Wenn ja, mit welchen Zustand des Projektes?
PS: Tut mir leid, dass ich so viele Umstände mache.
 
Also erst einmal machst Du keine Umstände.

Das Vorgehen hat sich von Java 8 zu Java 9 geändert. Statt ein ausführbares jar File zu erzeugen wurde mit Java 9 die Erstellung eines sogenannten Images eingeführt. Dies enthält dann auch ein (minimales) JRE mit allen Abhängigkeiten.

Daher meine Aussage, wie Du es starten kannst (javafx:run) und wie Du dieses Image erzeugen kannst (javafx:jlink).

Eine jar Datei kannst Du prinzipiell auch weiterhin erzeugen. Dazu müsstest Du aber
a) dem JAR File ein Manifest hinzufügen. Derzeit konfigurierst Du die main Class nur für das javafx plugin.
b) die Abhängigkeiten müssten in das JAR File kopiert werden
c) JavaFX hat eine etwas komplexere Startweise - das führt auch zu Problemen, die weitere Aktivitäten erfordern dürften.

Meine Empfehlung ist daher weiterhin: Nutze die Funktionalität des JavaFX Plugins so wie es vorgesehen ist. Das vereinfacht es massiv. a) und b) kann ich Dir auch zeigen, aber ich fürchte, dass wir dann in einer Problematik bei c) laufen werden, die nicht ganz so einfach zu lösen sein dürfte.
 
Ok, was ich möchte ist, eine von mir erstellte Anwendung auf einem anderen Windows-Rechner laufen zu lassen. Wenn das mit einem Image möglich ist und das der gängige Weg ist so will ich das auch tun. Wenn Du mir so einen Erzeugungs-Reihenfolge erklären kannst oder mir sagst wo ich das nachlesen kann wäre ich dir dankbar.
 

Die Getting Started Dokumentation zeigt unter dem Punkt Runtime Images, wie diese mit Maven gebaut werden können.

Aber bitte darauf achten: Die verlinkte pom.xml hat noch ein paar Konfigurationselemente mehr:
XML:
                    <jlinkImageName>hellofx</jlinkImageName>
                    <launcher>launcher</launcher>
Das sind 2 Einträge, die man setzen sollte. jlinkImageName gibt den Namen des Verzeichnisses an und launcher gibt an, wie der Launcher heißen soll.

Wenn Du das hinzu fügst (da, wo die main class angegeben wurde), dann hast Du folgende Maven Ziele:
javafx:run -> Dies startet die JavaFX Anwendung
javafx:jlink -> Das erzeugt das Image innerhalb des Verzeichnisses target. Das verzeichnis (In dem Beispiel hellofx) kannst Du z.B. in ein ZIP packen. Dieses kann dann auf dem Zielrechner entpackt werden um dann bin\launcher.cmd zu starten (oder was es .bat?)

Eine weitere Option wäre noch, mittels jpackage ein Binary Image zu erzeugen. Das ist ein weiterer Aufruf, den ich Dir gerne nennen kann. Oder man packt das noch mit in die pom (Es gibt ein maven plugin für jpackage).
 
es gibt auch den jpackage installer ( jpackage-maven-plugin ) wo du dir einen installer ausspucken lassen kannst ( der ist aber immer für das betriebssystem wo man aktuell drauf ist ) wenn man das einmal konfiguriert hat man halt das "wie krieg ich es aus der IDE raus" problem für immer gelöst
 

Zurück
Oben