Skip to content

Commit 1d41df7

Browse files
committed
Compatibility Adjustments
1 parent bc3fb48 commit 1d41df7

File tree

7 files changed

+290
-11
lines changed

7 files changed

+290
-11
lines changed

MAVEN4_UPGRADE_NOTES.md

Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
# Maven 4 Upgrade Notes for m2e
2+
3+
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.
4+
5+
## Compatibility Issues
6+
7+
- MavenCLI --> Constants
8+
- LifecycleExecutionPlanCalculator -> changed signatures
9+
- org.apache.maven.shared.utils.StringUtils -> replace
10+
- ReadonlyMavenExecutionRequest implements MavenExecutionReques --> needs to be part of runtime!
11+
- ExtensionResolutionException --> convert to plexus one helper method in runtime
12+
- ProjectSorter --> catch generic exception
13+
14+
15+
16+
## Changes Made
17+
18+
### 1. Maven Runtime Bundle (org.eclipse.m2e.maven.runtime)
19+
20+
#### Version Update
21+
- Updated `maven-core.version` from `3.9.11` to `4.0.0-rc-4`
22+
- Updated bundle version from `3.9.1100-SNAPSHOT` to `4.0.004-SNAPSHOT`
23+
24+
#### Dependency Changes
25+
26+
**Removed Dependencies:**
27+
- `org.fusesource.jansi:jansi` - Replaced with `org.jline:jansi-core` (Maven 4 uses JLine's jansi)
28+
- `org.apache.maven:maven-slf4j-provider` - Replaced with `org.apache.maven:maven-logging`
29+
- `org.apache.maven.resolver:maven-resolver-transport-http` - Replaced with `maven-resolver-transport-jdk`
30+
31+
**Added/Updated Dependencies:**
32+
- `org.apache.maven:maven-logging:4.0.0-rc-4` - New Maven 4 logging module
33+
- `org.apache.maven:maven-compat:4.0.0-rc-4` - Backward compatibility layer for Maven 3 APIs
34+
- `org.jline:jansi-core:3.30.4` - JLine's jansi implementation
35+
- `org.apache.maven.resolver:maven-resolver-transport-jdk:2.0.9` - Java 11+ HTTP client-based transport
36+
- Updated all resolver dependencies to version `2.0.9`
37+
- Updated `com.google.guava:failureaccess` to version `1.0.1`
38+
39+
#### Removed Source Files
40+
- `org.eclipse.m2e.slf4j2.provider.MavenSLF4JProvider` - No longer needed as Maven 4 provides its own SLF4J provider
41+
- `META-INF/services/org.slf4j.spi.SLF4JServiceProvider` - Service registration for the removed provider
42+
43+
#### BND Configuration Updates
44+
- Updated SLF4J binding jar name from `maven-slf4j-provider-${maven-core.version}.jar` to `maven-logging-${maven-core.version}.jar`
45+
46+
### 2. Runtime Target Platform (target-platform/m2e-runtimes.target)
47+
48+
- Updated to reference Maven runtime `3.9.1100.20241011-1318` from m2e release 2.2.1 for backward compatibility
49+
- This allows running tests with both Maven 3.9.11 and Maven 4.0.0-rc-4
50+
51+
### 3. Root POM (pom.xml)
52+
53+
- Updated maven.runtime dependency version from `3.9.1100-SNAPSHOT` to `4.0.004-SNAPSHOT`
54+
55+
## Maven 4 Architecture Changes
56+
57+
### New Modules in Maven 4
58+
Maven 4 introduces several new API modules:
59+
- `maven-api-core` - Core Maven 4 API
60+
- `maven-api-model` - Model API
61+
- `maven-api-plugin` - Plugin API
62+
- `maven-api-settings` - Settings API
63+
- `maven-api-toolchain` - Toolchain API
64+
- `maven-api-xml` - XML processing API
65+
- `maven-di` - Dependency injection module
66+
- `maven-impl` - Implementation module
67+
- `maven-jline` - JLine integration
68+
- `maven-logging` - Logging module (replaces maven-slf4j-provider)
69+
70+
### Backward Compatibility
71+
72+
Maven 4 provides the `maven-compat` module that maintains compatibility with Maven 3 APIs. This includes:
73+
- Support for Plexus Container API
74+
- Legacy Maven APIs from Maven 3.x
75+
- Compatibility layer for plugins built against Maven 3
76+
77+
## Code Compatibility Assessment
78+
79+
### PlexusContainer Usage
80+
81+
The following areas of m2e use PlexusContainer and related Plexus APIs:
82+
83+
1. **org.eclipse.m2e.core.internal.embedder.PlexusContainerManager**
84+
- Creates and manages PlexusContainer instances
85+
- Uses DefaultPlexusContainer, ContainerConfiguration
86+
- **Status**: Should work with maven-compat module
87+
88+
2. **org.eclipse.m2e.core.internal.embedder.IMavenPlexusContainer**
89+
- Interface for wrapping PlexusContainer
90+
- **Status**: Should work with maven-compat module
91+
92+
3. **Plexus Utility Classes**
93+
- `org.codehaus.plexus.util.xml.Xpp3Dom` - Used extensively for plugin configuration
94+
- `org.codehaus.plexus.util.dag.*` - DAG utilities for dependency ordering
95+
- `org.codehaus.plexus.util.Scanner` - Build context scanning
96+
- `org.codehaus.plexus.classworlds.ClassRealm` - ClassLoader management
97+
- **Status**: These are still available in Maven 4 (plexus-utils, plexus-classworlds)
98+
99+
4. **org.eclipse.m2e.tests.common.AbstractMavenProjectTestCase**
100+
- Test utilities that lookup PlexusContainer
101+
- **Status**: Should work with maven-compat module
102+
103+
5. **org.eclipse.m2e.core.ui.internal.archetype.ArchetypePlugin**
104+
- Uses DefaultPlexusContainer for archetype operations
105+
- **Status**: Should work with maven-compat module
106+
107+
## Testing Requirements
108+
109+
The following areas should be tested to ensure Maven 4 compatibility:
110+
111+
### Core Functionality
112+
1. [ ] Project import from existing Maven projects
113+
2. [ ] POM editing and validation
114+
3. [ ] Dependency resolution
115+
4. [ ] Plugin execution during builds
116+
5. [ ] Workspace resolution
117+
6. [ ] Maven lifecycle execution
118+
7. [ ] External Maven launches
119+
120+
### PlexusContainer Compatibility
121+
1. [ ] Container creation and disposal
122+
2. [ ] Component lookup
123+
3. [ ] Extension loading from .mvn/extensions.xml
124+
4. [ ] ClassRealm management
125+
5. [ ] Plugin realm creation
126+
127+
### Build and Test Infrastructure
128+
1. [ ] Maven runtime bundle builds successfully
129+
2. [ ] All m2e modules compile against Maven 4 APIs
130+
3. [ ] Unit tests pass
131+
4. [ ] Integration tests pass
132+
5. [ ] UI tests pass
133+
134+
### Maven 4 Specific Features
135+
1. [ ] New Maven 4 API usage (if any)
136+
2. [ ] Maven 4 resolver transport (JDK HTTP client)
137+
3. [ ] Maven 4 logging integration with Eclipse
138+
4. [ ] Maven 4 dependency injection (Guice/Sisu)
139+
140+
## Known Issues and Limitations
141+
142+
### Build Environment
143+
- The current build requires access to repo.eclipse.org which may not be available in all environments
144+
- Tycho 4.0.13 may have issues with JavaSE-21 execution environment
145+
146+
### Potential API Changes
147+
The following Maven APIs may have changed between Maven 3 and Maven 4:
148+
1. **Resolver APIs** - Updated from 1.x to 2.x
149+
- New transport mechanism (JDK HTTP client vs Apache HttpClient)
150+
- May affect custom repository configurations
151+
152+
2. **Logging** - New maven-logging module
153+
- Uses SLF4J 2.x
154+
- May affect log filtering and configuration
155+
156+
3. **Plugin API** - New maven-api-plugin module
157+
- May affect plugin descriptor reading
158+
- May affect mojo parameter injection
159+
160+
## Recommendations
161+
162+
### Short Term
163+
1. Complete full build and test cycle to identify any runtime issues
164+
2. Test with real-world projects to validate Maven 4 compatibility
165+
3. Document any API incompatibilities found during testing
166+
4. Consider keeping Maven 3.9.11 runtime as an alternative for users
167+
168+
### Long Term
169+
1. Consider migrating to Maven 4 APIs where beneficial
170+
2. Deprecate Maven 3-specific workarounds that are no longer needed
171+
3. Take advantage of Maven 4's improved dependency injection
172+
4. Explore Maven 4's new features (e.g., build cache, consumer POM)
173+
174+
## References
175+
176+
- Maven 4.0.0-rc-4 Release: https://repo.maven.apache.org/maven2/org/apache/maven/maven/4.0.0-rc-4/
177+
- Maven Resolver 2.0.9: https://maven.apache.org/resolver/
178+
- Maven 4 Migration Guide: https://maven.apache.org/docs/4.0.0/

org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/embedder/MavenImpl.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,6 @@
6666
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
6767
import org.codehaus.plexus.configuration.PlexusConfiguration;
6868
import org.codehaus.plexus.configuration.xml.XmlPlexusConfiguration;
69-
import org.codehaus.plexus.util.dag.CycleDetectedException;
7069
import org.codehaus.plexus.util.xml.Xpp3Dom;
7170

7271
import org.apache.maven.RepositoryUtils;
@@ -110,7 +109,6 @@
110109
import org.apache.maven.plugin.version.PluginVersionRequest;
111110
import org.apache.maven.plugin.version.PluginVersionResolutionException;
112111
import org.apache.maven.plugin.version.PluginVersionResolver;
113-
import org.apache.maven.project.DuplicateProjectException;
114112
import org.apache.maven.project.MavenProject;
115113
import org.apache.maven.project.ProjectBuilder;
116114
import org.apache.maven.project.ProjectBuildingException;
@@ -962,7 +960,7 @@ public List<MavenProject> getSortedProjects(List<MavenProject> projects) throws
962960
try {
963961
ProjectSorter rm = new ProjectSorter(projects);
964962
return rm.getSortedProjects();
965-
} catch(CycleDetectedException | DuplicateProjectException ex) {
963+
} catch(Exception ex) {
966964
throw new CoreException(Status.error(Messages.MavenImpl_error_sort, ex));
967965
}
968966
}

