| maven-acr-plugin |
1 |
|
ported, green locally (4 ITs); app-client packaging still registered through Plexus components.xml: rc-7 ignores PackagingProvider |
| maven-antrun-plugin |
7 |
|
ported, green locally (4 unit, 29 ITs); Ant reference maven.project is now the v4 Project, maven.project.helper removed |
| maven-archetype |
archetype-common 11 |
|
partial: archetype-common ported; archetype plugin excluded, does not compile; remote catalog loses cache and update policy |
| maven-artifact-plugin |
11 |
|
partial: 25 unit tests; ITs 13 → 12 passed (buildinfo-dir: a pom project has no main artifact); check-buildplan approximated with no execution-plan service; reproducible-central report blocked by the reporting chain |
| maven-assembly-plugin |
21 |
|
ported, green locally (271 unit, 156 ITs; the one failing IT is excluded from run-its by the POM); needs an unreleased plexus-archiver: its archivers cannot unpack without a container |
| maven-build-cache-extension |
31 |
apache/maven-build-cache-extension#544 |
✅ completed: migration not needed; PR closed as wontfix |
| maven-changelog-plugin |
3 |
|
blocked: compiles, but maven-site-plugin 3.x cannot run a v4 report mojo (Cannot cast ChangeLogReportFactory to org.apache.maven.plugin.Mojo); ITs 4 of 4 → 0 of 4 |
| maven-changes-plugin |
28 |
|
partial: the four non-report goals ported (54 unit tests, 16 ITs incl. 11 new); report goals excluded |
| maven-checkstyle-plugin |
8 |
|
partial: check ported (16 unit, 30 ITs; 4 ITs no longer run the report first); report goals blocked, 19 report ITs excluded; plexus-resources built without Sisu |
| maven-common-artifact-filters |
16 |
apache/maven-common-artifact-filters#130 |
✅ completed: migration not needed; PR closed as wontfix |
| maven-dependency-analyzer |
14 |
apache/maven-dependency-analyzer#305 |
✅ completed: migration not needed; PR closed as wontfix |
| maven-dependency-plugin |
75 |
|
partial: 25 of 29 goals ported (174 unit tests; about 265 Maven 3 harness tests excluded, not deleted); add, remove, list-repositories, analyze-report have no route; tree -Dverbose loses conflict data |
| maven-dependency-tree |
12 |
apache/maven-dependency-tree#149 |
✅ completed: migration not needed; PR closed as wontfix |
| maven-doap-plugin |
3 |
|
ported, green locally (15 unit, 4 ITs); five behavioural approximations: repository policies, metadata, existence checks |
| maven-doxia-sitetools |
5 (integration-tools, site-renderer) |
apache/maven-doxia-sitetools#701 |
✅ completed: migration not needed; PR closed as wontfix |
| maven-ear-plugin |
20 |
|
partial: 49 unit tests, 103 EarMojoIT cases and 17 of 18 ITs pass; skinny-wars-timestamp fails (no timestamped snapshot version); includesDependencies ignored by the resolver |
| maven-ejb-plugin |
1 |
|
ported, green locally (36 unit, 9 ITs); needs sisu.plexus at compile scope for the legacy BuildContext, as maven-resources-plugin does |
| maven-enforcer |
enforcer-rules 38, enforcer-api 2, enforcer-extension 1 |
|
partial: api and rules ported (347 tests, 0 failures); 3 rules removed for lack of API (requireUpperBoundDeps, banDynamicVersions, requireProfileIdsExist); plugin and extension excluded |
| maven-gpg-plugin |
9 |
|
partial: green locally (13 ITs + 4 Bouncy Castle ITs; gpg signer ITs not runnable here); encrypted {...} passphrases have no API route and now fail explicitly |
| maven-help-plugin |
12 |
|
ported, green locally (61 unit, 36 ITs); describe prefix lookup and evaluate rebuilt without a plugin manager or expression evaluator; effective-pom properties now sorted |
| maven-indexer |
indexer-core 3 |
|
partial: indexer-core ported (model only); indexer-cli and search-backend-indexer still wired through Sisu and fail at runtime |
| maven-invoker-plugin |
18 |
|
partial: 67 unit tests; 70 of 71 ITs run pass (22 not run); MINVOKER-377 fails because an alternate local repository cannot override the split layout; report goal blocked by the reporting chain |
| maven-jarsigner-plugin |
3 |
|
ported, green locally (52 unit, 9 ITs); settings decryption rebuilt from plexus-sec-dispatcher internals |
| maven-javadoc-plugin |
24 |
|
partial: every goal runs directly (75 unit tests; ITs 79 → 75 passed, the 4 new failures are mvn site runs); as a site report blocked by the reporting chain |
| maven-jdeprscan-plugin |
5 |
|
ported, green locally (6 unit, 6 ITs) |
| maven-jdeps-plugin |
3 |
|
ported, green locally (11 unit, 7 ITs); @Resolution fields stay null because plugin-tools writes no <resolutions> |
| maven-jlink-plugin |
5 |
|
ported, green locally (17 unit, 28 ITs); module path now from DependencyResolver, LocationManager dropped |
| maven-jmod-plugin |
5 |
|
ported, green locally (18 ITs); main-module-aware module path still from plexus-java LocationManager |
| maven-mapping |
1 |
apache/maven-mapping#77 |
✅ completed: migration not needed; PR closed as wontfix |
| maven-plugin-tools |
tools-api 13, annotations 4, generators 3 |
|
partial: all but the descriptor model ported; maven-plugin-plugin and plugin-report excluded, do not compile |
| maven-pmd-plugin |
26 |
|
partial: check goals ported (20 unit, 5 new ITs); report goals blocked; check depended on the report only through @Execute, now removed |
| maven-project-info-reports-plugin |
26 |
|
blocked: every goal is a report; ProjectBuilder cannot build a project from a repository artifact, and conflict data exists only as text |
| maven-rar-plugin |
4 |
|
ported, green locally (4 ITs, one new covering dependencies); rar packaging still registered through Maven 3 components |
| maven-release |
release-manager 59, release-api 7, oddeven-policy 1 |
|
partial: libraries ported (791 tests, 0 failures); immutable model forced a DOM-editing redesign; maven-release-plugin excluded, does not compile |
| maven-remote-resources-plugin |
8 |
|
ported, green locally (11 unit, 9 + 7 ITs); supplemental-model merging reduced; a project resource can no longer exclude a bundle resource |
| maven-reporting-exec |
21 |
apache/maven-reporting-exec#167 |
✅ completed: migration not needed; PR closed as wontfix |
| maven-reporting-impl |
8 |
apache/maven-reporting-impl#254 |
✅ completed: migration not needed; PR closed as wontfix |
| maven-resolver-ant-tasks |
10 |
|
partial: model and settings ported; relies on internal ApiRunner for a Session outside Maven |
| maven-scm-publish-plugin |
2 |
|
ported, green locally (5 ITs); ScmManager built from the Sisu index by hand, maven-scm has no non-Sisu factory |
| maven-scripting-plugin |
4 |
|
ported, green locally (5 ITs); script binding project is now the v4 Project |
| maven-shade-plugin |
10 |
|
partial: green locally (72 unit, 85 ITs), but the dependency-reduced POM can no longer become the published POM (the original is installed); transformer SPI unchanged, Shader SPI changes |
| maven-shared-jar |
4 |
apache/maven-shared-jar#182 |
✅ completed: migration not needed; PR closed as wontfix |
| maven-site-plugin |
24 |
|
partial: 10 goals run (deploy, stage, effective-site, attach-descriptor fully; site, jar, run without reports); 40 of 62 ITs, the other 22 lose report pages; reports need a plugin-manager API |
| maven-surefire |
maven-surefire-common 8; the forked-JVM modules use none |
|
partial: maven-surefire-common ported; it holds the mojo base class, so surefire and failsafe plugins cannot move separately |
| maven-toolchains-plugin |
9 |
|
ported, green locally (8 ITs); an extension's toolchain factory is found only through the Sisu index |
Description
Tracks porting the Apache Maven components and plugins from the Maven 3 API (
MavenProject,org.apache.maven.artifact,maven-compat, Sisu and Plexus components) to the Maven 4 API at 4.0.0-rc-7. This is an impact study, not a migration: it measures what ports cleanly, where the Maven 4 API has no equivalent, and which components are better kept on Maven 3, or retired, than ported.The work is organised as follows:
agent/mvn4-api: one commit switches CI to Maven 4 only (maven4-build: true, version from themaven-gh-actions-shared@v5default), the next ports the code. Where a PR is open, it is a draft labellednot-for-merge; the tables below link it.wontfixhas its PR closed and is marked "completed: migration not needed".agent/mvn4-apibranch was rebased onto its default branch. A component's findings give its measurements from before the rebase, unless they include a rebase note.Status
Closed as wontfix, migration to the Maven 4 API not needed: maven-build-cache-extension, maven-common-artifact-filters, maven-dependency-analyzer, maven-dependency-tree, maven-doxia, maven-doxia-converter, maven-doxia-sitetools, maven-file-management, maven-fluido-skin, maven-invoker, maven-jarsigner, maven-mapping, maven-reporting-api, maven-reporting-exec, maven-reporting-impl, maven-script-interpreter, maven-shared-jar, maven-shared-resources, maven-shared-utils.
Gaps found so far (rc-7)
Each row names the components where the gap was hit; details are in their findings comments below.
In the Maven 4 API: needs apache/maven
Sessionoutside a Maven runtime: the only route isApiRunnerinmaven-impl(internal), with no transporter and no way to supply aRepositorySystemorModelResolverListeneronly observesthreadSafe,instantiationStrategy,executionStrategy,requiresReportsand component requirements, so it cannot carry a Maven 3plugin.xmlPackagingProvidernot honoured: packaging lookup still goes through the SisuLifecycleMapping(#13306)MavenExecutionRequestdata onSession:-e,-ff/-fae/-fn, requested (-P) profile ids, settings and toolchains file locations (-s,-gs,-t,-gt)Project, and no version resolution for plugins, report plugins and extensions (RELEASE/LATEST){...}value it reads itself, nor re-encrypt passwords it writes into asettings.xmlfor a forked buildRemoteRepositoryhas no policies; no pre-managed version, declared version constraint, conflict or trail data and no parent link onNode; no way to configure conflict resolution or scope selection for a verbose collection;Projecthas nogetArtifacts()or project referencesDependency,TypeorVersionoutside aSession, and no public test fixturesToolchainModelinto aToolchaininside a plugin, and aToolchainFactorycontributed by an extension is found only through the Sisu indexJavaPathTypeclassifies each dependency alone: no main-module-aware module-path/class-path split (addOutputDirectoryis documented as not called)Projecthas no setter, and the consumer POM is generated from the modelDependencyCoordinatesFactory.create(Session, model.Dependency)drops scope, optional and exclusionsSession.withLocalRepositoryinherits the build's resolver configuration and cannot override the split layout;Project.getParent()returns reactor parents only; no settings merge; no view of the plugin's own artifactsSession.resolveArtifactno longer fetches the POM or follows relocation; resolved dependencies come level by level rather than in tree orderProjectBuildercannot build a project from coordinates (aSourcerequest returns empty with no problem reported);Transporthas no existence check; no remote-layout serviceincludesDependenciesofwar,earandrartypes, and lists an artifact reached by several paths only under its nearest parent; no timestamped snapshot version on a resolved artifact; no session start timeArtifactHandlerequivalent${plugin.artifactMap},${project.artifactMap},${plugin},${basedir},${session.parallel},${project.name}-style defaultsSession/ProjecttoMavenProjectorRepositorySystemSessionfor code that still needs themXmlNodeparameter drops XML attributes, also hit in checkstyle and ear (#13305);PlexusConfigurationparameters are not supported at all;MojoExecution.getPlugin().getDependencies()throws when the plugin realm comes from the cache (#13307)<name>gives a null name where Maven 3 fell back to the artifactIdnull; the strict reader rejects<reports>and plugin<goals>List, requires a value on@Named(a bare@Namedis the empty key, notdefault), and cannot inject Sisu or Plexus components (#13326)ScmManager), plugin-tools (ArchiverManager,VelocityComponent), surefire (LocationManager)In estate tooling and libraries: fixable by PR
<resolutions>, so@Resolutionfields stay null (a port that relies on it silently resolves nothing); mojo constructor injection unsupported (apache/maven-plugin-tools#1229);dependencyResolutionPathScopesnot extracted;@Mojo(dependencyCollection = true)and@Execute(phase = "none")crash the generatorScmManagerobtainable only through Sisujavax.inject; apache/maven-scm#1418 closedServiceLoaderArchiverManagerthrow aNullPointerExceptionwhen unpacking, becauseAbstractArchivergets itsArchiverManageronly by injection; plexus-archiver 4.x has no Sisu-freeArchiverManagerat allBuildContext(org.sonatype.plexus:plexus-build-api0.0.7) forcesorg.eclipse.sisu.plexusat compile scope<proc>none</proc>in themaven-shared-componentsparent: the Maven 4 DI index is written by hand<requirements>from@Componentfields inherited fromAbstractMavenReportinto a 2.0.0plugin.xml, which rc-7 rejects for every goal of the plugin, so report and non-report goals cannot share an artifactJavaTool/findToolcalls the toolchain reflectively; the v4 toolchain class is not public, so it warns and silently runs the Maven JDKFindings so far
org.apache.maven.api.di) is invisible to Sisu, so every ported component needs a 3.x line while its consumers run on Maven 3.@Resolutionfield that stayed null passed every maven-rar-plugin test until an IT with real dependencies was added, and maven-shade-plugin stays green while publishing the original POM instead of the reduced one.Filed from this work
XmlNodeparameters lose attributes), PackagingProvider is ignored by DefaultPackagingRegistry #13306 (PackagingProviderignored; fix proposed in Fix PackagingProvider lookup for project extensions #13319), MojoExecution.getPlugin().getDependencies() throws NPE when the plugin realm is cached #13307 (plugin dependencies NPE on a cached realm; fix proposed in Keep the plugin dependency node in the realm cache #13312), Maven 4 API mojos cannot inject Sisu components from their plugin realm #13326 (Maven 4 API mojos cannot inject Sisu components from their plugin realm; fix in Fix #13326: inject Sisu components from the plugin realm into Maven 4 API mojos #13327, 4.0.x in [4.0.x] Fix #13326: inject Sisu components from the plugin realm into Maven 4 API mojos #13328).MarkdownHtmlParseris registered as aParserthrough its bare@Named).ScmManager(Build an ScmManager without Sisu through ServiceLoader maven-scm#1418), the Doxia parser managers (Build the parser, parser module and macro managers through ServiceLoader maven-doxia#1110) and aCompilerManager(Build a CompilerManager through ServiceLoader codehaus-plexus/plexus-compiler#524) without Sisu. Once Maven 4 API mojos cannot inject Sisu components from their plugin realm #13326 lands, Maven 4 API mojos inject Sisu components from their plugin realm throughjavax.inject, as on Maven 3.BuildContext; it depends on Add incremental build context API and implementation #12576.Components
Counts are
src/mainfiles importing the Maven 3 API on the default branch, excluding a plugin's ownorg.apache.maven.plugins.*packages; for the shared components the count is imports. For repositories that hold both a library and a plugin (surefire, release, enforcer, plugin-tools, archetype, scm, jxr, wrapper), only the library modules are counted and ported; the plugin modules are consumers.Migration needed
app-clientpackaging still registered through Plexuscomponents.xml: rc-7 ignoresPackagingProvidermaven.projectis now the v4Project,maven.project.helperremovedbuildinfo-dir: apomproject has no main artifact);check-buildplanapproximated with no execution-plan service;reproducible-centralreport blocked by the reporting chainrun-itsby the POM); needs an unreleased plexus-archiver: its archivers cannot unpack without a containerCannot cast ChangeLogReportFactory to org.apache.maven.plugin.Mojo); ITs 4 of 4 → 0 of 4checkported (16 unit, 30 ITs; 4 ITs no longer run the report first); report goals blocked, 19 report ITs excluded; plexus-resources built without Sisuadd,remove,list-repositories,analyze-reporthave no route;tree -Dverboseloses conflict dataEarMojoITcases and 17 of 18 ITs pass;skinny-wars-timestampfails (no timestamped snapshot version);includesDependenciesignored by the resolversisu.plexusat compile scope for the legacyBuildContext, as maven-resources-plugin doesrequireUpperBoundDeps,banDynamicVersions,requireProfileIdsExist); plugin and extension excludedgpgsigner ITs not runnable here); encrypted{...}passphrases have no API route and now fail explicitlydescribeprefix lookup andevaluaterebuilt without a plugin manager or expression evaluator;effective-pomproperties now sortedMINVOKER-377fails because an alternate local repository cannot override the split layout; report goal blocked by the reporting chainmvn siteruns); as a site report blocked by the reporting chain@Resolutionfields stay null because plugin-tools writes no<resolutions>DependencyResolver,LocationManagerdroppedLocationManagercheckdepended on the report only through@Execute, now removedProjectBuildercannot build a project from a repository artifact, and conflict data exists only as textrarpackaging still registered through Maven 3 componentsApiRunnerfor aSessionoutside MavenScmManagerbuilt from the Sisu index by hand, maven-scm has no non-Sisu factoryprojectis now the v4ProjectShaderSPI changes✅ Migration not needed: no Maven API used
16 components
These use no import from Maven core, model, plugin or artifact packages and no
org.apache.maven:*dependency (Doxia is not Maven API). They work on Maven 4 as they are; the branch only switches CI to Maven 4.✅ Already on the Maven 4 API
5 entries
mavenVersionis still 4.0.0-rc-6)-3.xmaintenance branch4.0.xbranch (master is still 3.x)The 2022
mvn4prototype branches, written against an earlier API, were checked against theagent/mvn4-apiports and deleted (61 branches).Out of scope: maven (core), maven-integration-testing and maven-resolver (core or below it); maven-verifier (superseded by maven-executor); maven-shared-incremental (retirement vote open) and maven-shared-io (retired); maven-doxia-linkcheck and maven-default-skin (archived); maven-plugin-testing (master is empty); parent POMs, maven-apache-resources, maven-gh-actions-shared, maven-site, maven-sources and maven-dist-tool (no library code).
Related: #12709 (minimum Maven baseline).