Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Installing BOM before Maven tries to resolves it

Is there a way to install a BOM as part of maven invocation before maven tries to resolve it. See related questions for a normal dependency

Install local jar dependency as part of the lifecycle, before Maven attempts to resolve it

Is there are way to install maven dependencies before maven attempts to resolve them?

I have tried to run a plugin in validate phase, but maven always resolved the bom first be it a import scope bom or used as a parent bom.

About BOM: http://www.baeldung.com/spring-maven-bom

like image 468
FUD Avatar asked Jan 24 '18 05:01

FUD


1 Answers

The expected usage of maven BOM is within the dependencyManagement section of a pom.xml.

Maven documentation states:

Other projects that wish to use the library should import this pom into the dependencyManagement section of their pom. (Please refer to Introduction to the Dependency Mechanism)

In a multi-module project you would usually have a dependencyManagement section with the parent pom only.

Also, just for clarification: The bom is NOT causing dependencies to the artifacts indicated therein. It is merely indicating the versions of the "ingredients" that are intended to be used together (for dependencies that are composed of several artifacts expected to be used together) in case a dependency is added somewhere in a related pom such dependencyManagement applies to.

With such setup maven will resolve the bom at time of processing dependencyManagement section. This is time of evaluating the surrounding pom.xml (or any referencing sub-module). The bom is then added to the local repository like any other dependency.

So, under normal circumstances there is no need for "fetching the bom from the net and installing it into the local repository".

Now, why would a bom artifact not be available at the time a maven call is being started?

  1. The artifact source (repository) is not accessible

    Then, downloading the artifact and providing it into local repository would be the way to go.

  2. The artifact version is not known before (or is decided at starting time, e.g. either be specifying a profile or indicating the version as a runtime parameter)

    Then the dependency mechanisms of maven still would work as expected.

  3. The bom artifact content (list of artifacts or respective versions) is not known before (e.g. as it is depending on outcome of some build step during the build run)

    Then, you likely need to rethink your build process, as it looks like you are trying to force maven into something it is not designed to support. Likely, the "dynamic" part is intrinsic to your project and thus, the dynamic dependency really should be a sub-module within your (multi-module) project. But it is really hard to advise without more input on a specific use case.

While a specific artifact to be consumed within a build step might be provided late (by relying on lazy evaluation of dependencies), this will much more difficult with bom dependencies. As such are dependency management entities that need to be resolved before the first time any dependency needs to be resolved as maven can not known what artifacts are contained within the bom.

If actually there is a usecase that absolutely requires such bom to be provided dynamically, then the only chance is a two layer process, where the top layer is providing the bom and the lower layer is then using it. Please note, that such a solution absolutely needs two independent maven processes (so, NOT just a simple multi-module project) in order to get the resolution of the depenceManagement dependency deferred until it is known.

like image 65
rpy Avatar answered Sep 22 '22 15:09

rpy