JCommander

Felix T.

Neues Mitglied
Hallo zusammen,

ich probiere aktuell ein Projekt mit JCommander zum laufen zu bekommen. Testweise habe ich dieses Beispiel mal nachgebaut:

Beim Auführen des Programms bekomme ich aber folgenden Fehler:
Exception in thread "main" java.lang.NoClassDefFoundError: com/beust/jcommander/JCommander
at App.main(App.java:8)
Caused by: java.lang.ClassNotFoundException: com.beust.jcommander.JCommander
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
... 1 more
Die App Klasse:

Java:
import com.beust.jcommander.JCommander;

public class App {

    public static void main(String[] argv) {

        Args args = new Args();
        JCommander jc = new JCommander(args);

        try {
            jc.parse(argv);

        } catch (Exception e) {
            jc.usage();
        }
        System.out.println("Hello World!");
        if (args.help) {
            jc.usage();
            System.exit(0);
        }
        System.out.format("The value of name is: %s%n", args.name);
        System.out.format("The value of verbose is: %d%n", args.verbose);
        System.out.format("The value of debug is: %b%n", args.debug);
    }
}

Die POM.xml ist leicht anders als im obrigen Beispiel weil es wie oben nicht funktioniert hat. Das sollte aber eigentlich keinen Unterschied machen?
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>org.example</groupId>
    <artifactId>test</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>App</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>

        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>com.beust</groupId>
            <artifactId>jcommander</artifactId>
            <version>1.82</version>
        </dependency>
    </dependencies>

</project>

Wäre super wenn mir jemand sagen kann, was ich tun kann damit ich das ausführen kann.
Ich führe das ganze über die Powershell mit: mvn clean install und java -jar target\test-1.0-SNAPSHOT.jar aus. Dabei befinde ich mich in der Ebene in der die POM.xml liegt.

Vielen Dank schonmal :)
 

KonradN

Super-Moderator
Mitarbeiter
Die jar Datei enthält nur Deinen Code und keine Abhängigkeiten.

Wenn das jar File auch die Abhängigkeiten enthalten soll, dann musst Du dies auch entsprechen in der POM konfigurieren. Dies kannst Du z.B. mit dem shade Plugin machen.

Generell ist die Idee aber seit Java 9, dass man nicht mehr jar Files weitergibt oder so sondern mit jlink ein Image erzeugt (und ab Java 14 dann auch mit jpackage ein App-Image erstellt, das dann statt eines Startscripts ein Executable enthält).
 

Oben