diff --git a/MAVEN4_UPGRADE_NOTES.md b/MAVEN4_UPGRADE_NOTES.md new file mode 100644 index 0000000000..2d40a65519 --- /dev/null +++ b/MAVEN4_UPGRADE_NOTES.md @@ -0,0 +1,167 @@ +# Maven 4 Upgrade Notes for m2e + +This document describes the changes made to upgrade m2e's embedded Maven runtime from Maven 3.9.11 to Maven 4.0.0-rc-4. + +## Changes Made + +### 1. Maven Runtime Bundle (org.eclipse.m2e.maven.runtime) + +#### Version Update +- Updated `maven-core.version` from `3.9.11` to `4.0.0-rc-4` +- Updated bundle version from `3.9.1100-SNAPSHOT` to `4.0.004-SNAPSHOT` + +#### Dependency Changes + +**Removed Dependencies:** +- `org.fusesource.jansi:jansi` - Replaced with `org.jline:jansi-core` (Maven 4 uses JLine's jansi) +- `org.apache.maven:maven-slf4j-provider` - Replaced with `org.apache.maven:maven-logging` +- `org.apache.maven.resolver:maven-resolver-transport-http` - Replaced with `maven-resolver-transport-jdk` + +**Added/Updated Dependencies:** +- `org.apache.maven:maven-logging:4.0.0-rc-4` - New Maven 4 logging module +- `org.apache.maven:maven-compat:4.0.0-rc-4` - Backward compatibility layer for Maven 3 APIs +- `org.jline:jansi-core:3.30.4` - JLine's jansi implementation +- `org.apache.maven.resolver:maven-resolver-transport-jdk:2.0.9` - Java 11+ HTTP client-based transport +- Updated all resolver dependencies to version `2.0.9` +- Updated `com.google.guava:failureaccess` to version `1.0.1` + +#### Removed Source Files +- `org.eclipse.m2e.slf4j2.provider.MavenSLF4JProvider` - No longer needed as Maven 4 provides its own SLF4J provider +- `META-INF/services/org.slf4j.spi.SLF4JServiceProvider` - Service registration for the removed provider + +#### BND Configuration Updates +- Updated SLF4J binding jar name from `maven-slf4j-provider-${maven-core.version}.jar` to `maven-logging-${maven-core.version}.jar` + +### 2. Runtime Target Platform (target-platform/m2e-runtimes.target) + +- Updated to reference Maven runtime `3.9.1100.20241011-1318` from m2e release 2.2.1 for backward compatibility +- This allows running tests with both Maven 3.9.11 and Maven 4.0.0-rc-4 + +### 3. Root POM (pom.xml) + +- Updated maven.runtime dependency version from `3.9.1100-SNAPSHOT` to `4.0.004-SNAPSHOT` + +## Maven 4 Architecture Changes + +### New Modules in Maven 4 +Maven 4 introduces several new API modules: +- `maven-api-core` - Core Maven 4 API +- `maven-api-model` - Model API +- `maven-api-plugin` - Plugin API +- `maven-api-settings` - Settings API +- `maven-api-toolchain` - Toolchain API +- `maven-api-xml` - XML processing API +- `maven-di` - Dependency injection module +- `maven-impl` - Implementation module +- `maven-jline` - JLine integration +- `maven-logging` - Logging module (replaces maven-slf4j-provider) + +### Backward Compatibility + +Maven 4 provides the `maven-compat` module that maintains compatibility with Maven 3 APIs. This includes: +- Support for Plexus Container API +- Legacy Maven APIs from Maven 3.x +- Compatibility layer for plugins built against Maven 3 + +## Code Compatibility Assessment + +### PlexusContainer Usage + +The following areas of m2e use PlexusContainer and related Plexus APIs: + +1. **org.eclipse.m2e.core.internal.embedder.PlexusContainerManager** + - Creates and manages PlexusContainer instances + - Uses DefaultPlexusContainer, ContainerConfiguration + - **Status**: Should work with maven-compat module + +2. **org.eclipse.m2e.core.internal.embedder.IMavenPlexusContainer** + - Interface for wrapping PlexusContainer + - **Status**: Should work with maven-compat module + +3. **Plexus Utility Classes** + - `org.codehaus.plexus.util.xml.Xpp3Dom` - Used extensively for plugin configuration + - `org.codehaus.plexus.util.dag.*` - DAG utilities for dependency ordering + - `org.codehaus.plexus.util.Scanner` - Build context scanning + - `org.codehaus.plexus.classworlds.ClassRealm` - ClassLoader management + - **Status**: These are still available in Maven 4 (plexus-utils, plexus-classworlds) + +4. **org.eclipse.m2e.tests.common.AbstractMavenProjectTestCase** + - Test utilities that lookup PlexusContainer + - **Status**: Should work with maven-compat module + +5. **org.eclipse.m2e.core.ui.internal.archetype.ArchetypePlugin** + - Uses DefaultPlexusContainer for archetype operations + - **Status**: Should work with maven-compat module + +## Testing Requirements + +The following areas should be tested to ensure Maven 4 compatibility: + +### Core Functionality +1. [ ] Project import from existing Maven projects +2. [ ] POM editing and validation +3. [ ] Dependency resolution +4. [ ] Plugin execution during builds +5. [ ] Workspace resolution +6. [ ] Maven lifecycle execution +7. [ ] External Maven launches + +### PlexusContainer Compatibility +1. [ ] Container creation and disposal +2. [ ] Component lookup +3. [ ] Extension loading from .mvn/extensions.xml +4. [ ] ClassRealm management +5. [ ] Plugin realm creation + +### Build and Test Infrastructure +1. [ ] Maven runtime bundle builds successfully +2. [ ] All m2e modules compile against Maven 4 APIs +3. [ ] Unit tests pass +4. [ ] Integration tests pass +5. [ ] UI tests pass + +### Maven 4 Specific Features +1. [ ] New Maven 4 API usage (if any) +2. [ ] Maven 4 resolver transport (JDK HTTP client) +3. [ ] Maven 4 logging integration with Eclipse +4. [ ] Maven 4 dependency injection (Guice/Sisu) + +## Known Issues and Limitations + +### Build Environment +- The current build requires access to repo.eclipse.org which may not be available in all environments +- Tycho 4.0.13 may have issues with JavaSE-21 execution environment + +### Potential API Changes +The following Maven APIs may have changed between Maven 3 and Maven 4: +1. **Resolver APIs** - Updated from 1.x to 2.x + - New transport mechanism (JDK HTTP client vs Apache HttpClient) + - May affect custom repository configurations + +2. **Logging** - New maven-logging module + - Uses SLF4J 2.x + - May affect log filtering and configuration + +3. **Plugin API** - New maven-api-plugin module + - May affect plugin descriptor reading + - May affect mojo parameter injection + +## Recommendations + +### Short Term +1. Complete full build and test cycle to identify any runtime issues +2. Test with real-world projects to validate Maven 4 compatibility +3. Document any API incompatibilities found during testing +4. Consider keeping Maven 3.9.11 runtime as an alternative for users + +### Long Term +1. Consider migrating to Maven 4 APIs where beneficial +2. Deprecate Maven 3-specific workarounds that are no longer needed +3. Take advantage of Maven 4's improved dependency injection +4. Explore Maven 4's new features (e.g., build cache, consumer POM) + +## References + +- Maven 4.0.0-rc-4 Release: https://repo.maven.apache.org/maven2/org/apache/maven/maven/4.0.0-rc-4/ +- Maven Resolver 2.0.9: https://maven.apache.org/resolver/ +- Maven 4 Migration Guide: https://maven.apache.org/docs/4.0.0/ diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 2bebd1fbe9..06f5097b02 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,5 +1,22 @@ # Eclipse m2e - Release notes +## 2.10.0 (Planned) + +* 📅 Release Date: TBD + +### Embed and use Maven 4.0.0-rc-4 + +Updated the embedded Maven from version 3.9.11 to 4.0.0-rc-4, the first Maven 4 release candidate. +Maven 4 includes the maven-compat module for backward compatibility with Maven 3 APIs. +See [MAVEN4_UPGRADE_NOTES.md](MAVEN4_UPGRADE_NOTES.md) for detailed upgrade information. + +Key changes: +- New Maven 4 API modules (maven-api-core, maven-api-model, etc.) +- New maven-logging module replaces maven-slf4j-provider +- Maven Resolver updated to version 2.0.9 +- New JDK-based HTTP transport (maven-resolver-transport-jdk) +- Backward compatibility maintained through maven-compat module + ## 2.9.1 * 📅 Release Date: 02nd September 2025 diff --git a/org.eclipse.m2e.maven.runtime/pom.xml b/org.eclipse.m2e.maven.runtime/pom.xml index fa77092094..31f1befb9e 100644 --- a/org.eclipse.m2e.maven.runtime/pom.xml +++ b/org.eclipse.m2e.maven.runtime/pom.xml @@ -21,14 +21,16 @@ org.eclipse.m2e.maven.runtime - 3.9.1100-SNAPSHOT + 4.0.004-SNAPSHOT jar M2E Embedded Maven Runtime (includes Incubating components) - 3.9.11 + 4.0.0-rc-4 + + 2.0.9 1.2.0 target/jars @@ -77,22 +79,27 @@ org.apache.maven.resolver maven-resolver-impl + ${resolver.version} org.apache.maven.resolver maven-resolver-connector-basic + ${resolver.version} org.apache.maven.resolver maven-resolver-transport-wagon + ${resolver.version} org.apache.maven.resolver maven-resolver-transport-file + ${resolver.version} org.apache.maven.resolver - maven-resolver-transport-http + maven-resolver-transport-jdk + ${resolver.version} commons-codec @@ -109,14 +116,14 @@ wagon-file - org.fusesource.jansi - jansi + org.jline + jansi-core org.apache.maven - maven-slf4j-provider + maven-logging @@ -135,6 +142,7 @@ com.google.guava failureaccess + 1.0.1 provided @@ -181,7 +189,7 @@ # However when the this Maven runtime is used within the Eclipse-IDE(-JVM) we don't want it to use the embedded SLF4J-binding # but instead use the SLF4J-binding provided by the Eclipse runtime. This is achived by making the embedded SLF4J-binding invisible # for OSGi, by simply NOT placing the binding's jar on the Bundle-ClassPath. - slf4jBinding=maven-slf4j-provider-${maven-core.version}.jar + slf4jBinding=maven-logging-${maven-core.version}.jar M2E-SLF4JBinding=jars/${slf4jBinding} -includeresource: \ jars/=${jars.directory}/;recursive:=false;lib:=true;filter:=!${slf4jBinding},\ diff --git a/org.eclipse.m2e.maven.runtime/src/main/java/org/eclipse/m2e/slf4j2/provider/MavenSLF4JProvider.java b/org.eclipse.m2e.maven.runtime/src/main/java/org/eclipse/m2e/slf4j2/provider/MavenSLF4JProvider.java deleted file mode 100644 index ad86903a73..0000000000 --- a/org.eclipse.m2e.maven.runtime/src/main/java/org/eclipse/m2e/slf4j2/provider/MavenSLF4JProvider.java +++ /dev/null @@ -1,58 +0,0 @@ -/******************************************************************************** - * Copyright (c) 2023, 2023 Hannes Wellmann and others - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * SPDX-License-Identifier: EPL-2.0 - * - * Contributors: - * Hannes Wellmann - initial API and implementation - ********************************************************************************/ - -package org.eclipse.m2e.slf4j2.provider; - -import org.slf4j.ILoggerFactory; -import org.slf4j.IMarkerFactory; -import org.slf4j.helpers.BasicMarkerFactory; -import org.slf4j.helpers.NOPMDCAdapter; -import org.slf4j.impl.SimpleLoggerFactory; -import org.slf4j.spi.MDCAdapter; -import org.slf4j.spi.SLF4JServiceProvider; - -public class MavenSLF4JProvider implements SLF4JServiceProvider { - // Based on org.slf4j.simple.SimpleServiceProvider from org.slf4j:slf4j-simple - - private ILoggerFactory loggerFactory; - private final IMarkerFactory markerFactory = new BasicMarkerFactory(); - private final MDCAdapter mdcAdapter = new NOPMDCAdapter(); - - @Override - public ILoggerFactory getLoggerFactory() { - return loggerFactory; - } - - @Override - public IMarkerFactory getMarkerFactory() { - return markerFactory; - } - - @Override - public MDCAdapter getMDCAdapter() { - return mdcAdapter; - } - - @Override - public String getRequestedApiVersion() { - // Declare the version of the maximum SLF4J API this implementation is - // compatible with. The value of this field is modified with each major release. - return "2.0.99"; - } - - @Override - public void initialize() { - loggerFactory = new SimpleLoggerFactory(); - } - -} diff --git a/org.eclipse.m2e.maven.runtime/src/main/resources/META-INF/services/org.slf4j.spi.SLF4JServiceProvider b/org.eclipse.m2e.maven.runtime/src/main/resources/META-INF/services/org.slf4j.spi.SLF4JServiceProvider deleted file mode 100644 index 9328c80d52..0000000000 --- a/org.eclipse.m2e.maven.runtime/src/main/resources/META-INF/services/org.slf4j.spi.SLF4JServiceProvider +++ /dev/null @@ -1 +0,0 @@ -org.eclipse.m2e.slf4j2.provider.MavenSLF4JProvider diff --git a/pom.xml b/pom.xml index c179268297..1ff31420d0 100644 --- a/pom.xml +++ b/pom.xml @@ -99,7 +99,7 @@ org.eclipse.m2e org.eclipse.m2e.maven.runtime - 3.9.1100-SNAPSHOT + 4.0.004-SNAPSHOT diff --git a/target-platform/m2e-runtimes.target b/target-platform/m2e-runtimes.target index 13fabab5eb..0cab7c6b49 100644 --- a/target-platform/m2e-runtimes.target +++ b/target-platform/m2e-runtimes.target @@ -2,9 +2,10 @@ + - + \ No newline at end of file