Unterschied zwischen dem Extrahieren und Verpacken von Bibliotheken in eine JAR-Datei

73

Ich möchte den Unterschied zwischen dem Extrahieren und Packen von Bibliotheken in eine JAR-Datei aus Eclipse mit der Ausführung der ausführbaren JAR-Datei kennen.

Was soll ich auswählen, wenn mein Programm (ausführbares JAR) andere Klassen verwendet, für die diese externen Bibliotheken (JAR) erforderlich sind?

ctekk
quelle

Antworten:

51

Wenn Sie Gläser in Ihre generierte JAR-Datei einfügen möchten, können Sie die Verpackungsmethode verwenden. Wenn Sie beispielsweise eine Apache-Bibliothek oder andere Jars von Drittanbietern verwenden, möchten Sie diese Jars möglicherweise in Ihrem generierten Jar aufbewahren. Verwenden Sie in diesem Fall die Verpackung. Mit der Option "Erforderliche Bibliotheken in eine JAR-Datei packen" werden org.eclipse.jdt.internal.jarinjarloaderPaketklassen in Ihre generierte Datei eingefügt, und dieses Paket befindet sich direkt im Stammverzeichnis der generierten JAR-Datei. Diese Option erstellt aufgrund der JAR-Loader-Klassen von Eclipse auch eine größere JAR-Datei in Bezug auf die Größe.

Das Extrahieren der erforderlichen Bibliotheken führt dazu, dass Klassen von Bibliotheken von Drittanbietern in Ihre JAR-Datei eingefügt werden, indem die Paketbenennungskonvention befolgt wird. Wenn Sie beispielsweise Ihren JAR-Inhalt öffnen, werden unter Klassen einige Klassen org.apache..angezeigt.

Die Einträge der Hauptklasse unterscheiden sich zwischen den MANIFEST.MFDateien dieser JAR-Dateien:

Hauptklasseneintrag beim Packen der erforderlichen Bibliotheken:

Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader

Hauptklasseneintrag beim Extrahieren der erforderlichen Bibliotheken:

Main-Class: YourMainClass
Juvanis
quelle
5
Was ist dann der Vorteil oder die Verwendung von Packen?
Ctekk
2
Durch Packen können Sie JAR-Dateien über die Klasse "JarRsrcLoader" in Ihr generiertes JAR laden. Wenn Sie Jars von Drittanbietern verwenden und Ihren Anwendungscode mit diesen Jars kombinieren möchten, können Sie das Verpackungsdienstprogramm von eclipse wie folgt verwenden. siehe meine bearbeitete Antwort.
Juvanis
12
Vorsicht vor Leistungsproblemen. Ich habe meine Bibliotheksgläser bis gestern mit jarinjarloader in mein Anwendungsglas gepackt. Nachdem ich JRE auf Version 8, Update 31 (unter Windows) aktualisiert hatte, wurde die Ausführung meiner Anwendung erheblich langsamer (bis zu 10x). Das Problem wurde gelöst, als ich mich entschied, den Inhalt von Bibliotheksgläsern in mein Glas zu extrahieren.
Giuseppe
Sicherlich @Giuseppe, dass der Leistungstreffer nur auftritt, wenn die Klasse geladen wird. Sobald die Anwendung ausgeführt wird, sollte es keinen Unterschied mehr machen ...
MikeW
1
@ MikeW Das ist, was Sie denken würden, aber meine Anwendung war immer noch um eine Größenordnung langsamer als die ganze Zeit mit "Paket". Durch Auswahl der Option "Extrahieren" wird die Leistung erheblich beschleunigt.
dminear
3

Für mich besteht der Hauptunterschied darin, dass verpackte JAR-Dateien als eigenständiges Element intakt enthalten sind und daher ihre Copyright-Informationen und Signaturdaten beibehalten.

Wenn Sie Extrahieren wählen , werden die Klassendateien aus ihrem ursprünglichen Kontext herausgezogen und so gespeichert, als hätten Sie sie erstellt, wodurch möglicherweise einige Lizenzbedingungen verletzt werden, obwohl die Größe der endgültigen JAR in diesem Fall kleiner ist. Eclipse warnt Sie auch in diesem Fall vor einer Lizenzierung.

Wenn Sie also JAR-Bibliotheken von Drittanbietern verwenden, ist es professionell, immer zu verpacken .

MikeW
quelle
0

Probieren Sie es in beide Richtungen aus und öffnen Sie die resultierenden JAR-Dateien mit einem Zip-Programm. Sehr lehrreich.

Bobanahalf
quelle