Context: maven-help-plugin issue #378 - help:list-dependency-types prints
an empty list on Maven 4 (works on Maven 3).

Cause: the goal injects Map<String, ArtifactHandler> and iterates it. On
Maven 3 that map holds the registered types (jar, war, test-jar, ...). On
Maven 4 it is empty - there are no individual @Named ArtifactHandler beans
anymore; DefaultArtifactHandlerManager resolves handlers lazily from a
TypeRegistry, so the map injection has nothing to collect.

Listing all types on Maven 4 alone is possible via
lookup.lookupList(TypeProvider.class) (this is how DefaultTypeRegistry
builds itself). But Type/TypeProvider are Maven 4-only API, and the plugin
must keep supporting Maven 3 - adding the Maven 4 API trips
enforceBytecodeVersion. ArtifactHandlerManager and TypeRegistry otherwise
only expose lookup by id, not "get all".

So the real problem: there is no way for a plugin to enumerate all
dependency types that works on BOTH Maven 3 and 4. Is this loss considered
a regression that should be addressed, or is the expectation that plugins
work around it (or drop Maven 3 support)?

Options I can see:
1. Fix Maven 4 core so an existing cross-version method (e.g.
DefaultArtifactHandlerManager#getHandlerTypes) returns the registered types
via TypeProviders - then the plugin keeps using the old API and works on
both. (Open question: whether Maven 4's extensible type model makes "all
types" always well-defined.)
2. Plugin-side reflection: on Maven 4, reach TypeProvider/Type reflectively
(no compile-time Maven 4 dependency); fall back to the current map on Maven
3.
3. Make a future maven-help-plugin version require Maven 4.

Is option 1 something the Maven team would consider, or is there a supported
API I've missed?

Reply via email to