Ich habe mich kürzlich gefragt, warum elasticsearch einige (aber nicht alle) seiner Abhängigkeiten schattiert und verlagert. Hier ist eine Erklärung des Projektbetreuers @kimchy :
Der Schattierungsteil ist beabsichtigt, die schattierten Bibliotheken, die wir in Elasticsearch verwenden, sind für alle Absichten und Zwecke Teil von Elasticsearch. Die verwendete Version ist eng mit dem verknüpft, was Elasticsearch verfügbar macht und wie es die Bibliothek verwendet, basierend auf den Interna der Funktionsweise der Bibliothek (und das wechselt zwischen den Versionen), Netty und Guave sind gute Beispiele.
Übrigens habe ich kein Problem damit, tatsächlich mehrere Gläser mit Elasticsearch bereitzustellen, eines mit nicht schattiertem Lucene und eines mit schattiertem Lucene. Ich bin mir nicht sicher, wie ich es mit Maven machen soll. Ich möchte keine Version bereitstellen, die zum Beispiel Netty / Jackson nicht schattiert, da Elasticsearch eine sehr enge Nutzung mit sich bringt (z. B. die bevorstehende Verbesserung des Pufferrings mit einer früheren Version von Netty mit Ausnahme der aktuellen Version verbrauchen tatsächlich mehr Speicher als erheblich weniger).
- https://github.com/elasticsearch/elasticsearch/issues/2091#issuecomment-7156766
Und noch eine hier von drawr :
Die Schattierung ist wichtig, um unsere Abhängigkeiten (insbesondere Netty, Lucene, Guave) nahe an unserem Code zu halten, damit wir ein Problem beheben können, selbst wenn der Upstream-Anbieter zurückbleibt. Es ist möglich, dass wir modularisierte Versionen des Codes verteilen, die bei Ihrem speziellen Problem helfen würden (z. B. # 2091), aber wir können die schattierten Abhängigkeiten derzeit nicht einfach entfernen. Sie können eine lokale Version von ES für Ihre Zwecke erstellen, bis es eine bessere Lösung gibt.
- https://github.com/elasticsearch/elasticsearch/pull/3244#issuecomment-20125452
Das ist also ein Anwendungsfall. Als anschauliches Beispiel sehen Sie unten, wie das Maven-Shade-Plugin in der pom.xml (v0.90.5) von elasticsearch verwendet wird. In den artifactSet::include
Zeilen wird angegeben, welche Abhängigkeiten in die über JAR gezogen werden sollen (im Grunde werden sie entpackt und zusammen mit den eigenen Klassen von elasticsearch neu gepackt, wenn das Ziel-Elasticsearch-JAR erstellt wird. (Falls Sie dies noch nicht wussten, handelt es sich um eine JAR-Datei Nur eine ZIP-Datei, die die Klassen, Ressourcen usw. des Programms und einige Metadaten enthält. Sie können eine extrahieren, um zu sehen, wie sie zusammengesetzt ist.)
Die relocations::relocation
Zeilen sind ähnlich, außer dass sie in jedem Fall auch die angegebenen Ersetzungen auf die Klassen der Abhängigkeit anwenden - in diesem Fall bringen sie sie unter org.elasticsearch.common
.
Schließlich filters
schließt der Abschnitt einige Dinge aus der Ziel-JAR aus, die nicht vorhanden sein sollten - wie JAR-Metadaten, Ant-Build-Dateien, Textdateien usw., die mit einigen Abhängigkeiten gepackt sind, aber nicht zu einer übergeordneten JAR gehören.
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
<configuration>
<minimizeJar>true</minimizeJar>
<artifactSet>
<includes>
<include>com.google.guava:guava</include>
<include>net.sf.trove4j:trove4j</include>
<include>org.mvel:mvel2</include>
<include>com.fasterxml.jackson.core:jackson-core</include>
<include>com.fasterxml.jackson.dataformat:jackson-dataformat-smile</include>
<include>com.fasterxml.jackson.dataformat:jackson-dataformat-yaml</include>
<include>joda-time:joda-time</include>
<include>io.netty:netty</include>
<include>com.ning:compress-lzf</include>
</includes>
</artifactSet>
<relocations>
<relocation>
<pattern>com.google.common</pattern>
<shadedPattern>org.elasticsearch.common</shadedPattern>
</relocation>
<relocation>
<pattern>gnu.trove</pattern>
<shadedPattern>org.elasticsearch.common.trove</shadedPattern>
</relocation>
<relocation>
<pattern>jsr166y</pattern>
<shadedPattern>org.elasticsearch.common.util.concurrent.jsr166y</shadedPattern>
</relocation>
<relocation>
<pattern>jsr166e</pattern>
<shadedPattern>org.elasticsearch.common.util.concurrent.jsr166e</shadedPattern>
</relocation>
<relocation>
<pattern>org.mvel2</pattern>
<shadedPattern>org.elasticsearch.common.mvel2</shadedPattern>
</relocation>
<relocation>
<pattern>com.fasterxml.jackson</pattern>
<shadedPattern>org.elasticsearch.common.jackson</shadedPattern>
</relocation>
<relocation>
<pattern>org.joda</pattern>
<shadedPattern>org.elasticsearch.common.joda</shadedPattern>
</relocation>
<relocation>
<pattern>org.jboss.netty</pattern>
<shadedPattern>org.elasticsearch.common.netty</shadedPattern>
</relocation>
<relocation>
<pattern>com.ning.compress</pattern>
<shadedPattern>org.elasticsearch.common.compress</shadedPattern>
</relocation>
</relocations>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/license/**</exclude>
<exclude>META-INF/*</exclude>
<exclude>META-INF/maven/**</exclude>
<exclude>LICENSE</exclude>
<exclude>NOTICE</exclude>
<exclude>/*.txt</exclude>
<exclude>build.properties</exclude>
</excludes>
</filter>
</filters>
</configuration>
</plugin>
</plugins>