Исключить классы из зависимости в 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
(см. Распаковка определенных артефактов). Я бы даже не попытался переупаковать его, это приведет к бесполезной сложности (замена старой банки на новую в классе компиляции не будет тривиальной, если это возможно).