Maven динамически исключает класс с тем же именем из разных зависимостей

Есть два класса com.package.A, один из которых

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

и один из

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

Обратите внимание, что идентификаторы артефактов отличаются.

Для разных профилей Maven я хочу исключить одну версию и просто сохранить другую версию. Я использую плагин Shade.


person Amit Kumar    schedule 02.09.2016    source источник


Ответы (1)


С помощью maven-shade-plugin можно исключить определенный класс для конкретных зависимостей. Это настраивается с помощью filters. имущество:

Используемые архивные фильтры. Позволяет указать артефакт в виде составного идентификатора, используемого artifactSet, и набора шаблонов включения/исключения файлов для фильтрации содержимого архива, добавляемого в затененный банку.

В вашем случае, чтобы исключить класс 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, которое будет содержать идентификатор артефакта зависимости для фильтрации. В свойствах добавьте

<properties>
  <shade.exclude.artifactId>art2</shade.exclude.artifactId>
</properties>

Свойство shade.exclude.artifactId будет содержать идентификатор артефакта зависимости для фильтрации. По умолчанию эта конфигурация выберет 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>

Запуск mvn clean package создаст убер-банку с A.class из art1, так как art2 был исключен. И затем запуск mvn clean package -Dshade.exclude.artifactId=art1 сохранит на этот раз A.class из зависимости art2, так как тот из art1 был исключен.

person Tunaki    schedule 02.09.2016