Gần đây tôi đã tự hỏi tại sao sắc thái tìm kiếm và thay đổi một vài (nhưng không phải tất cả) các phụ thuộc của nó. Đây là lời giải thích từ người bảo trì dự án, @kimchy :
Phần tô bóng là có chủ ý, các thư viện được tô bóng mà chúng tôi sử dụng trong elaticsearch dành cho tất cả mục đích và phần mục đích của elaticsearch, phiên bản được sử dụng gắn chặt với những gì elaticsearch tiếp xúc và cách nó sử dụng thư viện dựa trên nội bộ về cách thư viện hoạt động (và thay đổi giữa các phiên bản), netty và ổi là những ví dụ tuyệt vời.
Btw, tôi không có vấn đề gì với việc thực sự cung cấp một vài lọ thuốc thuật, một cái có lucene không được tô bóng, và một cái có Lucene được tô bóng. Không chắc chắn làm thế nào để làm điều đó với maven mặc dù. Ví dụ, tôi không muốn cung cấp một phiên bản không che giấu netty / jackson, vì sử dụng el elearch sâu sử dụng sâu sắc với họ (ví dụ: sử dụng cải tiến đệm sắp tới với bất kỳ phiên bản netty nào trước đây ngoại trừ phiên bản hiện tại thực sự sử dụng nhiều bộ nhớ hơn so với sử dụng ít hơn đáng kể).
- https://github.com/elaticsearch/elaticsearch/issues/2091#issuecomment-7156766
Và một cái khác ở đây từ drewr :
Việc tạo bóng rất quan trọng để giữ cho các phụ thuộc của chúng tôi (đáng chú ý là nhỏ, lucene, ổi) gần với mã của chúng tôi để chúng tôi có thể khắc phục sự cố ngay cả khi nhà cung cấp ngược dòng tụt lại phía sau. Có thể chúng tôi sẽ phân phối các phiên bản đã được mô đun hóa của mã, điều này sẽ giúp giải quyết vấn đề cụ thể của bạn (ví dụ # 2091), nhưng chúng tôi không thể loại bỏ các phụ thuộc được tô bóng tại thời điểm này. Bạn có thể xây dựng một phiên bản ES cục bộ cho mục đích của mình cho đến khi có giải pháp tốt hơn.
- https://github.com/elaticsearch/elaticsearch/pull/3244#issuecomment-20125452
Vì vậy, đó là một trường hợp sử dụng. Đối với một ví dụ minh họa, dưới đây là cách maven-bóng-plugin được sử dụng trong pom.xml của elSTERearch (v0.90.5). CácartifactSet::include
dòng hướng dẫn cho nó những gì phụ thuộc để kéo vào JAR uber (về cơ bản, chúng được giải nén và được đóng gói lại cùng với các lớp riêng của elaticsearch khi sản phẩm jar tìm kiếm mục tiêu được tạo ra (Trong trường hợp bạn chưa biết điều này, thì tệp JAR là chỉ là một tệp ZIP chứa các lớp, tài nguyên của chương trình, v.v. và một số siêu dữ liệu. Bạn có thể trích xuất một tệp để xem cách nó được kết hợp với nhau.)
Các relocations::relocation
dòng tương tự nhau, ngoại trừ trong mỗi trường hợp, chúng cũng áp dụng các thay thế được chỉ định cho các lớp của phụ thuộc - trong trường hợp này, đưa chúng vào dưới org.elasticsearch.common
.
Cuối cùng, filters
phần này loại trừ một số nội dung khỏi JAR mục tiêu không nên có trong đó - chẳng hạn như siêu dữ liệu JAR, tệp kiến tạo, tệp văn bản, v.v. được đóng gói với một số phụ thuộc, nhưng không thuộc 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>