2015-01-30 4 views
8

Wir müssen ein JAR mithilfe von Maven so erstellen, dass alle Abhängigkeiten enthalten sind, aber auch, dass alle Abhängigkeiten umbenannt (verschoben) werden.Maven - Gibt es eine Möglichkeit, einfach ein 'Uber'-Glas mit allen Abhängigkeiten zu erstellen?

Sagen wir unsere eigenen Pakete alle mit com.mycompagny.projectx.* starten“. Wir wollen, dass die Projektabhängigkeiten ihr Paket beginnt mit umbenannt haben‚embedded‘, aber nicht unsere eigenen Klassen.

Mit maven-shade-plugin zum Beispiel, ich bin . nicht in der Lage, dies zu erreichen:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-shade-plugin</artifactId> 
    <version>2.3</version> 
    <configuration> 
     <shadedArtifactAttached>true</shadedArtifactAttached> 
     <createDependencyReducedPom>true</createDependencyReducedPom> 
     <artifactSet> 
      <includes> 
       <include>*.*</include> 
      </includes> 
     </artifactSet> 
     <relocations> 
      <relocation> 
       <pattern>*</pattern> 
       <shadedPattern>embedded.</shadedPattern> 
       <excludes> 
        <exclude>com.mycompagny.projectx.*</exclude> 
       </excludes> 
      </relocation> 
     </relocations> 
    </configuration> 
    <executions> 
     <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>shade</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

Hier <pattern>*</pattern> nicht gültig auch, wenn ich <pattern></pattern> (leere Zeichenkette) verwenden, wird dann alles auf die „embedded“ Paket verlegt, auch die Ressourcen (die „META -INF "di Pfarrhaus auch)! Natürlich wollen wir, dass die Ressourcen am Ursprung des Krugs bleiben.

Ich denke, wir mehr <relocation> Elemente schaffen könnten, einen für jedes Paket der Abhängigkeiten, aber das wäre eine Menge Arbeit: <relocation>com</relocation>, <relocation>net</relocation>, <relocation>javax</relocation> usw.

Jede Idee, wie leicht verlagern alle Abhängigkeiten innerhalb des Uber-Jar, ohne unsere eigenen Klassen, Ressourcen und das "META-INF" -Verzeichnis zu berühren?

Antwort

6

UPDATE: Diese Lösung funktioniert nicht wirklich, lesen Sie bitte bis zum Ende.

fand ich eine Lösung, die durch auf den Quellcode von maven-shade-plugin suchen! Es scheint nicht überall zu dokumentieren, aber es gibt einen <rawString> Parameter, die Sie ein <relocation> Element hinzufügen können, damit es die <pattern> und <shadedPattern> als regulären Ausdruck Muster und nicht als Paket/Dateinamen consideres.

Der maven-shade-plugin Code verwendet dann so etwas wie:

path.replaceAll(pattern, shadedPattern) 

mit diesen Mustern zu beschäftigen.

Beispiel:

<relocation> 
    <pattern>^([^/]*\.properties)$</pattern> 
    <shadedPattern>embedded/$1</shadedPattern> 
    <rawString>true</rawString> 
</relocation> 

Dies ist ein Dummy-Beispiel, welches alle Dateien .properties umzieht, die in der Wurzel sind. Mit dieser Technik wird es möglich sein, genau zu kontrollieren, was verlagert wird und wie, ich bin mir ziemlich sicher.

Hier ist ein besseres Beispiel, was das tut, was ich brauche (noch einige Tests obwohl zu tun):

<relocation> 
    <pattern>^(?!(com/mycompagny/|META-INF))(.*/.*)$</pattern> 
    <shadedPattern>embedded/$2</shadedPattern> 
    <rawString>true</rawString> 
</relocation> 

UPDATE: Leider dieses letzte Muster bedeutet, dass verwendet, um alles umbenannt werden, mit Ausnahme von „com. mycompagny "und der Ordner META-INF. Problem ist, Dinge wie java.lang.Object werden umbenannt! Und wenn der Code ausgeführt wird, werden Ausnahmen wie solche geworfen werden:

java.lang.ClassNotFoundException: embedded.java.lang.Object 
+0

Während dies Ihr Problem nicht gelöst hat ... Diese _IS_ eine äußerst nützliche undokumentierte Funktion.Ich habe Ressourcen, die in einen anderen Ordner verschoben werden mussten (nicht Quellcode und nicht in einer Paketstruktur). Danke für das Schreiben. – Lucas