Maven动态地从不同的依赖项中排除具有相同名称的类

时间:2016-09-02 08:30:20

标签: maven maven-shade-plugin

有两个类com.package.A,一个来自

<dependency>
    <groupId>com.package</groupId>
    <artifactId>art1</artifactId>
</dependency>

和一个来自

<dependency>
    <groupId>com.package</groupId>
    <artifactId>art2</artifactId>
</dependency>

请注意,工件ID不同。

对于不同的Maven配置文件,我想排除一个版本,只保留另一个版本。我正在使用Shade插件。

1 个答案:

答案 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()保持一致。