Me preguntaba recientemente por qué Elasticsearch sombrea y reubica algunas (pero no todas) de sus dependencias. Aquí hay una explicación del responsable del proyecto, @kimchy :
La parte sombreada es intencional, las bibliotecas sombreadas que utilizamos en elasticsearch son para todo propósito y parte de elasticsearch, la versión utilizada está estrechamente vinculada a lo que expone elasticsearch y cómo utiliza la biblioteca en función de las funciones internas de la biblioteca (y que cambia entre versiones), netty y guayaba son excelentes ejemplos.
Por cierto, no tengo ningún problema con proporcionar varios frascos de búsqueda elástica, uno con lucene sin sombra y otro con Lucene sombreado. Sin embargo, no estoy seguro de cómo hacerlo con Maven. No quiero proporcionar una versión que no sombree netty / jackson, por ejemplo, debido al uso profundo e intimido que elasticsearch tiene con ellos (por ejemplo, usar la próxima mejora de amortiguación con cualquier versión anterior de netty, excepto la actual) en realidad usa más memoria en comparación con usar considerablemente menos).
- https://github.com/elasticsearch/elasticsearch/issues/2091#issuecomment-7156766
Y otro aquí de drewr :
El sombreado es importante para mantener nuestras dependencias (especialmente netty, lucene, guava) cerca de nuestro código para que podamos solucionar un problema, incluso si el proveedor ascendente se queda atrás. Es posible que distribuyamos versiones modularizadas del código, lo que ayudaría con su problema particular (# 2091, por ejemplo), pero no podemos simplemente eliminar las dependencias sombreadas en este momento. Puede crear una versión local de ES para sus propósitos hasta que haya una mejor solución.
- https://github.com/elasticsearch/elasticsearch/pull/3244#issuecomment-20125452
Entonces, ese es un caso de uso. En cuanto a un ejemplo ilustrativo, a continuación se muestra cómo se utiliza maven-shade-plugin en pom.xml de elasticsearch (v0.90.5). Las artifactSet::include
líneas le indican qué dependencias extraer en el uber JAR (básicamente, se descomprimen y se vuelven a empaquetar junto con las propias clases de elasticsearch cuando se produce el jar de elasticsearch de destino. solo un archivo ZIP que contiene las clases, los recursos, etc. del programa y algunos metadatos. Puede extraer uno para ver cómo se combina).
Las relocations::relocation
líneas son similares, excepto que en cada caso también aplican las sustituciones especificadas a las clases de la dependencia; en este caso, las clasificamos org.elasticsearch.common
.
Finalmente, la filters
sección excluye algunas cosas del JAR de destino que no deberían estar allí, como metadatos JAR, archivos de construcción de ant, archivos de texto, etc. que están empaquetados con algunas dependencias, pero que no pertenecen a un 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>