java.lang.NoClassDefFoundError: org/json/JSONException

Rookar

Mitglied
Hallo,

ich habe folgendes Problem. Wenn ich das Programm in Netbeans starte geht alles super. Wenn ich jetzt aber die jar öffne dann gibts folgenden fehler wenn ich den einen Button drücke.

Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: org/json/JSONException

Ich habe schon gegoogelt aber ich komme einfach nicht weiter. Ich glaube er gibt die abhängigkeit nicht an die jar weiter.
pom ausschnitt:
<dependencies>
<!-- PDFBox Dependency -->
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>3.0.2</version>
</dependency>
<!-- JSON Dependency -->
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20230227</version>
</dependency>
</dependencies>
Der sieht zumindest für mich gut aus. Auch links in der Ordnerstruktur taucht sie auf.

für hilfe wäre ich dankbar.

mit Grüßen

edit: ach jdk22 und mit maven
 
Es gibt mehrere Möglichkeiten:

1. Du sammelst die Abhängigkeiten, damit Du diese dann mitgeben kannst. Dann hast Du im Manifest den Classpath und die jar Dateien müssen dann mit vorhanden sein. Das Kopieren der Abhängigkeiten ginge z.B. per maven-dependency-plugin.

2. Du baust ein "fat jar". Das bedeutet, alle Abhängigkeiten fügst Du in Deine jar Datei ein. Dann ist dein jar File alleine schon komplett. Dies ginge z.B. mit Hilfe des Shade Plugins.

3. Du willst die Anwendung weiter geben nehme ich an - also nutze da die Methoden, die dafür vorgesehen sind. Das wäre bei aktuellem Java das JPackage. Dazu gibt es auch ein entsprechendes Plugin.

Wie sowas aussehen könnte, kannst Du in https://github.com/kneitzel/JavaMavenApp sehen. Da habe ich zum einen das fat-jar in einem Profil als auch JPackage in einem anderen. Den Weg, den ich in 1. beschrieben habe, siehst Du da nicht. Aber das dependency Plugin ist auch bei dem image Profil ein Bestandteil.

Bezüglich Weitergabe würde ich immer den Weg 3 wählen. Der Download wird zwar größer, aber Du hast etwas mit minimalen Dependencies. Es muss also nicht erst eine passende Java Version installiert werden. Du musst aber auch immer auf der Plattform bauen, für die Du es haben willst (Das geht aber teilweise sehr gut mit CI/CD Pipelines ...)
 
Danke erstmal für die Antwort.
Ich bin jetzt den weg des "fat jars" gegangen. Die 3. möglichkeit mit der jpackage habe ich gestern den halben Tag versucht. Ich habe es einfach nicht geschafft maven als variable zu setzen. Ansich ist die Anwendung nur intern also sie liegt an einem Ort und wird von einer person gleichzeitig genutzt daher ist das glaube ich in ordnung. Danke für dein link , so konnte ich mal eine pom richtig anschauen nicht nur fetzen.
 

Zurück
Oben