Zastanawiałem się ostatnio, dlaczego elasticsearch cienia i przenosi kilka (ale nie wszystkie) z jego zależności. Oto wyjaśnienie od opiekuna projektu, @kimchy :
Część cieniująca jest celowa, zacienione biblioteki, których używamy w elasticsearch, są przeznaczone do wszystkich celów elasticsearch, zastosowana wersja jest ściśle powiązana z tym, co ujawnia elasticsearch i jak korzysta z biblioteki w oparciu o wewnętrzne funkcje biblioteki (i że zmiany między wersjami), netty i guava są świetnymi przykładami.
Przy okazji, nie mam problemu z zapewnieniem kilku słoików z elastycznymi badaniami, jeden z lucenem nie zacieniowanym, a drugi z Lucene zacieniowanym. Nie jestem jednak pewien, jak to zrobić za pomocą maven. Nie chcę na przykład oferować wersji, która nie powoduje cieniowania Netty / Jacksona, ze względu na głębokie intymne użycie, które ma wraz z nimi elasticsearch (na przykład za pomocą nadchodzącego ulepszenia buforowania w dowolnej poprzedniej wersji Netty, z wyjątkiem obecnej faktycznie zużywają więcej pamięci w porównaniu do używania znacznie mniej).
- https://github.com/elasticsearch/elasticsearch/issues/2091#issuecomment-7156766
I kolejny tutaj od Drawr :
Cieniowanie jest ważne, aby nasze zależności (zwłaszcza netty, lucene, guava) były blisko naszego kodu, abyśmy mogli rozwiązać problem, nawet jeśli dostawca usług nadrzędnych pozostaje w tyle. Możliwe, że będziemy rozpowszechniać zmodularyzowane wersje kodu, które pomogłyby w rozwiązaniu konkretnego problemu (na przykład # 2091), ale obecnie nie możemy po prostu usunąć zacienionych zależności. Możesz zbudować lokalną wersję ES do swoich celów, dopóki nie będzie lepszego rozwiązania.
- https://github.com/elasticsearch/elasticsearch/pull/3244#issuecomment-20125452
To jest jeden przypadek użycia. Przykładem ilustrującym jest użycie wtyczki maven-shadow-plugin w pom.xml elasticsearch (v0.90.5). Te artifactSet::include
linie instrukcji co co Zależności pociągnąć do słoika uber (w zasadzie, są one rozpakowane i i re-zapakowanego obok klas własnych elasticsearch kiedy słoik cel elasticsearch jest produkowany. (W przypadku, gdy nie wiedzą o tym już, plik JAR jest tylko plik ZIP, który zawiera klasy programu, zasoby itp. oraz niektóre metadane. Możesz go wyodrębnić, aby zobaczyć, jak jest złożony.)
Te relocations::relocation
linie są podobne, z tym że w każdym przypadku, ale także zastosować określone substytucje klas zależność jest - w tym przypadku, przynosząc je pod org.elasticsearch.common
.
Wreszcie filters
sekcja wyklucza niektóre elementy z docelowego pliku JAR, które nie powinny tam być - takie jak metadane JAR, pliki kompilacji mrówek, pliki tekstowe itp., Które są spakowane z pewnymi zależnościami, ale które nie należą do zwykłego pliku JAR.
<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>