Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Maven erzeugt package ohne Bibliotheken (Libaries, Dependencies)
ich habe ein Programm geschrieben welches als Libary Apache PDFBox verwendet, das Programm lässt sich in Netbeans ausführen und tut was es soll.
Erzeuge ich mit mvn package das Programm, es lässt sich starten aber wirft eine Exception:
Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: org/apache/pdfbox/Loader
Das sagt mir das die Bibliothek fehlt.
Zwei Möglichkeiten:
1. Du legst alle Abhängigkeiten zu der erzeugten jar Datei in einem Unterverzeichnis lib. Also Du hast dann eine Struktur wie:
PDFView-1.0-SNAPSHOT.jar
lib/pdfbox-3.0.2.jar
lib/...
Um die Abhängigkeiten zu bekommen, kannst Du das dependency Plugin nutzen. Dann musst Du da nicht selbst alle Abhängigkeiten heraus suchen.
2. Du erstellst ein "fat jar", d.h. alle Abhängigkeiten kommen mit in das jar file rein. Da dazu die Abhängigkeiten entpackt und der Inhalt einfach mit in Dein jar gepackt wird, kann es dabei diverse Probleme geben wie mehrfach vorhandene Dateien, Service-Beschreibungen, Signaturen, ...
Das ist unter dem Strich aber relativ einfach zu handhaben. Den Eintrag von dem jar Plugin kannst Du ganz entfernen, da auch das Manifest vom shade Plugin geschrieben werden kann. Wie das aussehen könnte kannst Du z.B. unter JavaMavenApp/pom.xml at main · kneitzel/JavaMavenApp (github.com) finden - Der shade Plugin Eintrag ist im Profil fatjar dort und sieht da so aus:
Die Dokumentation dieses Teils habe ich aber noch nicht geschrieben ... in ganz kurz:
Durch die ersten Zwei Einträge mit true und full wird dafür gesorgt, dass das original jar nicht ersetzt wird. Statt dessen wird ein neues jar File geschrieben, welches dann auf -full.jar enden wird.
ServicesResourceTransformer sorgt dafür, dass alles rund um Services richtig übernommen wird.
Dann das Manifest....
Am Ende kommen die Filer Einträge - da kann man mehrere filter angeben. Zuerst kommt immer, auf welche artifacte es sich beziehen sollte in der Form groupId:artefactId - hier : also alle Artefacts.
Dann kommt, was herausgenommen werden soll. Da sind also bestehende Manifeste, Modulbeschreibungen und die letzten drei sind Signaturen.
Du kannst Dir also eine von den beiden Lösungen überlegen. Das ist ein exclusive oder, also entweder machst Du Idee 1 oder Idee 2
PS: Evtl. ist aber auch der Weg über jpackage interessant. Das findet sich in dem angegebenen pom in dem Profile image.
WOW, was für eine starke Antwort!!, danach habe ich lange gegoogelt
VIELEN DANK
Ich war bis jetzt der Meinung, Maven übernimmt alle Bibiliotheken beim packen für mich.
Methode 1 habe ich gerade probiert, habe in dem Ordner in dem das jar file liegt ein Verzeichnis lib erstellt und die pdfbox-3.0.2.jar eingefügt, leider findet das Java Programm trotzdem nicht die Bibliothek.Weiß Java von Haus aus das die Bibliotheken im lib Verzeichnis liegen?
Also hier gibt es mehrere Punkte, die wichtig sind:
a) Transitive Abhängigkeiten
pdfbox hat wiederum Abhängigkeiten. Du musst also auch die Abhängigkeiten der Abhängigkeiten bereit stellen.
Da hilft dann oft das bereits erwähnte dependency Plugin.
Einfach mal der Versuch, etwas zusammen zu schreiben für Dich:
Das sollte Dir - so ich jetzt nichts übersehen habe - im target Ordner ein Ordner lib erzeugen mit allen Abhängigkeiten.
b) Pfade
Ich muss gestehen, dass ich selbst mit dieser Methode noch nie viel gearbeitet habe bzw. mir nie massiv Gedanken gemacht habe. Ich meine, dass das lib Verzeichnis, das du im Manifest als classpath mit angibst relativ zu der jar Datei ist. Das kann man aber zur Not austesten. Also in einem Terminal / Eingabeaufforderung es einfach mal starten per java -jar .... und das einmal aus dem Verzeichnis mit dem jar File und einmal aus einem anderen Verzeichnis ... aber ich denke, das es daran nicht liegt.
c) Fehlersuche
Bei der Fehlersuche solltest Du generell mehrere Dinge machen:
a) Die genaue Meldung solltest Du Dir anschauen bzw. bei Meldungen weiter gehen. Dabei ganz wichtig: Immer auch den ganzen Stacktrace mitgeben! Dann kann man z.B. schauen, welche Klasse nicht gefunden wurde (ich vermute es war eine Klasse einer transitiven Abhängigkeit. Aber wenn es eine Klasse der pdfbox Library war, dann wäre die Abhängigkeit schon nicht gefunden worden und Punkt b wäre wichtiger. (Derzeit vermute ich, dass de Thematik dort kein Problem ist / war).
Dann wäre es auch wichtig, einmal in die jar Datei hinein zu schauen und das Manifest im Detail zu betrachten. Was steht da genau drin? (Zur Not die jar Datei einfach in .zip umbenennen und dann so rein schauen.) Das Manifest findet sich im Ordner META-INF.
Zusammenfassung
Ich würde den Punkt a) als Doing umsetzen. Dann hast Du alle Abhängigkeiten von Maven zusammen kopiert bekommen. Damit kannst Du dann erneut testen. Wenn es nicht ausreicht, dann kannst Du mit b) noch auf der Kommandozeile einmal den Aufruf testen. Wenn es weiterhin nicht geht: Beachte c) wenn Du die weiteren Fehler meldest, damit wir ein paar mehr Anhaltspunkte haben.
Vielen Dank!!!
das mit dem Plugin hat leider nicht funktioniert, habe es auch direct hinzugefügt aber irgendwie will er es beim ausführen nicht finden.
Ich habe alle anderen Abhängigkeiten gefunden und ins lib Verzeichnis kopiert, das Programm läuft, unter Linux, YEAH.
Wenn ich es auf Windows ausführe kommt die Fehlermeldung "Error: unable to access jarfile PDFViewer.jar",
Auf Windows läuft ein Java JRE 8 Update 411, die Anwendung ist mit dem JDK 11 entwickelt, müssen die Versionen gleich sein?
Wenn Du java 11 genutzt hast, dann solltest Du auch ein entsprechendes Java unter Windows nutzen. (Du kannst auch eine neuere Version nutzen, aber es muss mindestens Java 11 sein!)
Bezüglich dem Problem mit dem Plugin: Hast Du ei Version eine Version eingetragen? Ich habe die Versionen immer in den Properties definiert, damit es einfacher ist, diese zu aktualisieren. Also entweder die Propertie <maven.dependency.plugin>3.6.1</maven.dependency.plugin> einfügen oder das ${maven.dependency.plugin} durch 3.6.1 ersetzen.
Es gibt keine JR höher als 8, mann muß anscheinend dann immer das jdk installieren?
Auf dem Window PC läuft das Programm jetzt auch, sehr fein, Dank Dir!
Die Version habe ich hinterlegt, auch habe ich das Plugin über Netbeans Maven direkt heruntergeladen aber auch hier wollte er es beim mvn package nicht finden, habe verschieden Dinge probiert und werde mich demnächst damit auseinandersetzen.
Jetzt bin ich erstmal beruhigt, weiß wie das alles funktioniert und zum Schluss das Programm auch startbar ist
Jein. Es wird von Oracle kein JRE mehr zum Download angeboten, weil das JDK modularisiert wurde und man bei Oracle der Meinung ist, dass es schneller und einfacher ist, für jede 50 KB große Anwendung ein darauf zugeschnittenes 50+ MB großes Runtime zu erstellen und als Paket auszuliefern (https://blogs.oracle.com/java-platform-group/faster-and-easier-use-and-redistribution-of-java-se)
Wenn Du den Build mit dem POM von @KonradN und dem Profil "image" durchführst, solltest Du ein "Anwendungsimage" erhalten, das neben den benötigten Jars auch das dazugehörige Runtime enthält.
Bezüglich dem Problem mit dem Dependency Plugin: Evtl. willst Du da noch Details teilen? Was mir noch eingefallen ist: Falls Du eine ältere Maven Version nutzt, dann kann es sein, dass das Plugin in der letzten Version zu neu ist. Aber man müsste die genaue Ausgabe / Meldung sehen.
Das mit dem Dependency Plugin interressiert mich, wenn das funktioniert mit dem was mihe7 schreibt inkl. runtime im Paket, wenn das mit openjdk funktioniert?
Ich werde das Freitag oder am Wochenende ausprobieren.
Und für Details bin ich ganz offen.
Vielen Dank euch beiden!!
Grüße Moritz
Wenn Dich das interessiert, dann musst Du aber mindestens Java 14 verwenden, also meine Empfehlung: Nutze Java 21 als aktuelle LTS Version.
(Vorher ist kein jpackage vorhanden)
Ich habe da auch angefangen, den Projektaufbau etwas zu dokumentieren, aber das ist noch etwas, das ich nicht abgeschlossen habe. Die Projekte enthalten aber einiges mehr wie z.B. auch
Check auf neue Versionen
Static Code Analyse per PMD und SpotBugs
(nur ohne JavaFX) Einbindung von GraalVM mit NativeImage
Aufbau einer Site mit JavaDoc und so.
Das sind so Projektrahmen, wie ich sie prinzipiell aufbauen würde und was da so aus meiner Sicht alles hinzu gehört.