나는 최근에 elasticsearch가 왜 (그리고 전부는 아니지만) 그 의존성을 옮기고 있는지 궁금해하고있었습니다. 다음은 프로젝트 관리자 인 @kimchy 의 설명입니다 .
음영 처리 부분은 의도적이며, elasticsearch에서 사용하는 음영 처리 된 라이브러리는 elasticsearch의 모든 의도 및 목적 부분에 사용되며, 사용되는 버전은 elasticsearch가 노출하는 내용 및 라이브러리 작동 방식 (및 내부 작동 방식)을 기반으로 라이브러리를 사용하는 방법에 밀접하게 연결되어 있습니다. 네티와 구아바는 버전 간 변경이 좋은 예입니다.
Btw, 나는 실제로 여러 개의 탄성 검색 병을 제공하는 데 아무런 문제가 없습니다. 하나는 lucene이 음영 처리되지 않은 것이고 다른 하나는 Lucene이 음영 처리되어 있습니다. 그래도 maven으로 어떻게하는지 모르겠습니다. 예를 들어, Elasticsearch가 가지고있는 긴밀한 사용법으로 인해 예를 들어 netty / jackson을 가리지 않는 버전을 제공하고 싶지 않습니다 (예 : 현재 버전을 제외한 이전 버전의 netty에서 곧 버퍼링 개선 사용) 실제로 훨씬 적은 메모리를 사용하는 것과 비교하여 더 많은 메모리를 사용합니다).
-https : //github.com/elasticsearch/elasticsearch/issues/2091#issuecomment-7156766
그리고 drawr의 또 다른 여기 :
쉐이딩은 의존성 (특히 netty, lucene, guava)을 코드와 가깝게 유지하여 업스트림 공급자가 뒤쳐져도 문제를 해결할 수 있도록하는 데 중요합니다. 특정 문제에 도움이되는 모듈화 된 코드 버전을 배포 할 수 있지만 (예 : # 2091) 현재 음영 처리 된 종속성을 제거 할 수는 없습니다. 더 나은 솔루션이 될 때까지 목적에 맞게 로컬 ES 버전을 구축 할 수 있습니다.
-https : //github.com/elasticsearch/elasticsearch/pull/3244#issuecomment-20125452
이것이 하나의 유스 케이스입니다. 예시적인 예를 들어, 다음은 elasticsearch의 pom.xml (v0.90.5)에서 maven-shade-plugin이 사용되는 방법입니다. 이 artifactSet::include줄은 uber JAR로 가져올 종속성을 지시합니다 (기본적으로 대상 elasticsearch jar이 생성 될 때 elasticsearch의 자체 클래스와 함께 압축이 풀리고 다시 패키지됩니다 (이미 알 수없는 경우 JAR 파일은 프로그램의 클래스, 리소스 등이 포함 된 ZIP 파일과 일부 메타 데이터가 포함되어 있습니다. 파일을 추출하여 구성 방법을 확인할 수 있습니다.)
relocations::relocation이 경우, 아래를 데려 - 라인은 각각의 경우에 그들은 또한 의존성의 클래스에 지정된 대체를 적용하는 것을 제외하고 유사하다 org.elasticsearch.common.
마지막 filters으로이 섹션에서는 대상 메타 데이터, 개미 빌드 파일, 텍스트 파일 등과 같이 종속 항목으로 패키지화되었지만 uber JAR에는 속하지 않는 대상 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>