Это кажется простым вопросом, но мне было сложно из-за чрезвычайно строгой парадигмы жизненных циклов и фаз maven:
Предполагая, что в многомодульном проекте maven на разных этапах используется несколько плагинов для перезаписи pom.xml в более эффективные версии, примечательными примерами являются:
maven-shade-plugin (если
<createDependencyReducedPom>
включен): когда необходимо опубликовать затененный uber-jar, плагин может игнорировать зависимости, которые не нужно включать. ВСЕГДА выполнять в фазе пакета.flatten-maven-plugin: позволяет опубликованному pom.xml модуля больше не зависеть от родительского pom, заменяя ссылки на свойства их фактическими значениями. Может выполняться на любом этапе, но для обеспечения совместимости с maven-shade-plugin он также ограничен этапом пакета (см. https://issues.apache.org/jira/browse/MSHADE-323)
Когда они комбинируются с другими модулями, кажется, что механизм сборки реактора maven часто путается с тем, какую версию переписанного pom использовать для вычисления транзитивной зависимости. В идеале следует использовать окончательную версию после этапа упаковки. Но в последней версии maven (3.6.3) он может использовать pom.xml только ДО перезаписи, без уменьшенных зависимостей и всех свойств, которые не заменены должным образом.
Мои вопросы:
В чем смысл этого дизайна? Зачем использовать полусырой pom.xml, когда все плагины явно заменяют его?
Как переопределить это поведение, чтобы окончательная версия pom.xml всегда генерировалась и использовалась, независимо от запрашиваемой цели maven?
ОБНОВЛЕНИЕ 1: на данный момент я использую простой способ обхода:
разделение первого модуля на независимый проект maven, при этом плагины maven-shade и flatten-maven вызываются на этапе пакета. (У меня нет прямых доказательств, но я подозреваю, что именно так переупаковываются зависимости, такие как
spark-project.hive
https://mvnrepository.com/artifact/org.spark-project.hive/hive-common, см. https://issues.apache.org/jira/browse/SPARK-20202. для соответствующего обсуждения)используйте сценарий оболочки для последовательной компиляции/публикации вышеупомянутого проекта и основного многомодульного проекта.
Я не большой поклонник сценария оболочки, и я думаю, что это выдало независимый от платформы подвиг, которым лелеяло сообщество JVM. Поэтому, если у вас есть лучшее решение, напишите здесь, и я приму его в зависимости от популярности.
Большое спасибо за ваше мнение