나는 최근에 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>