I have managed to get this to work. However it is not an ideal solution.

Creating the bom is very simple. It has artifact details and then a
dependencyManagement section. I have created one, installed locally and
verified it works on some of my projects.

However deploying the bom is a problem in the commons release process. This
requires:

1. SNAPSHOTS are deployed to
https://repository.apache.org/content/repositories/snapshots
2. Non-SNAPSHOTS are deployed to
https://repository.apache.org/service/local/staging/deploy/maven2
3. Use of profile test-deploy, irrespective of SNAPSHOT suffix, deploys
locally to file:target/deploy

The maven deploy plugin has two goals: deploy; deploy-file.

The deploy goal targets the current project artifact. When used in an
apache based pom this will switch between the two target repositories if it
is a snapshot. But a profile in commons-parent is used to achieve test
deploy support.

The deploy-file goal requires you explicitly provide the repo details. It
does not provide a switch between snapshot and release versions
automatically.

If I create a simple BOM it cannot be deployed to the required repositories
as it does not have a distributionManagement section. So this can be added
to the bom but it pollutes the bom. IIUC this will have no effect on the
use of the bom using the pom import scope. It will affect using it as a
parent pom. This also requires a profile to respect the test-deploy option
from commons-parent.

Extending either the latest apache pom or commons-parent (CP) is not
possible. These have a dependencyManagement section and the two are merged.
So for example the commons RNG bom would specify the junit version brought
in from CP. The last apache pom without a dependencyManagement section is
apache-24 (Jul 2021). This can be extended but a profile still needs to be
added to respect the test-deploy option. All that is gained is not having
to include the distributionManagement section.

The alternative is to have a project that attempts to use the deploy-file
target to deploy a bom to the correct location. This bom could be
auto-generated or manually curated. I am currently not able to satisfy all
3 conditions of the commons release process with my test project. Detection
of the snapshot version and changing plugin execution logic is problematic
using maven's configuration. I am looking for a plugin that may help with
this. Currently I have tried the build-helper plugin without success [9].

I would not wish to require deployment to be based on user-selected
profiles. This is subject to user error and could send a release build
(non-SNAPSHOT) to the snapshots repo. So currently the only solution I have
is a non-commons project module that has a few additions to the bom to make
it work as a pom that controls its own deployment.

Details:

The maven documentation on the dependency mechanism suggests putting the
bom pom at the top of the project hierarchy [1]. The standard multi-module
pom would be next. However for the commons build the bom pom would have to
inherit from commons-parent. That has a dependency management section for
junit. So if the bom is imported you also receive the junit dependency
management.

Ideally the bom should be as simple as possible with artifact coordinates
and the dependency management section. See examples [3,4]. These are
generated by the gradle maven publish plugin [5], which typically for
gradle requires very little configuration (see [6]).

There is a JBoss plugin to auto-generate a bom [2]. It produces a nice
simple bom. It is missing some sections that could be useful (url, license,
scm). However I could not find a plugin to deploy the generated bom. Using
the maven deploy:deploy-file goal does not have a mechanism to switch
between targeting a snapshot repo and a release repo (unlike the
deploy:deploy goal). So my solution is a simple bom pom that has no parent.
It explicitly contains all the RNG dependencies and must be manually
maintained. It could be auto-generated with the JBoss plugin but that omits
a final requirement. I had to add a distributionManagement section to the
pom for the Apache repos. With this configuration I am able to run 'mvn
deploy' in the module and it deploys to the snapshot repo.

I do not know if this will stage correctly when running the deploy goal
with a release version. It should target the apache release staging repo
[7]. However since the pom does not extend either the Apache parent pom or
the commons parent pom (due to their inclusion of a dependencyManagement
section) I cannot be sure that the standard maven configuration is going to
work in our build release process.

The alternative is to find a way to add deploy:file selection logic based
on the SNAPSHOT suffix and the test-deploy profile.

Note: It is not possible to add a dependencyManagement section in the local
maven settings.xml file [8] and activate with a profile. The settings.xml
supports a subset of the entire pom. It is possible to add properties in a
profile that define the target repo (namely altDeploymentRepository). This
property is used by the commons-build-plugin for a test-deploy dry run. So
this could be used to minimise additions to the actual bom.

If using auto-generation then the management of the dependencies has to be
done in the generate-bom module. If manually curating the bom then it has
to be done in the bom itself. So management of the dependencies for the
final bom has to be done somewhere. Note that it cannot be done in the
current dist-archive module which already includes these dependencies. This
is because it also includes sources and javadoc dependencies which breaks
the JBoss generated bom.

Currently I would like to get this to work with a standard commons module
that deploys a separate bom file to the correct location. That would ensure
we produce the minimal bom possible. The alternative is a non-standard
commons module that is the bom itself, with added sections to support the
commons release process.

Alex

[1]
https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html
[2] https://github.com/jboss/bom-builder-maven-plugin
[3]
https://search.maven.org/artifact/org.springframework/spring-framework-bom/5.3.23/pom
[4] https://search.maven.org/artifact/org.junit/junit-bom/5.9.1/pom
[5] https://github.com/gradle-bom/gradle-bom-generator-plugin
[6]
https://github.com/junit-team/junit5/blob/main/junit-bom/junit-bom.gradle.kts
[7] https://repository.apache.org/service/local/staging/deploy/maven2
[8] https://maven.apache.org/settings.html
[9]
https://www.mojohaus.org/build-helper-maven-plugin/regex-property-mojo.html


On Thu, 29 Sept 2022 at 13:21, Xeno Amess <xenoam...@gmail.com> wrote:

> even better if we have a BOM for whole apache commons.
> ________________________________
> From: Gary Gregory <garydgreg...@gmail.com>
> Sent: Thursday, September 29, 2022 8:05:14 PM
> To: Commons Developers List <dev@commons.apache.org>
> Subject: Re: [rng] Release 1.5 with Bill Of Materials (BOM)
>
> That sounds like a good idea!
>
> Gary
>
> On Thu, Sep 29, 2022 at 5:27 AM Alex Herbert <alex.d.herb...@gmail.com>
> wrote:
>
> > I think RNG is ready for a release.
> >
> > In 1.5 the multi-module project rearranges a few methods to default
> > interface methods in a different module. This is binary compatible.
> However
> > it requires that all versions of the modules are matched. If the other
> > modules are explicitly imported by a transitive dependency as a lower
> > version then this will cause a runtime error due to missing methods.
> >
> > I suggest we create a Bill of Materials (BOM) as a separate artifact to
> be
> > deployed to maven for dependency management. Downstream users can then
> > include this in their POM and all versions of the RNG modules would be
> > matched.
> >
> > <dependencyManagement>
> >     <dependencies>
> >         <dependency>
> >             <groupId>org.apache.commons</groupId>
> >             <artifactId>commons-rng-bom</artifactId>
> >             <version>1.5</version>
> >             <type>pom</type>
> >             <scope>import</scope>
> >         </dependency>
> >     </dependencies>
> > </dependencyManagement>
> >
> > Alex
> >
>

Reply via email to