Recentemente, fiquei me perguntando por que a pesquisa elástica obscurece e realoca algumas (mas não todas) de suas dependências. Aqui está uma explicação do mantenedor do projeto, @kimchy :
A parte de sombreamento é intencional, as bibliotecas sombreadas que usamos na elasticsearch são parte integrante da pesquisa elástica, a versão usada está intimamente ligada ao que a elasticsearch expõe e como ela usa a biblioteca com base nos detalhes internos de como a biblioteca funciona (e que muda entre versões), netty e goiaba são ótimos exemplos.
Aliás, não tenho nenhum problema em fornecer vários frascos de pesquisa elástica, um com lucene não sombreado e outro com lucene sombreado. Não tenho certeza como fazê-lo com maven embora. Não quero fornecer uma versão que não sombreie netty / jackson, por exemplo, por causa do uso intimidador profundo que a elasticsearch tem com eles (por exemplo, usar a próxima melhoria de armazenamento em buffer com qualquer versão anterior do netty, exceto a atual na verdade, use mais memória em comparação com o uso consideravelmente menor).
- https://github.com/elasticsearch/elasticsearch/issues/2091#issuecomment-7156766
E outro aqui de drewr :
O sombreamento é importante para manter nossas dependências (principalmente netty, lucene, goiaba) próximas ao nosso código, para que possamos corrigir um problema, mesmo que o provedor upstream fique para trás. É possível que distribuamos versões modularizadas do código, o que ajudaria em seu problema específico (nº 2091, por exemplo), mas não podemos simplesmente remover as dependências sombreadas no momento. Você pode criar uma versão local do ES para seus propósitos até que haja uma solução melhor.
- https://github.com/elasticsearch/elasticsearch/pull/3244#issuecomment-20125452
Então, esse é um caso de uso. Como exemplo ilustrativo, abaixo está como o maven-shade-plugin é usado no pom.xml da elasticsearch (v0.90.5). oartifactSet::include
linhas o instruem sobre quais dependências extrair no JAR uber (basicamente, são descompactadas e empacotadas juntamente com as próprias classes do elasticsearch quando o jar de elasticsearch de destino é produzido. (Caso você ainda não saiba disso, um arquivo JAR é apenas um arquivo ZIP que contém as classes, recursos, etc. do programa e alguns metadados. Você pode extrair um para ver como ele é montado.)
As relocations::relocation
linhas são semelhantes, exceto que, em cada caso, elas também aplicam as substituições especificadas às classes de dependência - nesse caso, trazendo-as para baixo org.elasticsearch.common
.
Finalmente, a filters
seção exclui algumas coisas do JAR de destino que não deveriam estar lá - como metadados JAR, arquivos de construção de formigas, arquivos de texto etc. que são empacotados com algumas dependências, mas que não pertencem a um JAR superior.
<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>