#java #maven #build
#java #maven #сборка
Вопрос:
Из конвейера сборки я хочу запустить validate
phase для таких вещей, как enforcer
плагин. Однако это не работает для многомодульного проекта, поскольку он пытается загрузить зависимости из репозитория, которые находятся внутри проекта. Однако compile
phase этого не делает, но для меня это не вариант, поскольку он слишком медленный.
pom.xml:
<module>lib</module>
<module>app</module>
lib/pom.xml
<version>1.2.3</version>
app/pom.xml
<dependency>
<artifactId>lib</artifactId>
<version>1.2.3</version>
</dependency>
Итак, если я это сделаю mvn compile
, все будет нормально.
Но если я mvn validate
это сделаю, проверка app
модуля завершится неудачно, поскольку он пытается загрузить lib-1.2.3 из репозитория maven. По какой-то причине теперь он не мог видеть, что библиотека является зависимостью от соседа. Почему?
Я создал небольшой репозиторий: https://github.com/kan-izh/so63963768
mvn compile
[INFO] --- maven-enforcer-plugin:3.0.0-M3:enforce (enforce-no-snapshots) @ app ---
[INFO]
[INFO] --- maven-resources-plugin:3.1.0:resources (default-resources) @ app ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory C:Workspacereposo63963768appsrcmainresources
[INFO]
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ app ---
[INFO] No sources to compile
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] parent ............................................ SUCCESS [1.612s]
[INFO] lib ............................................... SUCCESS [1.224s]
[INFO] app ............................................... SUCCESS [0.056s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
mvn validate
[INFO] --- maven-enforcer-plugin:3.0.0-M3:enforce (enforce-no-snapshots) @ app ---
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] parent ............................................ SUCCESS [0.979s]
[INFO] lib ............................................... SUCCESS [0.015s]
[INFO] app ............................................... FAILURE [0.020s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.180s
[INFO] Finished at: Wed Sep 23 11:27:38 BST 2020
[INFO] Final Memory: 7M/34M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-enforcer-plugin:3.0.0-M3:enforce (enforce-no-snapshots) on project app: Execution
enforce-no-snapshots of goal org.apache.maven.plugins:maven-enforcer-plugin:3.0.0-M3:enforce failed: org.apache.maven.shared.dependency.graph.
DependencyGraphBuilderException: Could not resolve following dependencies: [com.so.q63963768:lib:jar:1.2.3 (compile)]: Could not resolve depend
encies for project com.so.q63963768:app:jar:1.2.3: Failure to find com.so.q63963768:lib:jar:1.2.3 in http://xxxxxxxxxxxxx.xx.xxxxxxxxxxxxxxxxx.
com:8081/repository/maven-public/ was cached in the local repository, resolution will not be reattempted until the update interval of nexus has
elapsed or updates are forced -> [Help 1]
Комментарии:
1. Вы запускаете его в главном каталоге или из подкаталога?
2. Из main, где родительский pom
Ответ №1:
Это хороший вопрос, и он показывает небольшой недостаток в том, как Maven обрабатывает зависимости. Вам нужно знать, что для каждой цели плагина вы можете определить, следует ли разрешать зависимости и для какой области. (и есть небольшая разница, если достаточно иметь только pom или вам также нужны артефакты) компилятор: для компиляции требуются зависимости, которые требуются во время компиляции, compiler: testCompile требует зависимостей, которые требуются во время тестирования. Для принудительной цели это сложно: сама цель не требует наличия разрешенных зависимостей, как и большинство правил (например, requireJavaVersion или requireMavenVersion), но некоторые правила, например, те, которые вы пытаетесь применить. В идеале правила могут определять, должны ли они разрешать зависимости, но прямо сейчас API этого не поддерживает.
Итак, у вас есть несколько решений: всегда запускайте с компиляцией или привязывайте блок выполнения к compile-pahse, если для этого требуются артефакты.
Комментарии:
1. Извините, я не понимаю второго решения. Что вы имеете в виду под этим? И третье решение — изменить плагин enforcer на включение
requiresDependencyResolution
? Почему это не сделано в первую очередь? Любой недостаток?2. <выполнение> <идентификатор> принудительный реактор </id> <фаза> компиляция </фаза> <цели> <цель> принудительный </цель> </ цели> <конфигурация> <правила> </ правила> </ конфигурация> </ выполнение> Это будет выполнено после
compiler:compile
, так что это означает, что эти зависимости будут доступны. Всегда требовать зависимостей не имеет смысла, так как для большинства правил вам не нужны зависимости, но вы хотите получить обратную связь как можно быстрее. Реальное решение — это улучшение Maven.3. Итак, вы предлагаете переместить плагин enforcer на этап компиляции? В чем смысл?
mvn compile
уже работает нормально.4. у вас есть некоторые правила, которые зависят от зависимостей в области компиляции. Самое простое решение — поместить только эти правила в отдельный блок выполнения в enforcer-plugin, как показано в моем предыдущем ответе. Делая это,
mvn validate
должно работать снова.5. Потому что эти зависимости еще не созданы.