org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/registry/MavenProjectFacade.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@
4747
import org.apache.maven.project.MavenProject;
4848

4949
import org.eclipse.m2e.core.embedder.ArtifactKey;
50-
import org.eclipse.m2e.internal.maven.compat.LifecycleExecutionPlanCalculatorFacade;
5150
import org.eclipse.m2e.core.embedder.ArtifactRef;
5251
import org.eclipse.m2e.core.embedder.ArtifactRepositoryRef;
5352
import org.eclipse.m2e.core.embedder.IComponentLookup;
@@ -65,6 +64,7 @@
6564
import org.eclipse.m2e.core.project.MavenProjectUtils;
6665
import org.eclipse.m2e.core.project.ResolverConfiguration;
6766
import org.eclipse.m2e.core.project.configurator.MojoExecutionKey;
67+
import org.eclipse.m2e.internal.maven.compat.LifecycleExecutionPlanCalculatorFacade;
6868

6969

7070
public class MavenProjectFacade implements IMavenProjectFacade, Serializable {

org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/registry/ProjectRegistryManager.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,6 @@
6969
import org.eclipse.core.runtime.jobs.Job;
7070
import org.eclipse.osgi.util.NLS;
7171

72-
import org.codehaus.plexus.util.dag.CycleDetectedException;
73-
7472
import org.apache.maven.AbstractMavenLifecycleParticipant;
7573
import org.apache.maven.artifact.repository.ArtifactRepository;
7674
import org.apache.maven.artifact.repository.MavenArtifactRepository;
@@ -82,7 +80,6 @@
8280
import org.apache.maven.model.Parent;
8381
import org.apache.maven.model.building.ModelProblem;
8482
import org.apache.maven.model.building.ModelProblem.Severity;
85-
import org.apache.maven.project.DuplicateProjectException;
8683
import org.apache.maven.project.MavenProject;
8784
import org.apache.maven.project.ProjectBuildingException;
8885
import org.apache.maven.project.ProjectBuildingRequest;
@@ -848,7 +845,7 @@ private Collection<MavenProject> getSortedProjects(Collection<MavenProject> proj
848845
//sort project according to their declared dependencies...
849846
ProjectSorter sorter = new ProjectSorter(projects);
850847
return sorter.getSortedProjects();
851-
} catch(CycleDetectedException | DuplicateProjectException ex) {
848+
} catch(Exception ex) {
852849
return projects;
853850
}
854851
}

