Wir müssen mit Maven ein Jar erstellen, in dem alle Abhängigkeiten enthalten sind, aber auch, dass all diese Abhängigkeiten umbenannt (verschoben) werden.
Nehmen wir an, unsere eigenen Pakete beginnen alle mit com.mycompagny.projectx.*
". Wir möchten, dass die Projektabhängigkeiten ihre Pakete umbenennen, indem sie mit" embedded
"beginnen, aber nicht mit unseren eigenen Klassen.
Mit maven-shade-plugin zum Beispiel, I ' Ich kann das nicht erreichen:
%Vor% Hier ist <pattern>*</pattern>
nicht gültig. Wenn ich <pattern></pattern>
(leere Zeichenfolge) verwende, wird alles in das "embedded" -Paket verschoben, sogar die Ressourcen (auch das "META-INF" -Verzeichnis)! Natürlich wollen wir, dass die Ressourcen am Ursprung des Jar bleiben.
Ich denke, wir könnten mehrere <relocation>
-Elemente erstellen, eines für jedes Paket der Abhängigkeiten, aber das wäre eine Menge Arbeit: <relocation>com</relocation>
, <relocation>net</relocation>
, <relocation>javax</relocation>
, etc.
Gibt es eine Idee, wie man alle Abhängigkeiten im uber jar leicht verschieben kann, ohne unsere eigenen Klassen, Ressourcen und das "META-INF" -Verzeichnis zu berühren?
UPDATE: Diese Lösung funktioniert nicht wirklich, bitte lesen Sie bis zum Ende.
Ich habe eine Lösung gefunden, indem ich auf den Quellcode von maven-shade-plugin
! Es scheint nirgends dokumentiert zu sein, aber es gibt einen <rawString>
Parameter, den Sie zu einem <relocation>
Element hinzufügen können, so dass die <pattern>
und <shadedPattern>
als berücksichtigt werden Regulärer Ausdruck Muster und nicht als Paket / Dateinamen.
Der maven-shade-plugin
Code verwendet dann etwas wie:
Um mit diesen Mustern umzugehen.
Beispiel:
%Vor%Dies ist ein Dummy-Beispiel, das alle .properties-Dateien verschiebt, die sich im Stammverzeichnis befinden. Mit dieser Technik wird es möglich sein, genau zu steuern, was verschoben wird und wie, ich bin mir ziemlich sicher.
Hier ist ein besseres Beispiel, das tut, was ich brauche (noch einige Tests zu tun):
%Vor% UPDATE: Leider bedeutet dieses letzte Muster, dass alles, was benutzt wird, umbenannt wird, mit Ausnahme von "com.mycompagny" und dem Ordner META-INF. Problem ist, Dinge wie java.lang.Object
werden umbenannt! Und wenn der Code ausgeführt wird, werden Ausnahmen wie diese geworfen:
Tags und Links java maven jar maven-shade-plugin