Maven-shade-plugin: исключить зависимость и все ее транзитивные зависимости

Используя maven-shade-plugin, существует ли способ исключить зависимость (которая не предоставляется) и все ее транзитивные зависимости?

Например:

<dependencies>
 <dependency>
 <groupid>com.example</groupid>
 <artifactid>some-artifact</artifactid>
 <version>1.0.0-SNAPSHOT</version>
 </dependency>
 ... other dependencies
</dependencies>

и 1)

<build>
 <plugins>
 <plugin>
 <groupid>org.apache.maven.plugins</groupid>
 <artifactid>maven-shade-plugin</artifactid>
 <version>2.3</version>
 <configuration>
 <artifactset>
 <includes>
 <include>*:*</include>
 </includes>
 <excludes>
 <exclude>com.example:some-artifact</exclude>
 </excludes>
 </artifactset>
 </configuration>
 <executions>
 <execution>
 <phase>package</phase>
 <goals>
 <goal>shade</goal>
 </goals>
 </execution>
 </executions>
 </plugin>
 </plugins>
</build>

или 2)

<build>
 <plugins>
 <plugin>
 <groupid>org.apache.maven.plugins</groupid>
 <artifactid>maven-shade-plugin</artifactid>
 <version>2.3</version>
 <configuration>
 <artifactset>
 <includes>
 <include>*:*</include>
 </includes>
 </artifactset>
 <filters>
 <filter>
 <artifact>com.example:some-artifact</artifact>
 <excludes>
 <exclude>**</exclude>
 </excludes>
 </filter>
 </filters>
 </configuration>
 <executions>
 <execution>
 <phase>package</phase>
 <goals>
 <goal>shade</goal>
 </goals>
 </execution>
 </executions>
 </plugin>
 </plugins>
</build>

Те не работают. Все транзитивные зависимости com.example:some-artifact добавляются в последнюю банку. Обратите внимание, что я не хочу устанавливать область com.example:some-artifact в "предоставленный".

2 ответа

Запустите "тень" из профиля и отметьте свою зависимость, как указано только в этом профиле. Например:

<profiles>
 <profile>
 <id>shadeProfile</id>
 <dependencies>
 <dependency>
 <groupid>com.example</groupid>
 <artifactid>some-artifact</artifactid>
 <version>1.23</version>
 <scope>provided</scope>
 </dependency>
 </dependencies>
 <build>
 <plugins>
 <plugin>
 <groupid>org.apache.maven.plugins</groupid>
 <artifactid>maven-shade-plugin</artifactid>
 <version>2.3</version>
 <executions>
 <execution>
 <phase>package</phase>
 <goals>
 <goal>shade</goal>
 </goals>
 <configuration>
 <shadedclassifiername>shaded</shadedclassifiername>
 </configuration>
 </execution>
 </executions>
 </plugin>
 </plugins>
 </build>
 </profile>
</profiles>

Когда вы запустите mvn -PshadeProfile package, он будет обрабатывать вашу зависимость как предоставленную (и, таким образом, опустить ее зависимости), и будет использовать классификатор "затененный", чтобы вы могли использовать его как зависимость в других модулях.


Я попробовал следующую конфигурацию, и это сработало и для меня:

<plugin>
 <groupid>org.apache.maven.plugins</groupid>
 <artifactid>maven-shade-plugin</artifactid>
 <version>3.1.0</version>
 <executions>
 <execution>
 <phase>package</phase>
 <goals>
 <goal>shade</goal>
 </goals>
 </execution>
 </executions>
 <configuration>
 <finalname>client-${artifactId}</finalname>
 <filters>
 <filter>
 <artifact>*:*</artifact>
 <excludes>
 <exclude>META-INF/*</exclude>
 </excludes>
 </filter>
 </filters>
 <artifactset>
 <excludes>
 <exclude>org.apache.jmeter:*</exclude>
 <exclude>com.fasterxml.jackson.core:jackson-databind:*</exclude>
 <exclude>com.fasterxml.jackson.module:jackson-module-scala_2.11:*</exclude>
 </excludes>
 </artifactset>
 </configuration>
 </plugin>

licensed under cc by-sa 3.0 with attribution.