From 2b5bb9ecf38914d0928c772262f767562b9359cb Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Thu, 9 Nov 2023 15:05:03 +0100 Subject: [PATCH 01/15] [MNG-7653] Integrate Resolver 2.x onSessionClose WIP --- https://issues.apache.org/jira/browse/MNG-7653 --- .../java/org/apache/maven/DefaultMaven.java | 7 +-- ...DefaultRepositorySystemSessionFactory.java | 10 ++-- .../BootstrapCoreExtensionManager.java | 10 ++-- .../internal/MavenRepositorySystemUtils.java | 48 +++++++++++++++++++ pom.xml | 2 +- 5 files changed, 65 insertions(+), 12 deletions(-) diff --git a/maven-core/src/main/java/org/apache/maven/DefaultMaven.java b/maven-core/src/main/java/org/apache/maven/DefaultMaven.java index c148261aaa65..52207b39be01 100644 --- a/maven-core/src/main/java/org/apache/maven/DefaultMaven.java +++ b/maven-core/src/main/java/org/apache/maven/DefaultMaven.java @@ -214,8 +214,9 @@ private MavenExecutionResult doExecute(MavenExecutionRequest request) { // so that @SessionScoped components can be @Injected into AbstractLifecycleParticipants. // sessionScope.enter(); - try { - DefaultRepositorySystemSession repoSession = (DefaultRepositorySystemSession) newRepositorySession(request); + try (RepositorySystemSession.CloseableRepositorySystemSession closeableSession = + newRepositorySession(request).build()) { + DefaultRepositorySystemSession repoSession = new DefaultRepositorySystemSession(closeableSession); MavenSession session = new MavenSession(container, repoSession, request, result); session.setSession(defaultSessionFactory.getSession(session)); @@ -404,7 +405,7 @@ private void persistResumptionData(MavenExecutionResult result, MavenSession ses } } - public RepositorySystemSession newRepositorySession(MavenExecutionRequest request) { + public RepositorySystemSession.SessionBuilder newRepositorySession(MavenExecutionRequest request) { return repositorySessionFactory.newRepositorySession(request); } diff --git a/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java b/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java index a0e29f1d818f..e2ee933e6638 100644 --- a/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java +++ b/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java @@ -50,8 +50,8 @@ import org.apache.maven.settings.crypto.SettingsDecryptionResult; import org.codehaus.plexus.configuration.PlexusConfiguration; import org.eclipse.aether.ConfigurationProperties; -import org.eclipse.aether.DefaultRepositorySystemSession; import org.eclipse.aether.RepositorySystem; +import org.eclipse.aether.RepositorySystemSession; import org.eclipse.aether.repository.LocalRepository; import org.eclipse.aether.repository.LocalRepositoryManager; import org.eclipse.aether.repository.RepositoryPolicy; @@ -169,8 +169,9 @@ public DefaultRepositorySystemSessionFactory( } @SuppressWarnings("checkstyle:methodLength") - public DefaultRepositorySystemSession newRepositorySession(MavenExecutionRequest request) { - DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession(); + public RepositorySystemSession.SessionBuilder newRepositorySession(MavenExecutionRequest request) { + RepositorySystemSession.SessionBuilder session = + MavenRepositorySystemUtils.newSession(repoSystem.createSessionBuilder()); session.setCache(request.getRepositoryCache()); Map configProps = new LinkedHashMap<>(); @@ -386,7 +387,8 @@ public DefaultRepositorySystemSession newRepositorySession(MavenExecutionRequest return session; } - private void setUpLocalRepositoryManager(MavenExecutionRequest request, DefaultRepositorySystemSession session) { + private void setUpLocalRepositoryManager( + MavenExecutionRequest request, RepositorySystemSession.SessionBuilder session) { LocalRepository localRepo = new LocalRepository(request.getLocalRepository().getBasedir()); diff --git a/maven-embedder/src/main/java/org/apache/maven/cli/internal/BootstrapCoreExtensionManager.java b/maven-embedder/src/main/java/org/apache/maven/cli/internal/BootstrapCoreExtensionManager.java index f6b86c26d6a4..9c895ca79938 100644 --- a/maven-embedder/src/main/java/org/apache/maven/cli/internal/BootstrapCoreExtensionManager.java +++ b/maven-embedder/src/main/java/org/apache/maven/cli/internal/BootstrapCoreExtensionManager.java @@ -91,11 +91,13 @@ public BootstrapCoreExtensionManager( public List loadCoreExtensions( MavenExecutionRequest request, Set providedArtifacts, List extensions) throws Exception { - RepositorySystemSession repoSession = repositorySystemSessionFactory.newRepositorySession(request); - List repositories = RepositoryUtils.toRepos(request.getPluginArtifactRepositories()); - Interpolator interpolator = createInterpolator(request); + try (RepositorySystemSession.CloseableRepositorySystemSession repoSession = + repositorySystemSessionFactory.newRepositorySession(request).build()) { + List repositories = RepositoryUtils.toRepos(request.getPluginArtifactRepositories()); + Interpolator interpolator = createInterpolator(request); - return resolveCoreExtensions(repoSession, repositories, providedArtifacts, extensions, interpolator); + return resolveCoreExtensions(repoSession, repositories, providedArtifacts, extensions, interpolator); + } } private List resolveCoreExtensions( diff --git a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/MavenRepositorySystemUtils.java b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/MavenRepositorySystemUtils.java index dc18e206bc98..3816b21343ad 100644 --- a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/MavenRepositorySystemUtils.java +++ b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/MavenRepositorySystemUtils.java @@ -19,6 +19,7 @@ package org.apache.maven.repository.internal; import org.eclipse.aether.DefaultRepositorySystemSession; +import org.eclipse.aether.RepositorySystemSession; import org.eclipse.aether.artifact.DefaultArtifactType; import org.eclipse.aether.collection.DependencyGraphTransformer; import org.eclipse.aether.collection.DependencyManager; @@ -100,4 +101,51 @@ public static DefaultRepositorySystemSession newSession() { return session; } + + /** + * Creates a new Maven-like repository system session by initializing the session with values typical for + * Maven-based resolution. In more detail, this method configures settings relevant for the processing of dependency + * graphs, most other settings remain at their generic default value. Use the various setters to further configure + * the session with authentication, mirror, proxy and other information required for your environment. + * + * @return The new repository system session, never {@code null}. + */ + public static RepositorySystemSession.SessionBuilder newSession(RepositorySystemSession.SessionBuilder session) { + DependencyTraverser depTraverser = new FatArtifactTraverser(); + session.setDependencyTraverser(depTraverser); + + DependencyManager depManager = new ClassicDependencyManager(); + session.setDependencyManager(depManager); + + DependencySelector depFilter = new AndDependencySelector( + new ScopeDependencySelector("test", "provided"), + new OptionalDependencySelector(), + new ExclusionDependencySelector()); + session.setDependencySelector(depFilter); + + DependencyGraphTransformer transformer = new ConflictResolver( + new NearestVersionSelector(), new JavaScopeSelector(), + new SimpleOptionalitySelector(), new JavaScopeDeriver()); + transformer = new ChainedDependencyGraphTransformer(transformer, new JavaDependencyContextRefiner()); + session.setDependencyGraphTransformer(transformer); + + DefaultArtifactTypeRegistry stereotypes = new DefaultArtifactTypeRegistry(); + stereotypes.add(new DefaultArtifactType("pom")); + stereotypes.add(new DefaultArtifactType("maven-plugin", "jar", "", "java")); + stereotypes.add(new DefaultArtifactType("jar", "jar", "", "java")); + stereotypes.add(new DefaultArtifactType("ejb", "jar", "", "java")); + stereotypes.add(new DefaultArtifactType("ejb-client", "jar", "client", "java")); + stereotypes.add(new DefaultArtifactType("test-jar", "jar", "tests", "java")); + stereotypes.add(new DefaultArtifactType("javadoc", "jar", "javadoc", "java")); + stereotypes.add(new DefaultArtifactType("java-source", "jar", "sources", "java", false, false)); + stereotypes.add(new DefaultArtifactType("war", "war", "", "java", false, true)); + stereotypes.add(new DefaultArtifactType("ear", "ear", "", "java", false, true)); + stereotypes.add(new DefaultArtifactType("rar", "rar", "", "java", false, true)); + stereotypes.add(new DefaultArtifactType("par", "par", "", "java", false, true)); + session.setArtifactTypeRegistry(stereotypes); + + session.setArtifactDescriptorPolicy(new SimpleArtifactDescriptorPolicy(true, true)); + + return session; + } } diff --git a/pom.xml b/pom.xml index 3da429628583..91e3d3afafd7 100644 --- a/pom.xml +++ b/pom.xml @@ -161,7 +161,7 @@ under the License. 2.0 2.0 1.3 - 2.0.0-alpha-1 + 2.0.0-SNAPSHOT 0.9.0.M2 9.5 1.7.36 From da63aebf575af2f0001c16af97b327b1b9739d74 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Thu, 9 Nov 2023 15:42:52 +0100 Subject: [PATCH 02/15] Apply renames --- maven-core/src/main/java/org/apache/maven/DefaultMaven.java | 4 ++-- .../maven/cli/internal/BootstrapCoreExtensionManager.java | 3 ++- .../maven/repository/internal/MavenRepositorySystemUtils.java | 4 ++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/maven-core/src/main/java/org/apache/maven/DefaultMaven.java b/maven-core/src/main/java/org/apache/maven/DefaultMaven.java index 52207b39be01..93d404f1a99c 100644 --- a/maven-core/src/main/java/org/apache/maven/DefaultMaven.java +++ b/maven-core/src/main/java/org/apache/maven/DefaultMaven.java @@ -75,6 +75,7 @@ import org.codehaus.plexus.component.repository.exception.ComponentLookupException; import org.eclipse.aether.DefaultRepositorySystemSession; import org.eclipse.aether.RepositorySystemSession; +import org.eclipse.aether.RepositorySystemSession.CloseableSession; import org.eclipse.aether.repository.WorkspaceReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -214,8 +215,7 @@ private MavenExecutionResult doExecute(MavenExecutionRequest request) { // so that @SessionScoped components can be @Injected into AbstractLifecycleParticipants. // sessionScope.enter(); - try (RepositorySystemSession.CloseableRepositorySystemSession closeableSession = - newRepositorySession(request).build()) { + try (CloseableSession closeableSession = newRepositorySession(request).build()) { DefaultRepositorySystemSession repoSession = new DefaultRepositorySystemSession(closeableSession); MavenSession session = new MavenSession(container, repoSession, request, result); session.setSession(defaultSessionFactory.getSession(session)); diff --git a/maven-embedder/src/main/java/org/apache/maven/cli/internal/BootstrapCoreExtensionManager.java b/maven-embedder/src/main/java/org/apache/maven/cli/internal/BootstrapCoreExtensionManager.java index 9c895ca79938..813d476428b2 100644 --- a/maven-embedder/src/main/java/org/apache/maven/cli/internal/BootstrapCoreExtensionManager.java +++ b/maven-embedder/src/main/java/org/apache/maven/cli/internal/BootstrapCoreExtensionManager.java @@ -45,6 +45,7 @@ import org.codehaus.plexus.interpolation.MapBasedValueSource; import org.codehaus.plexus.interpolation.StringSearchInterpolator; import org.eclipse.aether.RepositorySystemSession; +import org.eclipse.aether.RepositorySystemSession.CloseableSession; import org.eclipse.aether.artifact.Artifact; import org.eclipse.aether.graph.DependencyFilter; import org.eclipse.aether.graph.DependencyNode; @@ -91,7 +92,7 @@ public BootstrapCoreExtensionManager( public List loadCoreExtensions( MavenExecutionRequest request, Set providedArtifacts, List extensions) throws Exception { - try (RepositorySystemSession.CloseableRepositorySystemSession repoSession = + try (CloseableSession repoSession = repositorySystemSessionFactory.newRepositorySession(request).build()) { List repositories = RepositoryUtils.toRepos(request.getPluginArtifactRepositories()); Interpolator interpolator = createInterpolator(request); diff --git a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/MavenRepositorySystemUtils.java b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/MavenRepositorySystemUtils.java index 3816b21343ad..e43aa5ce2484 100644 --- a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/MavenRepositorySystemUtils.java +++ b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/MavenRepositorySystemUtils.java @@ -19,7 +19,7 @@ package org.apache.maven.repository.internal; import org.eclipse.aether.DefaultRepositorySystemSession; -import org.eclipse.aether.RepositorySystemSession; +import org.eclipse.aether.RepositorySystemSession.SessionBuilder; import org.eclipse.aether.artifact.DefaultArtifactType; import org.eclipse.aether.collection.DependencyGraphTransformer; import org.eclipse.aether.collection.DependencyManager; @@ -110,7 +110,7 @@ public static DefaultRepositorySystemSession newSession() { * * @return The new repository system session, never {@code null}. */ - public static RepositorySystemSession.SessionBuilder newSession(RepositorySystemSession.SessionBuilder session) { + public static SessionBuilder newSession(SessionBuilder session) { DependencyTraverser depTraverser = new FatArtifactTraverser(); session.setDependencyTraverser(depTraverser); From 56699c2e6477d6b6b27e2748960605d604f0fe54 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Thu, 9 Nov 2023 19:14:19 +0100 Subject: [PATCH 03/15] More adoption --- ...DefaultRepositorySystemSessionFactory.java | 50 ++++++++----------- 1 file changed, 20 insertions(+), 30 deletions(-) diff --git a/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java b/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java index e2ee933e6638..e0c174d5636d 100644 --- a/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java +++ b/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java @@ -21,6 +21,7 @@ import javax.inject.Inject; import javax.inject.Named; +import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -52,8 +53,6 @@ import org.eclipse.aether.ConfigurationProperties; import org.eclipse.aether.RepositorySystem; import org.eclipse.aether.RepositorySystemSession; -import org.eclipse.aether.repository.LocalRepository; -import org.eclipse.aether.repository.LocalRepositoryManager; import org.eclipse.aether.repository.RepositoryPolicy; import org.eclipse.aether.repository.WorkspaceReader; import org.eclipse.aether.resolution.ResolutionErrorPolicy; @@ -69,8 +68,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import static java.util.stream.Collectors.toList; - /** * @since 3.3.0 */ @@ -90,7 +87,9 @@ public class DefaultRepositorySystemSessionFactory { * Default: {@code true}, will ignore availability from tail local repositories. * * @since 3.9.0 + * @deprecated Use {@link ChainedLocalRepositoryManager#IGNORE_TAIL_AVAILABILITY} instead. */ + @Deprecated private static final String MAVEN_REPO_LOCAL_TAIL_IGNORE_AVAILABILITY = "maven.repo.local.tail.ignoreAvailability"; /** @@ -184,6 +183,12 @@ public RepositorySystemSession.SessionBuilder newRepositorySession(MavenExecutio configProps.putAll(request.getSystemProperties()); configProps.putAll(request.getUserProperties()); + // we need to "translate" this + if (configProps.containsKey(MAVEN_REPO_LOCAL_TAIL_IGNORE_AVAILABILITY)) { + configProps.put(ChainedLocalRepositoryManager.IGNORE_TAIL_AVAILABILITY, Boolean.parseBoolean((String) + configProps.get(MAVEN_REPO_LOCAL_TAIL_IGNORE_AVAILABILITY))); + } + session.setOffline(request.isOffline()); session.setChecksumPolicy(request.getGlobalChecksumPolicy()); session.setUpdatePolicy( @@ -368,7 +373,8 @@ public RepositorySystemSession.SessionBuilder newRepositorySession(MavenExecutio session.setRepositoryListener(eventSpyDispatcher.chainListener(new LoggingRepositoryListener(logger))); - boolean recordReverseTree = ConfigUtils.getBoolean(session, false, MAVEN_REPO_LOCAL_RECORD_REVERSE_TREE); + boolean recordReverseTree = configProps.containsKey(MAVEN_REPO_LOCAL_RECORD_REVERSE_TREE) + && ConfigUtils.getBoolean(session, false, MAVEN_REPO_LOCAL_RECORD_REVERSE_TREE); if (recordReverseTree) { session.setRepositoryListener(new ChainedRepositoryListener( session.getRepositoryListener(), new ReverseTreeRepositoryListener())); @@ -382,37 +388,21 @@ public RepositorySystemSession.SessionBuilder newRepositorySession(MavenExecutio mavenRepositorySystem.injectProxy(session, request.getPluginArtifactRepositories()); mavenRepositorySystem.injectAuthentication(session, request.getPluginArtifactRepositories()); - setUpLocalRepositoryManager(request, session); - - return session; - } - - private void setUpLocalRepositoryManager( - MavenExecutionRequest request, RepositorySystemSession.SessionBuilder session) { - LocalRepository localRepo = - new LocalRepository(request.getLocalRepository().getBasedir()); - - LocalRepositoryManager lrm = repoSystem.newLocalRepositoryManager(session, localRepo); - - String localRepoTail = ConfigUtils.getString(session, null, MAVEN_REPO_LOCAL_TAIL); + ArrayList paths = new ArrayList<>(); + paths.add(new File(request.getLocalRepository().getBasedir())); + String localRepoTail = (String) configProps.get(MAVEN_REPO_LOCAL_TAIL); if (localRepoTail != null) { - boolean ignoreTailAvailability = - ConfigUtils.getBoolean(session, true, MAVEN_REPO_LOCAL_TAIL_IGNORE_AVAILABILITY); - List tail = new ArrayList<>(); - List paths = Arrays.stream(localRepoTail.split(",")) + Arrays.stream(localRepoTail.split(",")) .filter(p -> p != null && !p.trim().isEmpty()) - .collect(toList()); - for (String path : paths) { - tail.add(repoSystem.newLocalRepositoryManager(session, new LocalRepository(path))); - } - session.setLocalRepositoryManager(new ChainedLocalRepositoryManager(lrm, tail, ignoreTailAvailability)); - } else { - session.setLocalRepositoryManager(lrm); + .map(File::new) + .forEach(paths::add); } + session.withLocalRepository(paths); + + return session; } private Map getPropertiesFromRequestedProfiles(MavenExecutionRequest request) { - HashSet activeProfileId = new HashSet<>(request.getProfileActivation().getRequiredActiveProfileIds()); activeProfileId.addAll(request.getProfileActivation().getOptionalActiveProfileIds()); From ea8b0f2c16d25f8bfd05fe3e45ab43f6433635ef Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Thu, 9 Nov 2023 21:08:09 +0100 Subject: [PATCH 04/15] Simplify more --- ...DefaultRepositorySystemSessionFactory.java | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java b/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java index e0c174d5636d..d0c63f5e7333 100644 --- a/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java +++ b/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java @@ -51,12 +51,12 @@ import org.apache.maven.settings.crypto.SettingsDecryptionResult; import org.codehaus.plexus.configuration.PlexusConfiguration; import org.eclipse.aether.ConfigurationProperties; +import org.eclipse.aether.RepositoryListener; import org.eclipse.aether.RepositorySystem; -import org.eclipse.aether.RepositorySystemSession; +import org.eclipse.aether.RepositorySystemSession.SessionBuilder; import org.eclipse.aether.repository.RepositoryPolicy; import org.eclipse.aether.repository.WorkspaceReader; import org.eclipse.aether.resolution.ResolutionErrorPolicy; -import org.eclipse.aether.util.ConfigUtils; import org.eclipse.aether.util.listener.ChainedRepositoryListener; import org.eclipse.aether.util.repository.AuthenticationBuilder; import org.eclipse.aether.util.repository.ChainedLocalRepositoryManager; @@ -128,7 +128,7 @@ public class DefaultRepositorySystemSessionFactory { private static final String JDK_HTTP_TRANSPORTER_PRIORITY_KEY = "aether.priority.JdkTransporterFactory"; - private static final String NATIVE_FILE_TRANSPORTER_PRIORITY_KEY = "aether.priority.FileTransporterFactory"; + private static final String FILE_TRANSPORTER_PRIORITY_KEY = "aether.priority.FileTransporterFactory"; private static final String RESOLVER_MAX_PRIORITY = String.valueOf(Float.MAX_VALUE); @@ -168,9 +168,8 @@ public DefaultRepositorySystemSessionFactory( } @SuppressWarnings("checkstyle:methodLength") - public RepositorySystemSession.SessionBuilder newRepositorySession(MavenExecutionRequest request) { - RepositorySystemSession.SessionBuilder session = - MavenRepositorySystemUtils.newSession(repoSystem.createSessionBuilder()); + public SessionBuilder newRepositorySession(MavenExecutionRequest request) { + SessionBuilder session = MavenRepositorySystemUtils.newSession(repoSystem.createSessionBuilder()); session.setCache(request.getRepositoryCache()); Map configProps = new LinkedHashMap<>(); @@ -185,8 +184,8 @@ public RepositorySystemSession.SessionBuilder newRepositorySession(MavenExecutio // we need to "translate" this if (configProps.containsKey(MAVEN_REPO_LOCAL_TAIL_IGNORE_AVAILABILITY)) { - configProps.put(ChainedLocalRepositoryManager.IGNORE_TAIL_AVAILABILITY, Boolean.parseBoolean((String) - configProps.get(MAVEN_REPO_LOCAL_TAIL_IGNORE_AVAILABILITY))); + configProps.put(ChainedLocalRepositoryManager.IGNORE_TAIL_AVAILABILITY, + configProps.get(MAVEN_REPO_LOCAL_TAIL_IGNORE_AVAILABILITY)); } session.setOffline(request.isOffline()); @@ -342,7 +341,7 @@ public RepositorySystemSession.SessionBuilder newRepositorySession(MavenExecutio // The "default" mode (user did not set anything) from now on defaults to AUTO } else if (MAVEN_RESOLVER_TRANSPORT_JDK.equals(transport)) { // Make sure (whatever extra priority is set) that resolver file/jdk is selected - configProps.put(NATIVE_FILE_TRANSPORTER_PRIORITY_KEY, RESOLVER_MAX_PRIORITY); + configProps.put(FILE_TRANSPORTER_PRIORITY_KEY, RESOLVER_MAX_PRIORITY); configProps.put(JDK_HTTP_TRANSPORTER_PRIORITY_KEY, RESOLVER_MAX_PRIORITY); } else if (MAVEN_RESOLVER_TRANSPORT_APACHE.equals(transport) || MAVEN_RESOLVER_TRANSPORT_NATIVE.equals(transport)) { @@ -353,7 +352,7 @@ public RepositorySystemSession.SessionBuilder newRepositorySession(MavenExecutio MAVEN_RESOLVER_TRANSPORT_APACHE); } // Make sure (whatever extra priority is set) that resolver file/apache is selected - configProps.put(NATIVE_FILE_TRANSPORTER_PRIORITY_KEY, RESOLVER_MAX_PRIORITY); + configProps.put(FILE_TRANSPORTER_PRIORITY_KEY, RESOLVER_MAX_PRIORITY); configProps.put(APACHE_HTTP_TRANSPORTER_PRIORITY_KEY, RESOLVER_MAX_PRIORITY); } else if (MAVEN_RESOLVER_TRANSPORT_WAGON.equals(transport)) { // Make sure (whatever extra priority is set) that wagon is selected @@ -371,14 +370,14 @@ public RepositorySystemSession.SessionBuilder newRepositorySession(MavenExecutio session.setTransferListener(request.getTransferListener()); - session.setRepositoryListener(eventSpyDispatcher.chainListener(new LoggingRepositoryListener(logger))); + RepositoryListener repositoryListener = eventSpyDispatcher.chainListener(new LoggingRepositoryListener(logger)); boolean recordReverseTree = configProps.containsKey(MAVEN_REPO_LOCAL_RECORD_REVERSE_TREE) - && ConfigUtils.getBoolean(session, false, MAVEN_REPO_LOCAL_RECORD_REVERSE_TREE); + && Boolean.parseBoolean((String) configProps.get(MAVEN_REPO_LOCAL_RECORD_REVERSE_TREE)); if (recordReverseTree) { - session.setRepositoryListener(new ChainedRepositoryListener( - session.getRepositoryListener(), new ReverseTreeRepositoryListener())); + repositoryListener = new ChainedRepositoryListener(repositoryListener, new ReverseTreeRepositoryListener()); } + session.setRepositoryListener(repositoryListener); mavenRepositorySystem.injectMirror(request.getRemoteRepositories(), request.getMirrors()); mavenRepositorySystem.injectProxy(session, request.getRemoteRepositories()); From 2d4b58b84c3211dc02da0f2e5253f2969831528a Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Thu, 9 Nov 2023 22:22:55 +0100 Subject: [PATCH 05/15] Updates --- .../aether/DefaultRepositorySystemSessionFactory.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java b/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java index d0c63f5e7333..62fab9d3d1fa 100644 --- a/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java +++ b/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java @@ -184,7 +184,12 @@ public SessionBuilder newRepositorySession(MavenExecutionRequest request) { // we need to "translate" this if (configProps.containsKey(MAVEN_REPO_LOCAL_TAIL_IGNORE_AVAILABILITY)) { - configProps.put(ChainedLocalRepositoryManager.IGNORE_TAIL_AVAILABILITY, + logger.warn( + "Do not use {}, switch to {}", + MAVEN_REPO_LOCAL_TAIL_IGNORE_AVAILABILITY, + ChainedLocalRepositoryManager.IGNORE_TAIL_AVAILABILITY); + configProps.put( + ChainedLocalRepositoryManager.IGNORE_TAIL_AVAILABILITY, configProps.get(MAVEN_REPO_LOCAL_TAIL_IGNORE_AVAILABILITY)); } @@ -396,7 +401,7 @@ public SessionBuilder newRepositorySession(MavenExecutionRequest request) { .map(File::new) .forEach(paths::add); } - session.withLocalRepository(paths); + session.withLocalRepositoryBasedir(paths); return session; } From 971b3052b923688a39a207b14f48facc4c4071cb Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Thu, 9 Nov 2023 22:23:52 +0100 Subject: [PATCH 06/15] Update message --- .../internal/aether/DefaultRepositorySystemSessionFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java b/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java index 62fab9d3d1fa..e5a13dc3db78 100644 --- a/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java +++ b/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java @@ -185,7 +185,7 @@ public SessionBuilder newRepositorySession(MavenExecutionRequest request) { // we need to "translate" this if (configProps.containsKey(MAVEN_REPO_LOCAL_TAIL_IGNORE_AVAILABILITY)) { logger.warn( - "Do not use {}, switch to {}", + "User property {} is DEPRECATED, switch to {}", MAVEN_REPO_LOCAL_TAIL_IGNORE_AVAILABILITY, ChainedLocalRepositoryManager.IGNORE_TAIL_AVAILABILITY); configProps.put( From 76bff1f8c64d7aa80d7f3dd53fdb446a1c4a4330 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Thu, 9 Nov 2023 23:31:36 +0100 Subject: [PATCH 07/15] Updates --- ...DefaultRepositorySystemSessionFactory.java | 112 ++++++++++++++++-- 1 file changed, 105 insertions(+), 7 deletions(-) diff --git a/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java b/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java index e5a13dc3db78..e1a1f61d32af 100644 --- a/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java +++ b/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java @@ -24,6 +24,7 @@ import java.io.File; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; @@ -34,6 +35,8 @@ import org.apache.maven.RepositoryUtils; import org.apache.maven.api.xml.XmlNode; import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager; +import org.apache.maven.artifact.repository.ArtifactRepository; +import org.apache.maven.artifact.repository.Authentication; import org.apache.maven.bridge.MavenRepositorySystem; import org.apache.maven.eventspy.internal.EventSpyDispatcher; import org.apache.maven.execution.MavenExecutionRequest; @@ -54,6 +57,10 @@ import org.eclipse.aether.RepositoryListener; import org.eclipse.aether.RepositorySystem; import org.eclipse.aether.RepositorySystemSession.SessionBuilder; +import org.eclipse.aether.repository.AuthenticationContext; +import org.eclipse.aether.repository.AuthenticationSelector; +import org.eclipse.aether.repository.ProxySelector; +import org.eclipse.aether.repository.RemoteRepository; import org.eclipse.aether.repository.RepositoryPolicy; import org.eclipse.aether.repository.WorkspaceReader; import org.eclipse.aether.resolution.ResolutionErrorPolicy; @@ -384,13 +391,13 @@ public SessionBuilder newRepositorySession(MavenExecutionRequest request) { } session.setRepositoryListener(repositoryListener); - mavenRepositorySystem.injectMirror(request.getRemoteRepositories(), request.getMirrors()); - mavenRepositorySystem.injectProxy(session, request.getRemoteRepositories()); - mavenRepositorySystem.injectAuthentication(session, request.getRemoteRepositories()); + injectMirror(request.getRemoteRepositories(), request.getMirrors()); + injectProxy(proxySelector, request.getRemoteRepositories()); + injectAuthentication(authSelector, request.getRemoteRepositories()); - mavenRepositorySystem.injectMirror(request.getPluginArtifactRepositories(), request.getMirrors()); - mavenRepositorySystem.injectProxy(session, request.getPluginArtifactRepositories()); - mavenRepositorySystem.injectAuthentication(session, request.getPluginArtifactRepositories()); + injectMirror(request.getPluginArtifactRepositories(), request.getMirrors()); + injectProxy(proxySelector, request.getPluginArtifactRepositories()); + injectAuthentication(authSelector, request.getPluginArtifactRepositories()); ArrayList paths = new ArrayList<>(); paths.add(new File(request.getLocalRepository().getBasedir())); @@ -401,7 +408,7 @@ public SessionBuilder newRepositorySession(MavenExecutionRequest request) { .map(File::new) .forEach(paths::add); } - session.withLocalRepositoryBasedir(paths); + session.withLocalRepositoryBaseDirectories(paths); return session; } @@ -424,4 +431,95 @@ private String getUserAgent() { return "Apache-Maven" + version + " (Java " + System.getProperty("java.version") + "; " + System.getProperty("os.name") + " " + System.getProperty("os.version") + ")"; } + + private void injectMirror(List repositories, List mirrors) { + if (repositories != null && mirrors != null) { + for (ArtifactRepository repository : repositories) { + Mirror mirror = MavenRepositorySystem.getMirror(repository, mirrors); + injectMirror(repository, mirror); + } + } + } + + private void injectMirror(ArtifactRepository repository, Mirror mirror) { + if (mirror != null) { + ArtifactRepository original = MavenRepositorySystem.createArtifactRepository( + repository.getId(), + repository.getUrl(), + repository.getLayout(), + repository.getSnapshots(), + repository.getReleases()); + + repository.setMirroredRepositories(Collections.singletonList(original)); + + repository.setId(mirror.getId()); + repository.setUrl(mirror.getUrl()); + + if (mirror.getLayout() != null && !mirror.getLayout().isEmpty()) { + repository.setLayout(original.getLayout()); + } + + repository.setBlocked(mirror.isBlocked()); + } + } + + private void injectProxy(ProxySelector selector, List repositories) { + if (repositories != null && selector != null) { + for (ArtifactRepository repository : repositories) { + repository.setProxy(getProxy(selector, repository)); + } + } + } + + private org.apache.maven.repository.Proxy getProxy(ProxySelector selector, ArtifactRepository repository) { + if (selector != null) { + RemoteRepository repo = RepositoryUtils.toRepo(repository); + org.eclipse.aether.repository.Proxy proxy = selector.getProxy(repo); + if (proxy != null) { + org.apache.maven.repository.Proxy p = new org.apache.maven.repository.Proxy(); + p.setHost(proxy.getHost()); + p.setProtocol(proxy.getType()); + p.setPort(proxy.getPort()); + if (proxy.getAuthentication() != null) { + repo = new RemoteRepository.Builder(repo).setProxy(proxy).build(); + AuthenticationContext authCtx = AuthenticationContext.forProxy(null, repo); + p.setUserName(authCtx.get(AuthenticationContext.USERNAME)); + p.setPassword(authCtx.get(AuthenticationContext.PASSWORD)); + p.setNtlmDomain(authCtx.get(AuthenticationContext.NTLM_DOMAIN)); + p.setNtlmHost(authCtx.get(AuthenticationContext.NTLM_WORKSTATION)); + authCtx.close(); + } + return p; + } + } + return null; + } + + public void injectAuthentication(AuthenticationSelector selector, List repositories) { + if (repositories != null && selector != null) { + for (ArtifactRepository repository : repositories) { + repository.setAuthentication(getAuthentication(selector, repository)); + } + } + } + + private Authentication getAuthentication(AuthenticationSelector selector, ArtifactRepository repository) { + if (selector != null) { + RemoteRepository repo = RepositoryUtils.toRepo(repository); + org.eclipse.aether.repository.Authentication auth = selector.getAuthentication(repo); + if (auth != null) { + repo = new RemoteRepository.Builder(repo) + .setAuthentication(auth) + .build(); + AuthenticationContext authCtx = AuthenticationContext.forRepository(null, repo); + Authentication result = new Authentication( + authCtx.get(AuthenticationContext.USERNAME), authCtx.get(AuthenticationContext.PASSWORD)); + result.setPrivateKey(authCtx.get(AuthenticationContext.PRIVATE_KEY_PATH)); + result.setPassphrase(authCtx.get(AuthenticationContext.PRIVATE_KEY_PASSPHRASE)); + authCtx.close(); + return result; + } + } + return null; + } } From 8cc9cc7c066390d3ad42fc84b7bea9ff0794d37c Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Fri, 10 Nov 2023 00:08:18 +0100 Subject: [PATCH 08/15] Integrate more --- .../java/org/apache/maven/DefaultMaven.java | 29 ++++++++------- .../apache/maven/execution/MavenSession.java | 37 +++++++++++++------ ...DefaultRepositorySystemSessionFactory.java | 8 +++- .../BootstrapCoreExtensionManager.java | 5 ++- 4 files changed, 50 insertions(+), 29 deletions(-) diff --git a/maven-core/src/main/java/org/apache/maven/DefaultMaven.java b/maven-core/src/main/java/org/apache/maven/DefaultMaven.java index 93d404f1a99c..c4089a21ef9b 100644 --- a/maven-core/src/main/java/org/apache/maven/DefaultMaven.java +++ b/maven-core/src/main/java/org/apache/maven/DefaultMaven.java @@ -73,8 +73,6 @@ import org.apache.maven.session.scope.internal.SessionScope; import org.codehaus.plexus.PlexusContainer; import org.codehaus.plexus.component.repository.exception.ComponentLookupException; -import org.eclipse.aether.DefaultRepositorySystemSession; -import org.eclipse.aether.RepositorySystemSession; import org.eclipse.aether.RepositorySystemSession.CloseableSession; import org.eclipse.aether.repository.WorkspaceReader; import org.slf4j.Logger; @@ -215,9 +213,8 @@ private MavenExecutionResult doExecute(MavenExecutionRequest request) { // so that @SessionScoped components can be @Injected into AbstractLifecycleParticipants. // sessionScope.enter(); - try (CloseableSession closeableSession = newRepositorySession(request).build()) { - DefaultRepositorySystemSession repoSession = new DefaultRepositorySystemSession(closeableSession); - MavenSession session = new MavenSession(container, repoSession, request, result); + try (CloseableSession closeableSession = newRepositorySession(request)) { + MavenSession session = new MavenSession(container, closeableSession, request, result); session.setSession(defaultSessionFactory.getSession(session)); sessionScope.seed(MavenSession.class, session); @@ -226,7 +223,7 @@ private MavenExecutionResult doExecute(MavenExecutionRequest request) { legacySupport.setSession(session); - return doExecute(request, session, result, repoSession); + return doExecute(request, session, result, closeableSession); } finally { sessionScope.exit(); } @@ -236,7 +233,7 @@ private MavenExecutionResult doExecute( MavenExecutionRequest request, MavenSession session, MavenExecutionResult result, - DefaultRepositorySystemSession repoSession) { + CloseableSession repoSession) { try { afterSessionStart(session); } catch (MavenExecutionException e) { @@ -245,7 +242,8 @@ private MavenExecutionResult doExecute( try { WorkspaceReader reactorReader = container.lookup(WorkspaceReader.class, ReactorReader.HINT); - repoSession.setWorkspaceReader(reactorReader); + repoSession = repoSession.copy().setWorkspaceReader(reactorReader).build(); + session.swapRepositorySystemSession(repoSession); } catch (ComponentLookupException e) { return addExceptionToResult(result, e); } @@ -266,11 +264,11 @@ private MavenExecutionResult doExecute( } try { - setupWorkspaceReader(session, repoSession); + repoSession = setupWorkspaceReader(session, repoSession); + session.swapRepositorySystemSession(repoSession); } catch (ComponentLookupException e) { return addExceptionToResult(result, e); } - repoSession.setReadOnly(); try { afterProjectsRead(session); } catch (MavenExecutionException e) { @@ -337,7 +335,7 @@ private MavenExecutionResult doExecute( return result; } - private void setupWorkspaceReader(MavenSession session, DefaultRepositorySystemSession repoSession) + private CloseableSession setupWorkspaceReader(MavenSession session, CloseableSession repoSession) throws ComponentLookupException { // Desired order of precedence for workspace readers before querying the local artifact repositories Set workspaceReaders = new LinkedHashSet<>(); @@ -351,7 +349,10 @@ private void setupWorkspaceReader(MavenSession session, DefaultRepositorySystemS } // 3) .. n) Project-scoped workspace readers workspaceReaders.addAll(getProjectScopedExtensionComponents(session.getProjects(), WorkspaceReader.class)); - repoSession.setWorkspaceReader(MavenChainedWorkspaceReader.of(workspaceReaders)); + return repoSession + .copy() + .setWorkspaceReader(MavenChainedWorkspaceReader.of(workspaceReaders)) + .build(); } private void afterSessionStart(MavenSession session) throws MavenExecutionException { @@ -405,8 +406,8 @@ private void persistResumptionData(MavenExecutionResult result, MavenSession ses } } - public RepositorySystemSession.SessionBuilder newRepositorySession(MavenExecutionRequest request) { - return repositorySessionFactory.newRepositorySession(request); + public CloseableSession newRepositorySession(MavenExecutionRequest request) { + return repositorySessionFactory.newRepositorySessionBuilder(request).build(); } private void validateLocalRepository(MavenExecutionRequest request) throws IOException { diff --git a/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java b/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java index 7776534542b7..72362e5874c9 100644 --- a/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java +++ b/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java @@ -27,6 +27,7 @@ import java.util.Properties; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; import org.apache.maven.api.Session; @@ -51,13 +52,13 @@ * */ public class MavenSession implements Cloneable { - private MavenExecutionRequest request; + private final MavenExecutionRequest request; - private MavenExecutionResult result; + private final MavenExecutionResult result; - private RepositorySystemSession repositorySession; + private final AtomicReference repositorySession; - private Properties executionProperties; + private final Properties executionProperties; private ThreadLocal currentProject = new ThreadLocal<>(); @@ -89,6 +90,13 @@ public class MavenSession implements Cloneable { private final ConcurrentMap>> pluginContextsByProjectAndPluginKey = new ConcurrentHashMap<>(); + /** + * For internal use only. + */ + public void swapRepositorySystemSession(RepositorySystemSession repositorySystemSession) { + this.repositorySession.set(repositorySystemSession); + } + public void setProjects(List projects) { if (!projects.isEmpty()) { MavenProject first = projects.get(0); @@ -257,7 +265,7 @@ public void setParallel(boolean parallel) { } public RepositorySystemSession getRepositorySession() { - return repositorySession; + return repositorySession.get(); } private Map projectMap; @@ -304,7 +312,11 @@ public MavenSession( this.request = request; this.result = result; this.settings = adaptSettings(request); - this.repositorySession = repositorySession; + this.repositorySession = new AtomicReference<>(repositorySession); + Properties executionProperties = new Properties(); + executionProperties.putAll(request.getSystemProperties()); + executionProperties.putAll(request.getUserProperties()); + this.executionProperties = executionProperties; } @Deprecated @@ -363,6 +375,8 @@ public MavenSession( this.request.setGoals(goals); this.request.setBaseDirectory((executionRootDir != null) ? new File(executionRootDir) : null); this.request.setStartTime(startTime); + this.result = null; + this.repositorySession = new AtomicReference<>(null); } @Deprecated @@ -375,7 +389,12 @@ public MavenSession( this.request = request; this.result = result; this.settings = adaptSettings(request); + Properties executionProperties = new Properties(); + executionProperties.putAll(request.getSystemProperties()); + executionProperties.putAll(request.getUserProperties()); + this.executionProperties = executionProperties; setProjects(projects); + this.repositorySession = new AtomicReference<>(null); } /** @@ -431,12 +450,6 @@ public boolean isUsingPOMsFromFilesystem() { */ @Deprecated public Properties getExecutionProperties() { - if (executionProperties == null) { - executionProperties = new Properties(); - executionProperties.putAll(request.getSystemProperties()); - executionProperties.putAll(request.getUserProperties()); - } - return executionProperties; } diff --git a/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java b/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java index e1a1f61d32af..81025b4b92b2 100644 --- a/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java +++ b/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java @@ -56,6 +56,7 @@ import org.eclipse.aether.ConfigurationProperties; import org.eclipse.aether.RepositoryListener; import org.eclipse.aether.RepositorySystem; +import org.eclipse.aether.RepositorySystemSession; import org.eclipse.aether.RepositorySystemSession.SessionBuilder; import org.eclipse.aether.repository.AuthenticationContext; import org.eclipse.aether.repository.AuthenticationSelector; @@ -174,8 +175,13 @@ public DefaultRepositorySystemSessionFactory( this.runtimeInformation = runtimeInformation; } + @Deprecated + public RepositorySystemSession newRepositorySession(MavenExecutionRequest request) { + return newRepositorySessionBuilder(request).build(); + } + @SuppressWarnings("checkstyle:methodLength") - public SessionBuilder newRepositorySession(MavenExecutionRequest request) { + public SessionBuilder newRepositorySessionBuilder(MavenExecutionRequest request) { SessionBuilder session = MavenRepositorySystemUtils.newSession(repoSystem.createSessionBuilder()); session.setCache(request.getRepositoryCache()); diff --git a/maven-embedder/src/main/java/org/apache/maven/cli/internal/BootstrapCoreExtensionManager.java b/maven-embedder/src/main/java/org/apache/maven/cli/internal/BootstrapCoreExtensionManager.java index 813d476428b2..c61351370350 100644 --- a/maven-embedder/src/main/java/org/apache/maven/cli/internal/BootstrapCoreExtensionManager.java +++ b/maven-embedder/src/main/java/org/apache/maven/cli/internal/BootstrapCoreExtensionManager.java @@ -92,8 +92,9 @@ public BootstrapCoreExtensionManager( public List loadCoreExtensions( MavenExecutionRequest request, Set providedArtifacts, List extensions) throws Exception { - try (CloseableSession repoSession = - repositorySystemSessionFactory.newRepositorySession(request).build()) { + try (CloseableSession repoSession = repositorySystemSessionFactory + .newRepositorySessionBuilder(request) + .build()) { List repositories = RepositoryUtils.toRepos(request.getPluginArtifactRepositories()); Interpolator interpolator = createInterpolator(request); From 8bf2f7a810c0b9f5627f7a02830c5fc83494d21a Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Fri, 10 Nov 2023 00:38:42 +0100 Subject: [PATCH 09/15] Remove unused --- .../aether/DefaultRepositorySystemSessionFactory.java | 4 ---- .../DefaultRepositorySystemSessionFactoryTest.java | 10 ---------- 2 files changed, 14 deletions(-) diff --git a/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java b/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java index 81025b4b92b2..97c4bba4bacb 100644 --- a/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java +++ b/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java @@ -152,8 +152,6 @@ public class DefaultRepositorySystemSessionFactory { private final EventSpyDispatcher eventSpyDispatcher; - private final MavenRepositorySystem mavenRepositorySystem; - private final RuntimeInformation runtimeInformation; @SuppressWarnings("checkstyle:ParameterNumber") @@ -164,14 +162,12 @@ public DefaultRepositorySystemSessionFactory( @Nullable @Named("ide") WorkspaceReader workspaceRepository, SettingsDecrypter settingsDecrypter, EventSpyDispatcher eventSpyDispatcher, - MavenRepositorySystem mavenRepositorySystem, RuntimeInformation runtimeInformation) { this.artifactHandlerManager = artifactHandlerManager; this.repoSystem = repoSystem; this.workspaceRepository = workspaceRepository; this.settingsDecrypter = settingsDecrypter; this.eventSpyDispatcher = eventSpyDispatcher; - this.mavenRepositorySystem = mavenRepositorySystem; this.runtimeInformation = runtimeInformation; } diff --git a/maven-core/src/test/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactoryTest.java b/maven-core/src/test/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactoryTest.java index f21c07ae6d56..748ccbb6e57e 100644 --- a/maven-core/src/test/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactoryTest.java +++ b/maven-core/src/test/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactoryTest.java @@ -54,7 +54,6 @@ */ @PlexusTest public class DefaultRepositorySystemSessionFactoryTest { - @Inject protected MavenRepositorySystem mavenRepositorySystem; @@ -81,7 +80,6 @@ void isNoSnapshotUpdatesTest() throws InvalidRepositoryException { null, settingsDecrypter, eventSpyDispatcher, - mavenRepositorySystem, information); MavenExecutionRequest request = new DefaultMavenExecutionRequest(); @@ -104,7 +102,6 @@ void isSnapshotUpdatesTest() throws InvalidRepositoryException { null, settingsDecrypter, eventSpyDispatcher, - mavenRepositorySystem, information); MavenExecutionRequest request = new DefaultMavenExecutionRequest(); @@ -139,7 +136,6 @@ void wagonProviderConfigurationTest() throws InvalidRepositoryException { null, settingsDecrypter, eventSpyDispatcher, - mavenRepositorySystem, information); PlexusConfiguration plexusConfiguration = (PlexusConfiguration) systemSessionFactory @@ -182,7 +178,6 @@ void httpConfigurationWithHttpHeadersTest() throws InvalidRepositoryException { null, settingsDecrypter, eventSpyDispatcher, - mavenRepositorySystem, information); Map headers = (Map) systemSessionFactory @@ -219,7 +214,6 @@ void connectTimeoutConfigurationTest() throws InvalidRepositoryException { null, settingsDecrypter, eventSpyDispatcher, - mavenRepositorySystem, information); int connectionTimeout = (Integer) systemSessionFactory @@ -260,7 +254,6 @@ void connectionTimeoutFromHttpConfigurationTest() throws InvalidRepositoryExcept null, settingsDecrypter, eventSpyDispatcher, - mavenRepositorySystem, information); int connectionTimeout = (Integer) systemSessionFactory @@ -295,7 +288,6 @@ void requestTimeoutConfigurationTest() throws InvalidRepositoryException { null, settingsDecrypter, eventSpyDispatcher, - mavenRepositorySystem, information); int requestTimeout = (Integer) systemSessionFactory @@ -336,7 +328,6 @@ void readTimeoutFromHttpConfigurationTest() throws InvalidRepositoryException { null, settingsDecrypter, eventSpyDispatcher, - mavenRepositorySystem, information); int requestTimeout = (Integer) systemSessionFactory @@ -354,7 +345,6 @@ void transportConfigurationTest() throws InvalidRepositoryException { null, settingsDecrypter, eventSpyDispatcher, - mavenRepositorySystem, information); MavenExecutionRequest request = new DefaultMavenExecutionRequest(); From e93bb7293792cd68569060b51074b95d6ccb795a Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Wed, 15 Nov 2023 11:11:22 +0100 Subject: [PATCH 10/15] Expose: * resolution policy * descriptor policy --- .../DefaultMavenExecutionRequest.java | 28 +++++++++++++++++++ .../execution/MavenExecutionRequest.java | 20 +++++++++++++ ...DefaultRepositorySystemSessionFactory.java | 4 +++ .../java/org/apache/maven/cli/CLIManager.java | 15 ++++++++++ .../java/org/apache/maven/cli/MavenCli.java | 13 ++++++++- 5 files changed, 79 insertions(+), 1 deletion(-) diff --git a/maven-core/src/main/java/org/apache/maven/execution/DefaultMavenExecutionRequest.java b/maven-core/src/main/java/org/apache/maven/execution/DefaultMavenExecutionRequest.java index d48fa180b159..7f2bb95362a2 100644 --- a/maven-core/src/main/java/org/apache/maven/execution/DefaultMavenExecutionRequest.java +++ b/maven-core/src/main/java/org/apache/maven/execution/DefaultMavenExecutionRequest.java @@ -66,6 +66,10 @@ public class DefaultMavenExecutionRequest implements MavenExecutionRequest { private boolean cacheNotFound = false; + private boolean ignoreMissingArtifactDescriptor = true; + + private boolean ignoreInvalidArtifactDescriptor = true; + private List proxies; private List servers; @@ -174,6 +178,8 @@ public static MavenExecutionRequest copy(MavenExecutionRequest original) { copy.setInteractiveMode(original.isInteractiveMode()); copy.setCacheNotFound(original.isCacheNotFound()); copy.setCacheTransferError(original.isCacheTransferError()); + copy.setIgnoreMissingArtifactDescriptor(original.isIgnoreMissingArtifactDescriptor()); + copy.setIgnoreInvalidArtifactDescriptor(original.isIgnoreInvalidArtifactDescriptor()); copy.setProxies(original.getProxies()); copy.setServers(original.getServers()); copy.setMirrors(original.getMirrors()); @@ -1034,6 +1040,28 @@ public MavenExecutionRequest setCacheNotFound(boolean cacheNotFound) { return this; } + @Override + public boolean isIgnoreMissingArtifactDescriptor() { + return ignoreMissingArtifactDescriptor; + } + + @Override + public MavenExecutionRequest setIgnoreMissingArtifactDescriptor(boolean ignoreMissing) { + this.ignoreMissingArtifactDescriptor = ignoreMissing; + return this; + } + + @Override + public boolean isIgnoreInvalidArtifactDescriptor() { + return ignoreInvalidArtifactDescriptor; + } + + @Override + public MavenExecutionRequest setIgnoreInvalidArtifactDescriptor(boolean ignoreInvalid) { + this.ignoreInvalidArtifactDescriptor = ignoreInvalid; + return this; + } + @Override public boolean isUseLegacyLocalRepository() { return this.useLegacyLocalRepositoryManager; diff --git a/maven-core/src/main/java/org/apache/maven/execution/MavenExecutionRequest.java b/maven-core/src/main/java/org/apache/maven/execution/MavenExecutionRequest.java index fedc394d8435..c5bcb6a7a7a3 100644 --- a/maven-core/src/main/java/org/apache/maven/execution/MavenExecutionRequest.java +++ b/maven-core/src/main/java/org/apache/maven/execution/MavenExecutionRequest.java @@ -285,6 +285,26 @@ public interface MavenExecutionRequest { MavenExecutionRequest setCacheNotFound(boolean cacheNotFound); + /** + * @since 4.0.0 + */ + boolean isIgnoreMissingArtifactDescriptor(); + + /** + * @since 4.0.0 + */ + MavenExecutionRequest setIgnoreMissingArtifactDescriptor(boolean ignoreMissing); + + /** + * @since 4.0.0 + */ + boolean isIgnoreInvalidArtifactDescriptor(); + + /** + * @since 4.0.0 + */ + MavenExecutionRequest setIgnoreInvalidArtifactDescriptor(boolean ignoreInvalid); + // Profiles List getProfiles(); diff --git a/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java b/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java index 97c4bba4bacb..cfc94a432604 100644 --- a/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java +++ b/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java @@ -71,6 +71,7 @@ import org.eclipse.aether.util.repository.DefaultAuthenticationSelector; import org.eclipse.aether.util.repository.DefaultMirrorSelector; import org.eclipse.aether.util.repository.DefaultProxySelector; +import org.eclipse.aether.util.repository.SimpleArtifactDescriptorPolicy; import org.eclipse.aether.util.repository.SimpleResolutionErrorPolicy; import org.eclipse.sisu.Nullable; import org.slf4j.Logger; @@ -219,6 +220,9 @@ public SessionBuilder newRepositorySessionBuilder(MavenExecutionRequest request) session.setResolutionErrorPolicy( new SimpleResolutionErrorPolicy(errorPolicy, errorPolicy | ResolutionErrorPolicy.CACHE_NOT_FOUND)); + session.setArtifactDescriptorPolicy(new SimpleArtifactDescriptorPolicy( + request.isIgnoreMissingArtifactDescriptor(), request.isIgnoreInvalidArtifactDescriptor())); + session.setArtifactTypeRegistry(RepositoryUtils.newArtifactTypeRegistry(artifactHandlerManager)); session.setWorkspaceReader( diff --git a/maven-embedder/src/main/java/org/apache/maven/cli/CLIManager.java b/maven-embedder/src/main/java/org/apache/maven/cli/CLIManager.java index 01c9b70f2af1..ed5cdd55e9db 100644 --- a/maven-embedder/src/main/java/org/apache/maven/cli/CLIManager.java +++ b/maven-embedder/src/main/java/org/apache/maven/cli/CLIManager.java @@ -117,6 +117,10 @@ public class CLIManager { public static final String COLOR = "color"; + public static final String CACHE_ARTIFACT_NOT_FOUND = "cache-artifact-not-found"; + + public static final String STRICT_ARTIFACT_DESCRIPTOR_POLICY = "strict-artifact-descriptor-policy"; + /** This option is deprecated and may be repurposed as Java debug in a future version. * Use {@code -X/--verbose} instead. */ @Deprecated @@ -308,6 +312,17 @@ public CLIManager() { .optionalArg(true) .desc("Defines the color mode of the output. Supported are 'auto', 'always', 'never'.") .build()); + options.addOption(Option.builder() + .longOpt(CACHE_ARTIFACT_NOT_FOUND) + .hasArg() + .desc( + "Defines caching behaviour for 'not found' artifacts. Supported values are 'true' (default), 'false'.") + .build()); + options.addOption(Option.builder() + .longOpt(STRICT_ARTIFACT_DESCRIPTOR_POLICY) + .hasArg() + .desc("Defines 'strict' artifact descriptor policy. Supported values are 'true', 'false' (default).") + .build()); // Adding this back to make Maven fail if used options.addOption(Option.builder("llr") diff --git a/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java b/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java index 2b7bc84a26ee..b5fdb17f9908 100644 --- a/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java +++ b/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java @@ -1291,8 +1291,19 @@ private MavenExecutionRequest populateRequest(CliRequest cliRequest, MavenExecut request.setResumeFrom(commandLine.getOptionValue(CLIManager.RESUME_FROM)); enableOnPresentOption(commandLine, CLIManager.RESUME, request::setResume); request.setMakeBehavior(determineMakeBehavior(commandLine)); - request.setCacheNotFound(true); + boolean cacheNotFound = !commandLine.hasOption(CLIManager.CACHE_ARTIFACT_NOT_FOUND) + || Boolean.parseBoolean(commandLine.getOptionValue(CLIManager.CACHE_ARTIFACT_NOT_FOUND)); + request.setCacheNotFound(cacheNotFound); request.setCacheTransferError(false); + boolean strictArtifactDescriptorPolicy = commandLine.hasOption(CLIManager.STRICT_ARTIFACT_DESCRIPTOR_POLICY) + && Boolean.parseBoolean(commandLine.getOptionValue(CLIManager.STRICT_ARTIFACT_DESCRIPTOR_POLICY)); + if (strictArtifactDescriptorPolicy) { + request.setIgnoreMissingArtifactDescriptor(false); + request.setIgnoreInvalidArtifactDescriptor(false); + } else { + request.setIgnoreMissingArtifactDescriptor(true); + request.setIgnoreInvalidArtifactDescriptor(true); + } performProjectActivation(commandLine, request.getProjectActivation()); performProfileActivation(commandLine, request.getProfileActivation()); From d912a65eb5131d79058e96cbf7fabb5ecfd99993 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Sat, 18 Nov 2023 21:46:28 +0100 Subject: [PATCH 11/15] Move to fresh alpha-2 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0125d1508857..411f3ad63ff3 100644 --- a/pom.xml +++ b/pom.xml @@ -161,7 +161,7 @@ under the License. 2.0 2.0 1.3 - 2.0.0-SNAPSHOT + 2.0.0-alpha-2 0.9.0.M2 9.6 1.7.36 From 1f706e7dfb15eaf0bfbbbdce9a32cb8db5677438 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Sat, 18 Nov 2023 21:53:17 +0100 Subject: [PATCH 12/15] Add short forms to options as well --- .../main/java/org/apache/maven/cli/CLIManager.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/maven-embedder/src/main/java/org/apache/maven/cli/CLIManager.java b/maven-embedder/src/main/java/org/apache/maven/cli/CLIManager.java index ed5cdd55e9db..3b04b1922b09 100644 --- a/maven-embedder/src/main/java/org/apache/maven/cli/CLIManager.java +++ b/maven-embedder/src/main/java/org/apache/maven/cli/CLIManager.java @@ -117,9 +117,9 @@ public class CLIManager { public static final String COLOR = "color"; - public static final String CACHE_ARTIFACT_NOT_FOUND = "cache-artifact-not-found"; + public static final String CACHE_ARTIFACT_NOT_FOUND = "canf"; - public static final String STRICT_ARTIFACT_DESCRIPTOR_POLICY = "strict-artifact-descriptor-policy"; + public static final String STRICT_ARTIFACT_DESCRIPTOR_POLICY = "sadp"; /** This option is deprecated and may be repurposed as Java debug in a future version. * Use {@code -X/--verbose} instead. */ @@ -312,14 +312,14 @@ public CLIManager() { .optionalArg(true) .desc("Defines the color mode of the output. Supported are 'auto', 'always', 'never'.") .build()); - options.addOption(Option.builder() - .longOpt(CACHE_ARTIFACT_NOT_FOUND) + options.addOption(Option.builder(CACHE_ARTIFACT_NOT_FOUND) + .longOpt("cache-artifact-not-found") .hasArg() .desc( "Defines caching behaviour for 'not found' artifacts. Supported values are 'true' (default), 'false'.") .build()); - options.addOption(Option.builder() - .longOpt(STRICT_ARTIFACT_DESCRIPTOR_POLICY) + options.addOption(Option.builder(STRICT_ARTIFACT_DESCRIPTOR_POLICY) + .longOpt("strict-artifact-descriptor-policy") .hasArg() .desc("Defines 'strict' artifact descriptor policy. Supported values are 'true', 'false' (default).") .build()); From d068a1fe5ebde3b6873147d5e62893b5ede3b196 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Sat, 18 Nov 2023 22:09:51 +0100 Subject: [PATCH 13/15] Leave public method alone, introduce new one --- .../main/java/org/apache/maven/DefaultMaven.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/maven-core/src/main/java/org/apache/maven/DefaultMaven.java b/maven-core/src/main/java/org/apache/maven/DefaultMaven.java index c4089a21ef9b..89e74ecc32b0 100644 --- a/maven-core/src/main/java/org/apache/maven/DefaultMaven.java +++ b/maven-core/src/main/java/org/apache/maven/DefaultMaven.java @@ -73,6 +73,7 @@ import org.apache.maven.session.scope.internal.SessionScope; import org.codehaus.plexus.PlexusContainer; import org.codehaus.plexus.component.repository.exception.ComponentLookupException; +import org.eclipse.aether.RepositorySystemSession; import org.eclipse.aether.RepositorySystemSession.CloseableSession; import org.eclipse.aether.repository.WorkspaceReader; import org.slf4j.Logger; @@ -213,7 +214,7 @@ private MavenExecutionResult doExecute(MavenExecutionRequest request) { // so that @SessionScoped components can be @Injected into AbstractLifecycleParticipants. // sessionScope.enter(); - try (CloseableSession closeableSession = newRepositorySession(request)) { + try (CloseableSession closeableSession = newCloseableSession(request)) { MavenSession session = new MavenSession(container, closeableSession, request, result); session.setSession(defaultSessionFactory.getSession(session)); @@ -406,7 +407,17 @@ private void persistResumptionData(MavenExecutionResult result, MavenSession ses } } - public CloseableSession newRepositorySession(MavenExecutionRequest request) { + /** + * Nobody should ever use this method. + * + * @deprecated If you use this method and your code is not in Maven Core, stop doing this. + */ + @Deprecated + public RepositorySystemSession newRepositorySession( MavenExecutionRequest request) { + return newCloseableSession(request); + } + + private CloseableSession newCloseableSession(MavenExecutionRequest request) { return repositorySessionFactory.newRepositorySessionBuilder(request).build(); } From e642707d079e5ccf94ac6b3dd144acc342a16e05 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Sat, 18 Nov 2023 22:32:08 +0100 Subject: [PATCH 14/15] Do NOT introduce new public method on MavenSession Sort it out instead internally. --- .../java/org/apache/maven/DefaultMaven.java | 20 ++++++---- .../apache/maven/execution/MavenSession.java | 38 ++++++++++++------- .../maven/internal/impl/DefaultSession.java | 4 +- .../apache/maven/internal/impl/TestApi.java | 4 +- 4 files changed, 41 insertions(+), 25 deletions(-) diff --git a/maven-core/src/main/java/org/apache/maven/DefaultMaven.java b/maven-core/src/main/java/org/apache/maven/DefaultMaven.java index 89e74ecc32b0..19475a8af85f 100644 --- a/maven-core/src/main/java/org/apache/maven/DefaultMaven.java +++ b/maven-core/src/main/java/org/apache/maven/DefaultMaven.java @@ -36,6 +36,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.atomic.AtomicReference; import java.util.function.Function; import java.util.stream.Stream; @@ -215,7 +216,8 @@ private MavenExecutionResult doExecute(MavenExecutionRequest request) { // sessionScope.enter(); try (CloseableSession closeableSession = newCloseableSession(request)) { - MavenSession session = new MavenSession(container, closeableSession, request, result); + AtomicReference closeableSessionRef = new AtomicReference<>(closeableSession); + MavenSession session = new MavenSession(closeableSessionRef::get, request, result); session.setSession(defaultSessionFactory.getSession(session)); sessionScope.seed(MavenSession.class, session); @@ -224,7 +226,7 @@ private MavenExecutionResult doExecute(MavenExecutionRequest request) { legacySupport.setSession(session); - return doExecute(request, session, result, closeableSession); + return doExecute(request, session, result, closeableSessionRef); } finally { sessionScope.exit(); } @@ -234,7 +236,7 @@ private MavenExecutionResult doExecute( MavenExecutionRequest request, MavenSession session, MavenExecutionResult result, - CloseableSession repoSession) { + AtomicReference closeableSessionRef) { try { afterSessionStart(session); } catch (MavenExecutionException e) { @@ -243,8 +245,11 @@ private MavenExecutionResult doExecute( try { WorkspaceReader reactorReader = container.lookup(WorkspaceReader.class, ReactorReader.HINT); - repoSession = repoSession.copy().setWorkspaceReader(reactorReader).build(); - session.swapRepositorySystemSession(repoSession); + closeableSessionRef.set(closeableSessionRef + .get() + .copy() + .setWorkspaceReader(reactorReader) + .build()); } catch (ComponentLookupException e) { return addExceptionToResult(result, e); } @@ -265,8 +270,7 @@ private MavenExecutionResult doExecute( } try { - repoSession = setupWorkspaceReader(session, repoSession); - session.swapRepositorySystemSession(repoSession); + closeableSessionRef.set(setupWorkspaceReader(session, closeableSessionRef.get())); } catch (ComponentLookupException e) { return addExceptionToResult(result, e); } @@ -413,7 +417,7 @@ private void persistResumptionData(MavenExecutionResult result, MavenSession ses * @deprecated If you use this method and your code is not in Maven Core, stop doing this. */ @Deprecated - public RepositorySystemSession newRepositorySession( MavenExecutionRequest request) { + public RepositorySystemSession newRepositorySession(MavenExecutionRequest request) { return newCloseableSession(request); } diff --git a/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java b/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java index 72362e5874c9..6e1818b7fad0 100644 --- a/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java +++ b/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java @@ -27,7 +27,7 @@ import java.util.Properties; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; -import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Supplier; import java.util.stream.Collectors; import org.apache.maven.api.Session; @@ -47,6 +47,8 @@ import org.codehaus.plexus.component.repository.exception.ComponentLookupException; import org.eclipse.aether.RepositorySystemSession; +import static java.util.Objects.requireNonNull; + /** * A Maven execution session. * @@ -56,7 +58,7 @@ public class MavenSession implements Cloneable { private final MavenExecutionResult result; - private final AtomicReference repositorySession; + private final Supplier repositorySystemSessionSupplier; private final Properties executionProperties; @@ -90,13 +92,6 @@ public class MavenSession implements Cloneable { private final ConcurrentMap>> pluginContextsByProjectAndPluginKey = new ConcurrentHashMap<>(); - /** - * For internal use only. - */ - public void swapRepositorySystemSession(RepositorySystemSession repositorySystemSession) { - this.repositorySession.set(repositorySystemSession); - } - public void setProjects(List projects) { if (!projects.isEmpty()) { MavenProject first = projects.get(0); @@ -265,7 +260,7 @@ public void setParallel(boolean parallel) { } public RepositorySystemSession getRepositorySession() { - return repositorySession.get(); + return repositorySystemSessionSupplier.get(); } private Map projectMap; @@ -290,7 +285,7 @@ public void setAllProjects(List allProjects) { // Deprecated // - private PlexusContainer container; + private final PlexusContainer container; private final Settings settings; @@ -302,6 +297,21 @@ public Map getProjectMap() { return projectMap; } + public MavenSession( + Supplier repositorySystemSessionSupplier, + MavenExecutionRequest request, + MavenExecutionResult result) { + this.container = null; + this.request = requireNonNull(request); + this.result = requireNonNull(result); + this.settings = adaptSettings(request); + this.repositorySystemSessionSupplier = requireNonNull(repositorySystemSessionSupplier); + Properties executionProperties = new Properties(); + executionProperties.putAll(request.getSystemProperties()); + executionProperties.putAll(request.getUserProperties()); + this.executionProperties = executionProperties; + } + @Deprecated public MavenSession( PlexusContainer container, @@ -312,7 +322,7 @@ public MavenSession( this.request = request; this.result = result; this.settings = adaptSettings(request); - this.repositorySession = new AtomicReference<>(repositorySession); + this.repositorySystemSessionSupplier = () -> repositorySession; Properties executionProperties = new Properties(); executionProperties.putAll(request.getSystemProperties()); executionProperties.putAll(request.getUserProperties()); @@ -376,7 +386,7 @@ public MavenSession( this.request.setBaseDirectory((executionRootDir != null) ? new File(executionRootDir) : null); this.request.setStartTime(startTime); this.result = null; - this.repositorySession = new AtomicReference<>(null); + this.repositorySystemSessionSupplier = () -> null; } @Deprecated @@ -394,7 +404,7 @@ public MavenSession( executionProperties.putAll(request.getUserProperties()); this.executionProperties = executionProperties; setProjects(projects); - this.repositorySession = new AtomicReference<>(null); + this.repositorySystemSessionSupplier = () -> null; } /** diff --git a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultSession.java b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultSession.java index a79aab62869a..942565c9e07c 100644 --- a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultSession.java +++ b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultSession.java @@ -213,8 +213,8 @@ public Session withLocalRepository(@Nonnull LocalRepository localRepository) { RepositorySystemSession repoSession = new DefaultRepositorySystemSession(session).setLocalRepositoryManager(localRepositoryManager); - MavenSession newSession = new MavenSession( - mavenSession.getContainer(), repoSession, mavenSession.getRequest(), mavenSession.getResult()); + MavenSession newSession = + new MavenSession(() -> repoSession, mavenSession.getRequest(), mavenSession.getResult()); return new DefaultSession( newSession, repositorySystem, repositories, mavenRepositorySystem, container, runtimeInformation); } diff --git a/maven-core/src/test/java/org/apache/maven/internal/impl/TestApi.java b/maven-core/src/test/java/org/apache/maven/internal/impl/TestApi.java index 7117ae588e6e..9f17cd5f615b 100644 --- a/maven-core/src/test/java/org/apache/maven/internal/impl/TestApi.java +++ b/maven-core/src/test/java/org/apache/maven/internal/impl/TestApi.java @@ -35,6 +35,7 @@ import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager; import org.apache.maven.bridge.MavenRepositorySystem; import org.apache.maven.execution.DefaultMavenExecutionRequest; +import org.apache.maven.execution.DefaultMavenExecutionResult; import org.apache.maven.execution.MavenSession; import org.apache.maven.execution.scope.internal.MojoExecutionScope; import org.apache.maven.repository.internal.MavenRepositorySystemUtils; @@ -96,7 +97,8 @@ class TestApi { void setup() { RepositorySystemSession rss = MavenRepositorySystemUtils.newSession(); DefaultMavenExecutionRequest mer = new DefaultMavenExecutionRequest(); - MavenSession ms = new MavenSession(null, rss, mer, null); + DefaultMavenExecutionResult meres = new DefaultMavenExecutionResult(); + MavenSession ms = new MavenSession(() -> rss, mer, meres); DefaultSession session = new DefaultSession( ms, repositorySystem, From f952d2caa23c946749641abae75de2b5fa8a34e2 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Mon, 20 Nov 2023 17:31:49 +0100 Subject: [PATCH 15/15] Workaround for alpha-2 problem --- .../aether/DefaultRepositorySystemSessionFactory.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java b/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java index cfc94a432604..e17ab7c54b34 100644 --- a/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java +++ b/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java @@ -203,6 +203,14 @@ public SessionBuilder newRepositorySessionBuilder(MavenExecutionRequest request) configProps.get(MAVEN_REPO_LOCAL_TAIL_IGNORE_AVAILABILITY)); } + // HACK: Resolver 2.0.0-alpha-2 carries a bad change: + // https://github.com/apache/maven-resolver/commit/178cfba9f3889f7e942a6a0d74716355b01a78f5 + // that is fixed in later versions by MRESOLVER-437 https://github.com/apache/maven-resolver/pull/373 + // TODO: remove this hack below once Resolver PR above is applied + if (!configProps.containsKey(ConfigurationProperties.HTTP_EXPECT_CONTINUE)) { + configProps.put(ConfigurationProperties.HTTP_EXPECT_CONTINUE, Boolean.FALSE.toString()); + } + session.setOffline(request.isOffline()); session.setChecksumPolicy(request.getGlobalChecksumPolicy()); session.setUpdatePolicy(