maven-shade-plugin: как maven затеняет один и тот же класс в другой банке?

Если мой проект зависит от двух банок, A и B, которые, в свою очередь, зависят от класса foo.bar.FooBar. Но они включают в свои банки разные версии FooBar и работают только с этой конкретной версией, например. A зависит от FooBar v1, B зависит от FooBar v3.

Затем, когда плагин тени объединяет A и B в финальную толстую банку, как maven перемещает их, чтобы гарантировать, что A и B оба работают?


person kingluo    schedule 23.08.2018    source источник


Ответы (1)


Это означает, что вам сначала нужна затененная версия A и B, обе со своей собственной перемещенной версией foo.bar.FooBar. Только так A будет "перекомпилирован" со своей версией FooBar, как и B. После этого можно создать толстую банку.

person Robert Scholte    schedule 23.08.2018
comment
Но тогда, если мне не нужно ничего затенять при создании проекта верхнего уровня, я мог бы использовать плагин сборки вместо плагина затенения, верно? - person kingluo; 23.08.2018
comment
Поскольку теневой плагин может обрабатывать конфликт ресурсов, почему он не рассматривает разрешение конфликта классов, как я упоминал? - person kingluo; 23.08.2018
comment
Я настоятельно рекомендую использовать плагин maven-shade-plugin для создания толстой банки, он намного мощнее и намного лучше соответствует требованиям. - person Robert Scholte; 23.08.2018
comment
Если FooBar v1 и FooBar v3 имеют одинаковый groupId+artifactId, Maven выбирает один (не maven-shade-plugin). Когда они существуют в разных артефактах, maven-shade-plugin просто следует правилам пути к классам: выигрывает первое вхождение. - person Robert Scholte; 23.08.2018
comment
Но что, если бы я не мог коснуться исходных кодов A и B, например. это сторонние продукты с закрытым исходным кодом. Почему maven-shade-plugin не может затенить конкретный пакет из конкретной банки по определенному шаблону? То есть могу ли я полностью решить свою проблему в проекте maven верхнего уровня? - person kingluo; 23.08.2018
comment
Вам не нужны исходники. Добавьте модуль maven, такой как mycomp:A, который зависит только от третьего лица:A, выберите A и зависимость foo.bar для затенения и укажите перемещение. Вы можете сделать то же самое для B. Как уже говорилось, я ожидаю только 1 версию FooBar в пути к классам, вы должны сначала проверить это. Если это так, ответ на ваш вопрос о том, почему maven-shade-plugin не может затенять конкретный пакет из конкретной банки в конкретный шаблон: есть только одна конкретная банка. - person Robert Scholte; 23.08.2018