From 002f7ad8b721b20eb07e35978cf54736ece15f09 Mon Sep 17 00:00:00 2001 From: Guillaume Nodet Date: Mon, 22 Jun 2026 16:07:27 +0200 Subject: [PATCH 1/3] Switch default resolver transport from JDK/methanol to Apache HttpClient The JDK HTTP transport (backed by methanol) has proven flaky on Windows CI due to race conditions in the gzip/inflater code path. Switch the default transport to Apache HttpClient for better stability while keeping JDK transport available via -Dmaven.resolver.transport=jdk. Co-Authored-By: Claude Opus 4.6 --- apache-maven/pom.xml | 4 ++-- impl/maven-cli/pom.xml | 2 +- .../invoker/mvnup/goals/AbstractUpgradeStrategy.java | 8 ++++---- .../DefaultRepositorySystemSessionFactory.java | 4 +++- .../DefaultRepositorySystemSessionFactoryTest.java | 12 +++++++++++- .../it/MavenITmng7470ResolverTransportTest.java | 2 +- 6 files changed, 22 insertions(+), 10 deletions(-) diff --git a/apache-maven/pom.xml b/apache-maven/pom.xml index a5e89721d4fd..d4aa6cb4d158 100644 --- a/apache-maven/pom.xml +++ b/apache-maven/pom.xml @@ -91,12 +91,12 @@ under the License. org.apache.maven.resolver maven-resolver-transport-wagon - + org.apache.maven.resolver maven-resolver-transport-apache - + org.apache.maven.resolver maven-resolver-transport-jdk diff --git a/impl/maven-cli/pom.xml b/impl/maven-cli/pom.xml index a369ffd66322..39b6fcaa5e16 100644 --- a/impl/maven-cli/pom.xml +++ b/impl/maven-cli/pom.xml @@ -142,7 +142,7 @@ under the License. org.apache.maven.resolver - maven-resolver-transport-jdk + maven-resolver-transport-apache diff --git a/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/mvnup/goals/AbstractUpgradeStrategy.java b/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/mvnup/goals/AbstractUpgradeStrategy.java index 3828e3f03ae6..708fb359885c 100644 --- a/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/mvnup/goals/AbstractUpgradeStrategy.java +++ b/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/mvnup/goals/AbstractUpgradeStrategy.java @@ -51,8 +51,8 @@ import org.eclipse.aether.spi.connector.transport.TransporterFactory; import org.eclipse.aether.spi.connector.transport.http.ChecksumExtractor; import org.eclipse.aether.spi.io.PathProcessor; +import org.eclipse.aether.transport.apache.ApacheTransporterFactory; import org.eclipse.aether.transport.file.FileTransporterFactory; -import org.eclipse.aether.transport.jdk.JdkTransporterFactory; import static eu.maveniverse.domtrip.maven.MavenPomElements.Elements.PARENT; @@ -309,10 +309,10 @@ protected org.apache.maven.api.model.Model buildEffectiveModel(Path pomPath) { static class TransporterFactoryConfig { @Provides - @Named(JdkTransporterFactory.NAME) - static TransporterFactory jdkTransporterFactory( + @Named(ApacheTransporterFactory.NAME) + static TransporterFactory apacheTransporterFactory( ChecksumExtractor checksumExtractor, PathProcessor pathProcessor) { - return new JdkTransporterFactory(checksumExtractor, pathProcessor); + return new ApacheTransporterFactory(checksumExtractor, pathProcessor); } @Provides diff --git a/impl/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java b/impl/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java index b25171dcec6b..6e62cbe1ac77 100644 --- a/impl/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java +++ b/impl/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java @@ -312,7 +312,9 @@ public SessionBuilder newRepositorySessionBuilder(MavenExecutionRequest request) Object transport = mergedProps.getOrDefault(Constants.MAVEN_RESOLVER_TRANSPORT, MAVEN_RESOLVER_TRANSPORT_DEFAULT); if (MAVEN_RESOLVER_TRANSPORT_DEFAULT.equals(transport)) { - // The "default" mode (user did not set anything) from now on defaults to AUTO + // Default transport is Apache HTTP client; JDK transport available via -Dmaven.resolver.transport=jdk + configProps.put(FILE_TRANSPORTER_PRIORITY_KEY, RESOLVER_MAX_PRIORITY); + configProps.put(APACHE_HTTP_TRANSPORTER_PRIORITY_KEY, RESOLVER_MAX_PRIORITY); } else if (MAVEN_RESOLVER_TRANSPORT_JDK.equals(transport)) { // Make sure (whatever extra priority is set) that resolver file/jdk is selected configProps.put(FILE_TRANSPORTER_PRIORITY_KEY, RESOLVER_MAX_PRIORITY); diff --git a/impl/maven-core/src/test/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactoryTest.java b/impl/maven-core/src/test/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactoryTest.java index 111fb3548b56..a6b51dc9d017 100644 --- a/impl/maven-core/src/test/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactoryTest.java +++ b/impl/maven-core/src/test/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactoryTest.java @@ -364,8 +364,18 @@ void transportConfigurationTest() throws InvalidRepositoryException { MavenExecutionRequest request = new DefaultMavenExecutionRequest(); request.setLocalRepository(getLocalRepository()); - // native + // default (no property set) should select Apache Properties properties = new Properties(); + request.setSystemProperties(properties); + Map defaultConfigProperties = + systemSessionFactory.newRepositorySession(request).getConfigProperties(); + assertEquals( + String.valueOf(Float.MAX_VALUE), defaultConfigProperties.get("aether.priority.FileTransporterFactory")); + assertEquals( + String.valueOf(Float.MAX_VALUE), + defaultConfigProperties.get("aether.priority.ApacheTransporterFactory")); + + // explicit apache properties.setProperty("maven.resolver.transport", "apache"); request.setSystemProperties(properties); Map configProperties = diff --git a/its/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng7470ResolverTransportTest.java b/its/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng7470ResolverTransportTest.java index aebdffe5a795..3c26ae06a187 100644 --- a/its/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng7470ResolverTransportTest.java +++ b/its/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng7470ResolverTransportTest.java @@ -98,7 +98,7 @@ private void performTest(/* nullable */ final String transport, final String log @Test public void testResolverTransportDefault() throws Exception { - performTest(null, JDK_LOG_SNIPPET); + performTest(null, APACHE_LOG_SNIPPET); } @Test From 7ff431362b24f90eb0b9999ef203edb857d59b2f Mon Sep 17 00:00:00 2001 From: Guillaume Nodet Date: Mon, 22 Jun 2026 16:44:18 +0200 Subject: [PATCH 2/3] Remove JDK/methanol transport from the distribution bundle Per review feedback: remove maven-resolver-transport-jdk from apache-maven/pom.xml entirely so it is no longer shipped. Also remove the testResolverTransportJdk integration test since the JAR is no longer bundled. Co-Authored-By: Claude Opus 4.6 --- apache-maven/pom.xml | 5 ----- .../maven/it/MavenITmng7470ResolverTransportTest.java | 7 ------- 2 files changed, 12 deletions(-) diff --git a/apache-maven/pom.xml b/apache-maven/pom.xml index d4aa6cb4d158..9d32fb3cd786 100644 --- a/apache-maven/pom.xml +++ b/apache-maven/pom.xml @@ -96,11 +96,6 @@ under the License. org.apache.maven.resolver maven-resolver-transport-apache - - - org.apache.maven.resolver - maven-resolver-transport-jdk - org.apache.maven maven-logging diff --git a/its/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng7470ResolverTransportTest.java b/its/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng7470ResolverTransportTest.java index 3c26ae06a187..2a27d9561f64 100644 --- a/its/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng7470ResolverTransportTest.java +++ b/its/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng7470ResolverTransportTest.java @@ -94,8 +94,6 @@ private void performTest(/* nullable */ final String transport, final String log private static final String APACHE_LOG_SNIPPET = "[DEBUG] Using transporter ApacheTransporter"; - private static final String JDK_LOG_SNIPPET = "[DEBUG] Using transporter JdkTransporter"; - @Test public void testResolverTransportDefault() throws Exception { performTest(null, APACHE_LOG_SNIPPET); @@ -110,9 +108,4 @@ public void testResolverTransportWagon() throws Exception { public void testResolverTransportApache() throws Exception { performTest("apache", APACHE_LOG_SNIPPET); } - - @Test - public void testResolverTransportJdk() throws Exception { - performTest("jdk", JDK_LOG_SNIPPET); - } } From a772d360a1475f783d33f97a577070e277e79913 Mon Sep 17 00:00:00 2001 From: Guillaume Nodet Date: Mon, 22 Jun 2026 17:40:07 +0200 Subject: [PATCH 3/3] =?UTF-8?q?Revert=20unnecessary=20priority=20overrides?= =?UTF-8?q?=20=E2=80=94=20auto=20selection=20suffices?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Since JDK transport is no longer bundled, the auto selection naturally picks Apache as the highest-priority remaining transport. No need to explicitly force priorities in the default case. Co-Authored-By: Claude Opus 4.6 --- .../DefaultRepositorySystemSessionFactory.java | 4 +--- .../DefaultRepositorySystemSessionFactoryTest.java | 12 +----------- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/impl/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java b/impl/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java index 6e62cbe1ac77..b25171dcec6b 100644 --- a/impl/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java +++ b/impl/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java @@ -312,9 +312,7 @@ public SessionBuilder newRepositorySessionBuilder(MavenExecutionRequest request) Object transport = mergedProps.getOrDefault(Constants.MAVEN_RESOLVER_TRANSPORT, MAVEN_RESOLVER_TRANSPORT_DEFAULT); if (MAVEN_RESOLVER_TRANSPORT_DEFAULT.equals(transport)) { - // Default transport is Apache HTTP client; JDK transport available via -Dmaven.resolver.transport=jdk - configProps.put(FILE_TRANSPORTER_PRIORITY_KEY, RESOLVER_MAX_PRIORITY); - configProps.put(APACHE_HTTP_TRANSPORTER_PRIORITY_KEY, RESOLVER_MAX_PRIORITY); + // 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(FILE_TRANSPORTER_PRIORITY_KEY, RESOLVER_MAX_PRIORITY); diff --git a/impl/maven-core/src/test/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactoryTest.java b/impl/maven-core/src/test/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactoryTest.java index a6b51dc9d017..111fb3548b56 100644 --- a/impl/maven-core/src/test/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactoryTest.java +++ b/impl/maven-core/src/test/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactoryTest.java @@ -364,18 +364,8 @@ void transportConfigurationTest() throws InvalidRepositoryException { MavenExecutionRequest request = new DefaultMavenExecutionRequest(); request.setLocalRepository(getLocalRepository()); - // default (no property set) should select Apache + // native Properties properties = new Properties(); - request.setSystemProperties(properties); - Map defaultConfigProperties = - systemSessionFactory.newRepositorySession(request).getConfigProperties(); - assertEquals( - String.valueOf(Float.MAX_VALUE), defaultConfigProperties.get("aether.priority.FileTransporterFactory")); - assertEquals( - String.valueOf(Float.MAX_VALUE), - defaultConfigProperties.get("aether.priority.ApacheTransporterFactory")); - - // explicit apache properties.setProperty("maven.resolver.transport", "apache"); request.setSystemProperties(properties); Map configProperties =