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

Ami*_*mar 4 maven maven-shade-plugin

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

<dependency>
    <groupId>com.package</groupId>
    <artifactId>art1</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)

一个来自

<dependency>
    <groupId>com.package</groupId>
    <artifactId>art2</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)

请注意,工件ID是不同的.

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

Tun*_*aki 6

使用maven-shade-plugin,可以为特定依赖项排除某些类.这是在filters属性的帮助下配置的:

存档要使用的过滤器.允许您以复合标识符的形式指定工件,并使用artifactSet一组包含/排除文件模式来过滤存档的哪些内容添加到阴影jar.

在您的情况下,com.package.A要从依赖项中排除类art2,您可以:

<filters>
  <filter>
    <artifact>com.package:art2</artifact>
    <excludes>
      <exclude>com/package/A.class</exclude>
    </excludes>
  </filter>
</filters>
Run Code Online (Sandbox Code Playgroud)

要使其动态化,即在构建时选择com.package.A要保留的类,您不需要使用配置文件.您可以使用Maven属性来保存依赖项的工件ID以进行过滤.在您的属性中,添加

<properties>
  <shade.exclude.artifactId>art2</shade.exclude.artifactId>
</properties>
Run Code Online (Sandbox Code Playgroud)

shade.exclude.artifactId属性将保存依赖项的工件ID以进行过滤.默认情况下,此配置将选择art2.然后,在<filter>Shade插件的配置中,您可以使用<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>
Run Code Online (Sandbox Code Playgroud)

运行mvn clean package将创建与一位超级罐子A.classart1因为从一个art2被排除在外.然后,运行mvn clean package -Dshade.exclude.artifactId=art1会将这段时间A.class从依赖关系中排除art2,art1因为排除了依赖关系.