Maven пытается загрузить многомодульную зависимость на этапе «проверки»

#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. Потому что эти зависимости еще не созданы.