Исключить классы из зависимости в Maven

У меня есть проект, который зависит от артефакта, который контролируется поставщиком. Этот артефакт содержит некоторые классы, от которых я зависим, а некоторые из них старше и вызывают проблемы. Есть ли способ заставить maven автоматически расширять банку, удалять классы и повторно упаковывать их как зависимость? Я попытаюсь привести пример.

supplier:artifact:1.0.0
com.supplier.useful.ClassA
com.supplier.dto.ClassB (old)

us:dependency:1.1.20
com.supplier.dto.ClassB (new)

us:project-web:1.1.20
- supplier:artifact:1.0.0
- us:dependency:1.1.20

Итак - мне нужно использовать ClassA в проекте-сети, но мне нужно использовать ClassB из артефакта dependency. Я не могу изменить поставщика: артефакт или нас: зависимость.

Любые идеи?!

Ответ 1

Так как версия 2.0.9 maven сохраняет порядок пути к классам, поэтому, если вы определяете свои исправленные классы в банке перед поставщиком, это скроет реализацию поставщика.

В качестве альтернативы вы можете посмотреть плагин maven shade, поскольку он делает именно то, что вы просите по мне.

Ответ 2

Если вы используете Maven 2.0.9+, просто поставьте свой класс в банку и объявите его как зависимость до артефакта от вашего поставщика. Как упоминалось в @Peter, Maven использует порядок pom для пути к классам с Maven 2.0.9 (см. MNG-1412/MNG-3111).

Если по какой-либо причине вы не удовлетворены этим решением, вы можете использовать Maven Dependency Plugin для распаковки зависимостей в target/classes (который должен находиться на пути класса компиляции) с помощью dependency:unpack с некоторыми excludes (см. Распаковка определенных артефактов). Я бы даже не попытался переупаковать его, это приведет к бесполезной сложности (замена старой банки на новую в классе компиляции не будет тривиальной, если это возможно).