Я недавно задавался вопросом, почему эластичный поиск затеняет и перемещает некоторые (но не все) его зависимости. Вот объяснение от сопровождающего проекта @kimchy :
Затенение является преднамеренным, затененные библиотеки, которые мы используем в эластичном поиске, предназначены для всех целей и целей части эластичного поиска, используемая версия тесно связана с тем, что демонстрирует эластичный поиск, и как она использует библиотеку, основываясь на внутренних принципах работы библиотеки (и что изменения между версиями), нетти и гуава являются отличными примерами.
Кстати, у меня нет проблем с тем, чтобы на самом деле предоставить несколько банок с эластичным поиском, один с не затененным люценом, а другой с затененным люценом. Не уверен, как это сделать с Maven, хотя. Я не хочу предоставлять версию, которая не затеняет нетти / джексона, например, из-за глубокого запугивания использования, которое имеет с нимиasticsearch (например, использование предстоящего улучшения буферизации с любой предыдущей версией netty, за исключением текущей, будет на самом деле использовать больше памяти по сравнению с использованием значительно меньше).
- https://github.com/elasticsearch/elasticsearch/issues/2091#issuecomment-7156766
И еще один здесь от drewr :
Затенение важно для того, чтобы наши зависимости (в частности, netty, lucene, guava) были близки к нашему коду, чтобы мы могли исправить проблему, даже если вышестоящий провайдер отстает. Возможно, мы будем распространять модульные версии кода, которые помогут решить вашу конкретную проблему (например, # 2091), но в настоящее время мы не можем просто удалить затененные зависимости. Вы можете создать локальную версию ES для своих целей, пока не найдете лучшего решения.
- https://github.com/elasticsearch/elasticsearch/pull/3244#issuecomment-20125452
Итак, это один из вариантов использования. Что касается иллюстративного примера, ниже показано, как maven-shade-plugin используется в файле pse.xml эластичного поиска (v0.90.5). В artifactSet::include
линии учи его , что зависимости тянуть в убер JAR ( в основном, они распаковали и и повторно упакованный ряд собственных классов elasticsearch, когда целевая elasticsearch банка производится. (В случае , если вы не знаете , это уже, баночка файл просто ZIP-файл, содержащий классы программы, ресурсы и т. д., а также некоторые метаданные. Вы можете извлечь один из них, чтобы увидеть, как он составлен.)
Эти relocations::relocation
строки похожи, за исключением того, что в каждом случае они также применяются указанные замены к классам зависимости в - в этом случае, в результате чего их под org.elasticsearch.common
.
Наконец, этот filters
раздел исключает некоторые вещи из целевого JAR-файла, которых там быть не должно - такие как метаданные JAR, файлы сборки ant, текстовые файлы и т. Д., Которые упакованы с некоторыми зависимостями, но которые не входят в UAR-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>