TL; DR Чтобы устранить эту проблему, используйте плагин упаковки, например, для jar
упаковки используйте maven-jar-plugin
, как указано ниже:
mvn jar:jar install:install
или
mvn jar:jar deploy:deploy
Если вам действительно нужно было развернуть.
Получено Этот подход не будет работать, если у вас есть многомодульный проект с разными упаковками (ear / war / jar / zip)- что еще хуже, неправильные артефакты будут установлены / развернуты!В таком случае используйте параметры реактора только для сборки развертываемого модуля (например, war
).
Пояснение
В некоторых случаях вы действительно хотите запуститьнепосредственно цель install:install
или deploy:deploy
(то есть от цели maven-deploy-plugin
, deploy
, а не от Maven deploy
phase ), и вы окажетесь в раздражающей The packaging for this project did not assign a file to the build artifact
.
Классическим примером является задание CI (например, задание Jenkins или Bamboo), где на разных этапах вы хотите выполнить / заботиться о разных аспектах:
- Первый шагбудет
mvn clean install
, выполнение тестов и тестовое покрытие - Вторым этапом будет анализ Sonarqube на основе профиля качества, например,
mvn sonar:sonar
плюс дополнительные параметры - Тогда и только послеуспешное выполнение тестов и контроль качества пройдены, вы хотите развернуть в своем корпоративном репозитории Maven последние артефакты проекта, но не хотите повторно запускать
mvn deploy
, потому что он снова выполнит предыдущие фазы (и скомпилирует, протестирует и т. д.) и вы хотите, чтобы ваша сборкаэффективный, но все же быстрый .
Да, вы можете ускорить этот последний шаг, по крайней мере, пропуская тесты (компиляция и выполнение, через -Dmaven.test.skip=true
) илииграть с определенным профилем (чтобы пропустить как можно больше плагинов), но гораздо проще и понятнее просто запустить mvn deploy:deploy
затем.
Но это не удастся с ошибкой выше, потому что, как указано по плагину FAQ :
На этапе упаковки все собрано и помещено в контекст.С помощью этого механизма Maven может гарантировать, что maven-install-plugin
и maven-deploy-plugin
копируют / загружают один и тот же набор файлов.Поэтому, когда вы выполняете только deploy:deploy
, тогда в контекст не помещаются файлы и развертывать нечего.
Действительно, deploy:deploy
требуется некоторая информация времени выполнения, помещенная в контекст сборки с помощьюпредыдущие фазы (или предыдущие исполнения плагинов / целей).
Также сообщается как потенциальная ошибка: MDEPLOY-158
: deploy: deploy не работает только для развертывания артефакта вMaven Remote repo
Но затем отклонен как не проблема.
Опция deployAtEnd
конфигурации maven-deploy-plugin
не поможет ни в некоторых случаяхСценарии, потому что у нас есть промежуточные шаги для выполнения:
Должен ли каждый проект быть развернут во время его собственной фазы развертывания или в конце многомодульной сборки.Если установлено значение true
и сборка завершится неудачно, ни один из проектов реактора не будет развернут.(экспериментально)
Итак, как это исправить?
Просто выполните следующее в подобном третьем / последнем шаге:
mvn jar:jar deploy:deploy
maven-jar-plugin
не будет повторно создавать jar как часть вашей сборки, благодаря опции forceCreation
, установленной по умолчанию false
:
Требуется банкаПлагин для создания нового JAR, даже если кажется, что ни одно из содержимого не изменилось.По умолчанию этот плагин проверяет, существует ли выходной файл jar и входные данные не изменились.Если эти условия выполняются, плагин пропускает создание jar-файла.
Но он приятно заполнит контекст сборки для нас и сделает deploy:deploy
счастливым.Нет тестов, чтобы пропустить, нет профилей, чтобы добавить.Как раз то, что вам нужно: скорость.
Дополнительное примечание: если вы используете build-helper-maven-plugin
, buildnumber-maven-plugin
или любой другой подобный плагин для генерации метаданных, которые впоследствии будут использоваться maven-jar-plugin
(например, записи для файла манифеста), вы, скорее всего, будете иметь казни связаны с фазой validate
, и вы все еще хотите иметь их на этапе сборки jar:jar
(и при этом сохранить быстрое выполнение). В этом случае почти безвредные накладные расходы вызывают validate
phase следующим образом:
mvn validate jar:jar deploy:deploy
Еще одно дополнительное примечание: если у вас не jar
, а, скажем, war
упаковка, используйте вместо этого war:war
перед установкой / развертыванием.
Получил , как указано выше, проверьте поведение в многомодульных проектах.