Java / Maven: как удалить содержимое из затененного JAR во время компиляции?

Я в своем проекте повторно использую компонент на основе maven с открытым исходным кодом, который включает в себя набор закрашенных (например, с использованием плагина maven-shade) прямых и транзитивных зависимостей в компоненте uber-jar. К сожалению, некоторые из этих зависимостей конфликтуют с зависимостями моего собственного проекта. В частности, зависимости компонента транзитивно включают servlet-api 2.x, тогда как мне нужен 3.x в моем проекте - и они, похоже, находятся в том же пространстве имен. Зависимость верхнего уровня компонента, которая извлекает servlet-api (lucene-demo), на самом деле не нужна для функциональности компонента, поэтому я был бы счастлив удалить ее, если это возможно. Мой проект построен с помощью Gradle.

Каков рекомендуемый способ поведения в подобной ситуации? Есть ли способ удалить нежелательные зависимости из повторно используемого uber-jar, когда я создаю свой собственный проект? Или я должен сам перестроить повторно используемый компонент, исключив неприятную зависимость? Если да, можно ли это сделать автоматически, чтобы мне не нужно было поддерживать собственный форк компонента с открытым исходным кодом? В настоящее время компонент размещен на GitHub и публикуется через Maven Central.

(Как вы понимаете, я немного новичок как в Maven, так и в Gradle, так что не беспокойтесь о том, чтобы что-то упустить).


person Karl    schedule 20.03.2015    source источник
comment
Возможно, вы могли бы скопировать эту зависимость с помощью maven-dependency-plugin и использовать задачу zipfileset ant с плагином maven ant (stackoverflow.com/questions/2521231/), чтобы удалить содержимое из зависимой jar-файла в вашей сборке.   -  person gclaussn    schedule 20.03.2015
comment
Можете ли вы перечислить компоненты, которые вы используете в своем проекте?   -  person watery    schedule 21.03.2015
comment
@watery: пакет, который я собираюсь использовать повторно и который с помощью закрашенного включения извлекает jar-файлы для lucene-demo (и транзитивно servlet-api 2.x), является семантическими векторами из code.google.com/p/semanticvectors. Я хочу развернуть свой код с помощью Spring Boot (spring-boot-starter-web), что, как я понимаю, требует использования более новой версии servlet-api.   -  person Karl    schedule 21.03.2015
comment
@gclaussn Интересное решение. Я поиграю с ним и посмотрю, работает ли оно.   -  person Karl    schedule 21.03.2015
comment
Я не могу воспроизвести вашу проблему (я просто пробовал с пустым проектом webapp, возможно, мне что-то не хватает), но вы можете попробовать взглянуть на maven dependency exclusion: он должен позволить вам исключать зависимости из конкретной зависимости   -  person watery    schedule 21.03.2015
comment
@watery: это не поможет, если зависимая банка содержит содержимое (классы и ресурсы) всех ее зависимостей - stackoverflow.com/questions/11947037/what-is-an-uber-jar, если он обычно упакован, вы можете использовать исключение зависимостей, как вы упомянули.   -  person gclaussn    schedule 22.03.2015
comment
Я просто понял, что никогда не отвечал на этот вопрос, приношу свои извинения. В конечном итоге я убедил разработчиков пакета upstream больше не использовать затенение, если только не выполнил двоичный выпуск конечного пользователя, что означает, что я мог бы затем использовать исключение зависимостей, как это было предложено водянистым   -  person Karl    schedule 13.01.2017