有两个类com.package.A
,一个来自
<dependency>
<groupId>com.package</groupId>
<artifactId>art1</artifactId>
</dependency>
和一个来自
<dependency>
<groupId>com.package</groupId>
<artifactId>art2</artifactId>
</dependency>
请注意,工件ID不同。
对于不同的Maven配置文件,我想排除一个版本,只保留另一个版本。我正在使用Shade插件。
答案 0 :(得分:6)
使用maven-shade-plugin
,可以exclude certain class获取特定的依赖关系。这是在filters
属性的帮助下配置的:
存档要使用的过滤器。允许您以
artifactSet
使用的复合标识符的形式指定工件,以及一组包含/排除文件模式,用于过滤存档的哪些内容添加到阴影jar中。
在您的情况下,要从依赖项com.package.A
中排除类art2
,您可以:
<filters>
<filter>
<artifact>com.package:art2</artifact>
<excludes>
<exclude>com/package/A.class</exclude>
</excludes>
</filter>
</filters>
要使此动态,即在构建时选择要保留的com.package.A
类,您不需要使用配置文件。您可以使用Maven属性来保存依赖项的工件ID以进行过滤。在您的媒体资源中,添加
<properties>
<shade.exclude.artifactId>art2</shade.exclude.artifactId>
</properties>
shade.exclude.artifactId
属性将保存依赖项的工件ID以进行过滤。默认情况下,此配置将选择art2
。然后,在Shade插件的<filter>
配置中,您可以使用<artifact>com.package:${shade.exclude.artifactId}</artifact>
。
以下是此操作的完整配置:
<build>
<plugins>
<plugin>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<executions>
<execution>
<id>shade</id>
<goals>
<goal>shade</goal>
</goals>
<phase>package</phase>
<configuration>
<filters>
<filter>
<artifact>com.package:${shade.exclude.artifactId}</artifact>
<excludes>
<exclude>com/package/A.class</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<properties>
<shade.exclude.artifactId>art2</shade.exclude.artifactId>
</properties>
正在运行mvn clean package
将使用A.class
中的art1
创建一个超级jar,因为art2
中的mvn clean package -Dshade.exclude.artifactId=art1
被排除在外。然后,由于A.class
中的art2
排除了art1
,因此运行request()
会使时间request()
与依赖项.pipe()
保持一致。