org.eclipse.m2e.jdt/src/org/eclipse/m2e/jdt/internal/JavaProjectConversionParticipant.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,8 @@ public void convert(IProject project, Model model, IProgressMonitor monitor) thr
116116
Map<String, String> options = javaProject.getOptions(true);
117117
String source = options.get(JavaCore.COMPILER_SOURCE);
118118
String target = options.get(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM);
119-
boolean emptySource = source == null || source.isEmpty();
120-
boolean emptyTarget = target == null || target.isEmpty();
119+
boolean emptySource = source == null || source.isBlank();
120+
boolean emptyTarget = target == null || target.isBlank();
121121

122122
if(emptySource && emptyTarget) {
123123
return;

org.eclipse.m2e.maven.runtime/src/main/java/org/eclipse/m2e/internal/maven/compat/LifecycleExecutionPlanCalculatorFacade.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313

1414
package org.eclipse.m2e.internal.maven.compat;
1515

16+
import java.util.HashSet;
17+
1618
import org.apache.maven.execution.MavenSession;
1719
import org.apache.maven.lifecycle.internal.LifecycleExecutionPlanCalculator;
1820
import org.apache.maven.plugin.MojoExecution;
@@ -43,6 +45,6 @@ public LifecycleExecutionPlanCalculatorFacade(LifecycleExecutionPlanCalculator d
4345
*/
4446
public void setupMojoExecution(MavenSession session, MavenProject project, MojoExecution mojoExecution)
4547
throws Exception {
46-
delegate.setupMojoExecution(session, project, mojoExecution);
48+
delegate.setupMojoExecution(session, project, mojoExecution, new HashSet<>());
4749
}
4850
}

org.eclipse.m2e.maven.runtime/src/main/java/org/eclipse/m2e/internal/maven/compat/ReadonlyMavenExecutionRequest.java

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
import java.io.File;
1717
import java.lang.reflect.InvocationTargetException;
1818
import java.lang.reflect.Method;
19+
import java.nio.file.Path;
20+
import java.time.Instant;
1921
import java.util.Collections;
2022
import java.util.Date;
2123
import java.util.List;
@@ -26,6 +28,8 @@
2628
import org.apache.maven.eventspy.internal.EventSpyDispatcher;
2729
import org.apache.maven.execution.ExecutionListener;
2830
import org.apache.maven.execution.MavenExecutionRequest;
31+
import org.apache.maven.execution.ProfileActivation;
32+
import org.apache.maven.execution.ProjectActivation;
2933
import org.apache.maven.model.Profile;
3034
import org.apache.maven.project.ProjectBuildingRequest;
3135
import org.apache.maven.settings.Mirror;
@@ -630,4 +634,104 @@ public MavenExecutionRequest setToolchains(Map<String, List<ToolchainModel>> too
630634
throw new IllegalStateException();
631635
}
632636

637+
@Override
638+
public MavenExecutionRequest setStartInstant(Instant start) {
639+
throw new IllegalStateException();
640+
}
641+
642+
@Override
643+
public Instant getStartInstant() {
644+
return request.getStartInstant();
645+
}
646+
647+
@Override
648+
public MavenExecutionRequest setResume(boolean resume) {
649+
throw new IllegalStateException();
650+
}
651+
652+
@Override
653+
public boolean isResume() {
654+
return request.isResume();
655+
}
656+
657+
@Override
658+
public boolean isIgnoreMissingArtifactDescriptor() {
659+
return request.isIgnoreMissingArtifactDescriptor();
660+
}
661+
662+
@Override
663+
public MavenExecutionRequest setIgnoreMissingArtifactDescriptor(boolean ignoreMissing) {
664+
throw new IllegalStateException();
665+
}
666+
667+
@Override
668+
public boolean isIgnoreInvalidArtifactDescriptor() {
669+
return request.isIgnoreInvalidArtifactDescriptor();
670+
}
671+
672+
@Override
673+
public MavenExecutionRequest setIgnoreInvalidArtifactDescriptor(boolean ignoreInvalid) {
674+
throw new IllegalStateException();
675+
}
676+
677+
@Override
678+
public ProjectActivation getProjectActivation() {
679+
return request.getProjectActivation();
680+
}
681+
682+
@Override
683+
public ProfileActivation getProfileActivation() {
684+
return request.getProfileActivation();
685+
}
686+
687+
@Override
688+
public File getProjectSettingsFile() {
689+
return request.getProjectSettingsFile();
690+
}
691+
692+
@Override
693+
public MavenExecutionRequest setProjectSettingsFile(File projectSettingsFile) {
694+
throw new IllegalStateException();
695+
}
696+
697+
@Override
698+
public File getInstallationSettingsFile() {
699+
return request.getInstallationSettingsFile();
700+
}
701+
702+
@Override
703+
public MavenExecutionRequest setInstallationSettingsFile(File installationSettingsFile) {
704+
throw new IllegalStateException();
705+
}
706+
707+
@Override
708+
public File getInstallationToolchainsFile() {
709+
return request.getInstallationToolchainsFile();
710+
}
711+
712+
@Override
713+
public MavenExecutionRequest setInstallationToolchainsFile(File installationToolchainsFile) {
714+
throw new IllegalStateException();
715+
}
716+
717+
@Override
718+
public MavenExecutionRequest setTopDirectory(Path topDirectory) {
719+
throw new IllegalStateException();
720+
}
721+
722+
@Override
723+
public Path getTopDirectory() {
724+
return request.getTopDirectory();
725+
}
726+
727+
@Override
728+
public MavenExecutionRequest setRootDirectory(Path rootDirectory) {
729+
throw new IllegalStateException();
730+
}
731+
732+
@Override
733+
public Path getRootDirectory() {
734+
return request.getRootDirectory();
735+
}
736+
633737
}

0 commit comments

Comments
 (0)