A golden rule that I learned with the Maven community is to explicitly declare the dependencies your project needs, it's just good practice.
Don't bother about declaring a dependency multiple times in different POMs, Maven does an excellent job on managing it, and one thing you are doing, and it's good, is to keep the version management in a single place.
Maven documentation says that dependencies with <scope>provided</scope>
are non-transitive, it means their availability scope is limited only to the project declaring the dependency itself and its direct childs (modules), but it won't be available to downstream projects that import the lib as a dependency.
Yet, the documentation says in the Importing Dependencies section that it's possible to inherit managed dependencies from another project using the <scope>import</scope>
.
It requires some extra work, but this allows inheritance of provided
dependencies; declare them without version in downstream projects, making it easy to keep its version in sync across multiple projects.
The key to make this work is to use both these tags when importing the upstream project:
<type>pom</type>
<scope>import</scope>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>upstream-provider-project</groupId>
<artifactId>upstream-artifact</artifactId>
<version>1.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>dependency-group-id</groupId>
<artifactId>managed-dependency-itself</artifactId>
<!--do not put <version\> tag, it will be inherited -->
</dependency>
</dependencies>