intellij JAR-Erzeugung mit signierter Library

Die Einbindung einer Bibliothek (egal ob „unsigniert“ oder „signiert“) erfolgt immer nach dem gleichen Muster, wie ich es Euch im Artikel intellij JAR-Erzeugung mit Library gezeigt habe. Auch der Programmstart in einer Entwicklungsumgebung wie intelliJ IDEA wird reibungslos funktionieren.

Sobald Ihr aber eine JAR-Datei erzeugt und dann ausführt, könntet Ihr über diesen heftigen Fehlerhinweis stolpern:

An dieser Stelle verzweifeln viele Programmierer und denken – „wo liegt der Fehler im Programm – in der IDE hat doch alles funktioniert?“. Die gute Nachricht ist: der Fehler liegt nicht im Programm, sondern ist in der eingebundenen Bibliothek begründet.

Schauen wir uns ein Beispielprojekt an, welches einen Bezug zu unserem Thema „javacrypto hat“. Ihr benötigt dazu die Crypto-Bibliothek „bouncy castle“, welche Ihr am Besten von der Webseite der Entwickler herunterladet: http://www.bouncycastle.org/latest_releases.html und dann die aktuelle JAR-Datei aus „Signed Files“ / „Provider“ für Java 11 herunterladet (hier Version 1.64, Dateiname: bcprov-jdk15on-164.jar).

Ihr bindet die Datei wir im Beispiel intellij JAR-Erzeugung mit Library gezeigt ein, erzeugt eine JAR-Datei und führt diese aus. Die oben gezeigte Fehlermeldung folgt auf dem Fuß – doch woran liegt es?

Auf der bouncycastle-Webseite wird schon beim Download darauf hingewiesen, das es sich um eine „signed jar“ handelt und dieses ist ein Sicherheitsmerkmal. Der Inhalt der bouncycastle-JAR-Datei ist mit einer elektronischen Signatur gegen Veränderungen geschützt und wir können uns diese Signatur auch anschauen, denn eine JAR-Datei ist eine gezippte Sammlung von Java-Klassen. Wenn Ihr das „jar“ am Ende des Dateinamens in ein „zip“ umwandelt und dann entpackt, erhaltet Ihr diesen Inhalt im Unterordner „META-INF“:

Die DSA- und SF-Dateien enthalten die öffentlichen Schlüssel für die interne Überprüfung der Dateien. Durch die Einbindung der bouncycastle-JAR-Datei in die neu erzeugte JAR-Datei stimmen die Schlüssel nicht mehr mit dem Original-JAR-Paket überein und wir erhalten die obige „Security exception“. Wie bekomme ich denn nun die bouncycastle-Datei „mitverpackt“?

Es gibt Tipps im Internet, welche einfach die Löschung der Schlüsseldateien aus der bouncycastle-JAR-Datei anregen. Das Programm wird dann starten, aber im weiteren Programmverlauf kann es zu heftigen und vor Allem unerklärlichen Fehlermeldungen komme. daher mein Rat: Finger weg!

Der richtige Weg besteht in einer etwas anderen JAR-Erzeugung und Weitergabe von 2 Dateien – zum Einen der Programmdatei und zum Anderen der bouncycastle-JAR-Datei.

Wir erzeugen das Artifact in intelliJ IDEA analog zum Artikel intellij JAR-Erzeugung mit Library, allerdings wählen wir in Schritt 04 den Punkt „copy to the output directory and link via manifest“:

Ihr erhaltet dann dieses Fenster, das Ihr mit „OK“ schliesst:

Auffallend ist, das der Type nun nicht mehr „Java“ ist sondern „other“. Nun erzeugt Ihr die JAR-Datei mittels „Build“ – „Build Artifacts“ und in der Projektansicht sind im Artifacts-Ordner diese beiden Dateien zu finden:

Untersere Programmdatei „intelliJCreateJarWithSignedLibrary.jar“ führe ich wie gewohnt aus, wobei die councycaste-JAR-Datei im Programmverzeichnis liegen muss. Hier ist das Ergebnis:

Damit seid Ihr nun in der Lage, fremde Bibliotheken in intelliJ IDEA einzubinden und JAR-Dateien zu erstellen.

Alle Quellcodes zu intelliJ IDEA findet Ihr zum Download in meinem Github-Repository, welches Ihr über diesen Link erreicht: https://github.com/java-crypto/intelliJ-IDEA. Alle Programme sind unter Java 11 lauffähig (vermutlich auch unter Java 8) und wurden mit intelliJ IDEA entwickelt, welches für das eigene „Spielen“ notwendig ist.

Die Lizenz zum obigen Beispiel findet Ihr auf der eigenen Lizenz-Seite.

Letzte Bearbeitung: 08.01.2020