Нещодавно мені було цікаво, чому еластичний пошук відтіняє і переносить кілька (але не всі) його залежностей. Ось пояснення від керівника проекту @kimchy :
Затінювальна частина є навмисною, затінені бібліотеки, які ми використовуємо в еластичному дослідженні, є частиною будь-яких намірів і цілей, але використовувана версія прив'язується до того, що розкривається еластичним пошуком і як він використовує бібліотеку, виходячи з внутрішніх принципів роботи бібліотеки (і які змінюються між версіями), netty та guava - чудові приклади.
До речі, я не маю жодних проблем із наданням декількох баночок з еластичним пошуком, один з люценом, не затіненим, а один з люценом. Не знаю, як це зробити з Maven. Я не хочу наводити версію, яка не затінює netty / jackson, наприклад, через глибоке залякування використання elastsearch із ними (наприклад, використання майбутнього покращення буферизації з будь-якою попередньою версією netty, крім поточної фактично використовуйте більше пам'яті порівняно зі значно меншим використанням).
- https://github.com/elasticsearch/elasticsearch/isissue/2091#issuecomment-7156766
І ще тут від drewr :
Затінення важливо, щоб наші залежності (особливо сітчаста, люценова, гуава) були близькими до нашого коду, щоб ми могли вирішити проблему, навіть якщо постачальник вище за течією відстає. Можливо, ми розповсюдимо модульовані версії коду, які допоможуть у вашій конкретній проблемі (наприклад, №2091), але наразі ми не можемо просто усунути затінені залежності. Ви можете побудувати локальну версію ES для своїх цілей, поки не знайдеться кращого рішення.
- https://github.com/elasticsearch/elasticsearch/pull/3244#issuecomment-20125452
Отже, це один випадок використання. Що стосується наочного прикладу, нижче наведено те, як maven-shadow-plugin використовується у ela.seml pom.xml (v0.90.5). У artifactSet::include
лінії вчи його , що залежно тягнути в прибери JAR ( в основному, вони розпакували і і повторно упакований ряд власних класів elasticsearch, коли цільова elasticsearch банку проводиться. (У разі , якщо ви не знаєте , це вже, баночка файл просто ZIP-файл, який містить класи, ресурси програми тощо, а також деякі метадані. Ви можете витягнути один, щоб побачити, як вони складаються.)
Ці relocations::relocation
рядки схожі, за винятком того, що в кожному разі вони також застосовуються зазначені заміни до класів залежно в - в цьому випадку, в результаті чого їх під org.elasticsearch.common
.
Нарешті, filters
розділ виключає деякі дані з цільової JAR, які не повинні бути там - такі як метадані JAR, файли збірки мурашок, текстові файли тощо, які упаковані з деякими залежностями, але які не належать до JAR uber.
<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>