This is an automated email from the ASF dual-hosted git repository.

cstamas pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-wrapper.git


The following commit(s) were added to refs/heads/master by this push:
     new 8132e06  Proposal to fix support for mirrors (#399)
8132e06 is described below

commit 8132e06decfdd42c625ceed84fbe5b7d3c6abe20
Author: Tamas Cservenak <[email protected]>
AuthorDate: Wed Feb 4 21:40:19 2026 +0100

    Proposal to fix support for mirrors (#399)
    
    This change relies on reusing existing API that can return proper URL (as 
set by user by ANY means in Maven config) to resolve from. PR contains also 
some cleanup.
    
    Fixes #396
    Supersedes #397
---
 maven-wrapper-plugin/pom.xml                       | 16 +++++
 .../apache/maven/plugins/wrapper/WrapperMojo.java  | 77 +++++++++++-----------
 .../maven/plugins/wrapper/WrapperMojoTest.java     | 58 +++++++++-------
 3 files changed, 88 insertions(+), 63 deletions(-)

diff --git a/maven-wrapper-plugin/pom.xml b/maven-wrapper-plugin/pom.xml
index cb25fe7..790cb5c 100644
--- a/maven-wrapper-plugin/pom.xml
+++ b/maven-wrapper-plugin/pom.xml
@@ -37,6 +37,10 @@ under the License.
     <maven>3.6.3</maven>
   </prerequisites>
 
+  <properties>
+    <version.mockito>4.11.0</version.mockito>
+  </properties>
+
   <dependencies>
     <dependency>
       <groupId>org.apache.maven</groupId>
@@ -109,6 +113,18 @@ under the License.
       <artifactId>junit-jupiter-api</artifactId>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-core</artifactId>
+      <version>${version.mockito}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-junit-jupiter</artifactId>
+      <version>${version.mockito}</version>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 
   <build>
diff --git 
a/maven-wrapper-plugin/src/main/java/org/apache/maven/plugins/wrapper/WrapperMojo.java
 
b/maven-wrapper-plugin/src/main/java/org/apache/maven/plugins/wrapper/WrapperMojo.java
index 6146ff8..b38a0e4 100644
--- 
a/maven-wrapper-plugin/src/main/java/org/apache/maven/plugins/wrapper/WrapperMojo.java
+++ 
b/maven-wrapper-plugin/src/main/java/org/apache/maven/plugins/wrapper/WrapperMojo.java
@@ -28,6 +28,7 @@ import java.nio.file.DirectoryStream;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.util.Collections;
 import java.util.Map;
 import java.util.Properties;
 
@@ -37,13 +38,13 @@ import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.plugins.annotations.Parameter;
-import org.apache.maven.settings.Mirror;
-import org.apache.maven.settings.Settings;
 import org.codehaus.plexus.archiver.UnArchiver;
 import org.codehaus.plexus.components.io.fileselectors.FileSelector;
 import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.RepositorySystemSession;
 import org.eclipse.aether.artifact.Artifact;
 import org.eclipse.aether.artifact.DefaultArtifact;
+import org.eclipse.aether.repository.RemoteRepository;
 import org.eclipse.aether.resolution.ArtifactRequest;
 import org.eclipse.aether.resolution.ArtifactResolutionException;
 import org.eclipse.aether.resolution.ArtifactResult;
@@ -59,7 +60,10 @@ import static 
org.apache.maven.shared.utils.logging.MessageUtils.buffer;
 public class WrapperMojo extends AbstractMojo {
     private static final String MVNW_REPOURL = "MVNW_REPOURL";
 
-    protected static final String DEFAULT_REPOURL = 
"https://repo.maven.apache.org/maven2";;
+    // Repo ID is constant: maven distro always come from maven central
+    protected static final String DEFAULT_REPO_ID = "central";
+    // Repo URL may be altered (by env var or by user mirror settings)
+    protected static final String DEFAULT_REPO_URL = 
"https://repo.maven.apache.org/maven2";;
 
     // CONFIGURATION PARAMETERS
 
@@ -161,11 +165,6 @@ public class WrapperMojo extends AbstractMojo {
     @Parameter(property = "distributionUrl")
     private String distributionUrl;
 
-    // READONLY PARAMETERS
-
-    @Inject
-    private MavenSession session;
-
     // CONSTANTS
 
     private static final String WRAPPER_DISTRIBUTION_GROUP_ID = 
"org.apache.maven.wrapper";
@@ -186,6 +185,12 @@ public class WrapperMojo extends AbstractMojo {
 
     // COMPONENTS
 
+    @Parameter(readonly = true, defaultValue = "${repositorySystemSession}")
+    private RepositorySystemSession repositorySystemSession;
+
+    @Inject
+    private MavenSession session;
+
     @Inject
     private RepositorySystem repositorySystem;
 
@@ -201,7 +206,7 @@ public class WrapperMojo extends AbstractMojo {
             distributionType = determineDistributionType(wrapperDir);
         }
 
-        if (mvndVersion != null && mvndVersion.length() > 0 && 
!TYPE_ONLY_SCRIPT.equals(distributionType)) {
+        if (mvndVersion != null && !mvndVersion.isEmpty() && 
!TYPE_ONLY_SCRIPT.equals(distributionType)) {
             throw new MojoExecutionException("maven-wrapper with type=" + 
distributionType
                     + " cannot work with mvnd, please set type to '" + 
TYPE_ONLY_SCRIPT + "'.");
         }
@@ -307,7 +312,7 @@ public class WrapperMojo extends AbstractMojo {
         if (distributionUrl != null && !distributionUrl.trim().isEmpty()) {
             // Use custom distribution URL if provided
             finalDistributionUrl = distributionUrl.trim();
-        } else if (mvndVersion != null && mvndVersion.length() > 0) {
+        } else if (mvndVersion != null && !mvndVersion.isEmpty()) {
             // Use Maven Daemon distribution URL
             finalDistributionUrl = 
"https://archive.apache.org/dist/maven/mvnd/"; + mvndVersion + "/maven-mvnd-"
                     + mvndVersion + "-bin.zip";
@@ -326,23 +331,29 @@ public class WrapperMojo extends AbstractMojo {
                 + buffer().strong("Maven " + mavenVersion) + " and download 
from " + repoUrl);
 
         try (BufferedWriter out = 
Files.newBufferedWriter(wrapperPropertiesFile, StandardCharsets.UTF_8)) {
-            out.append("wrapperVersion=" + wrapperVersion + 
System.lineSeparator());
-            out.append(DISTRIBUTION_TYPE_PROPERTY_NAME + "=" + 
distributionType + System.lineSeparator());
-            out.append("distributionUrl=" + finalDistributionUrl + 
System.lineSeparator());
+            
out.append("wrapperVersion=").append(wrapperVersion).append(System.lineSeparator());
+            out.append(DISTRIBUTION_TYPE_PROPERTY_NAME + "=")
+                    .append(distributionType)
+                    .append(System.lineSeparator());
+            
out.append("distributionUrl=").append(finalDistributionUrl).append(System.lineSeparator());
             if (distributionSha256Sum != null) {
-                out.append("distributionSha256Sum=" + distributionSha256Sum + 
System.lineSeparator());
+                out.append("distributionSha256Sum=")
+                        .append(distributionSha256Sum)
+                        .append(System.lineSeparator());
             }
             if (!distributionType.equals(TYPE_ONLY_SCRIPT)) {
-                out.append("wrapperUrl=" + wrapperUrl + 
System.lineSeparator());
+                
out.append("wrapperUrl=").append(wrapperUrl).append(System.lineSeparator());
             }
             if (wrapperSha256Sum != null) {
-                out.append("wrapperSha256Sum=" + wrapperSha256Sum + 
System.lineSeparator());
+                
out.append("wrapperSha256Sum=").append(wrapperSha256Sum).append(System.lineSeparator());
             }
             if (alwaysDownload) {
-                out.append("alwaysDownload=" + Boolean.TRUE + 
System.lineSeparator());
+                out.append("alwaysDownload=")
+                        .append(String.valueOf(Boolean.TRUE))
+                        .append(System.lineSeparator());
             }
             if (alwaysUnpack) {
-                out.append("alwaysUnpack=" + Boolean.TRUE + 
System.lineSeparator());
+                
out.append("alwaysUnpack=").append(String.valueOf(Boolean.TRUE)).append(System.lineSeparator());
             }
         } catch (IOException ioe) {
             throw new MojoExecutionException("Can't create 
maven-wrapper.properties", ioe);
@@ -351,7 +362,7 @@ public class WrapperMojo extends AbstractMojo {
 
     private String getVersion(String defaultVersion, Class<?> clazz, String 
path) {
         String version = defaultVersion;
-        if (version == null || version.trim().length() == 0 || 
"true".equals(version)) {
+        if (version == null || version.trim().isEmpty() || 
"true".equals(version)) {
             Properties props = new Properties();
             try (InputStream is = clazz.getResourceAsStream("/META-INF/maven/" 
+ path + "/pom.properties")) {
                 if (is != null) {
@@ -371,37 +382,27 @@ public class WrapperMojo extends AbstractMojo {
     private String getRepoUrl() {
         // adapt to also support MVNW_REPOURL as supported by mvnw scripts 
from maven-wrapper
         String envRepoUrl = System.getenv(MVNW_REPOURL);
-        final String repoUrl = determineRepoUrl(envRepoUrl, 
session.getSettings());
-
+        final String repoUrl = determineRepoUrl(envRepoUrl);
         getLog().debug("Determined repo URL to use as " + repoUrl);
-
         return repoUrl;
     }
 
-    protected String determineRepoUrl(String envRepoUrl, Settings settings) {
-
+    protected String determineRepoUrl(String envRepoUrl) {
         if (envRepoUrl != null && !envRepoUrl.trim().isEmpty() && 
envRepoUrl.length() > 4) {
             String repoUrl = envRepoUrl.trim();
-
             if (repoUrl.endsWith("/")) {
                 repoUrl = repoUrl.substring(0, repoUrl.length() - 1);
             }
-
             getLog().debug("Using repo URL from " + MVNW_REPOURL + " 
environment variable.");
-
             return repoUrl;
         }
 
-        // otherwise mirror from settings
-        if (settings.getMirrors() != null && !settings.getMirrors().isEmpty()) 
{
-            for (Mirror current : settings.getMirrors()) {
-                if ("*".equals(current.getMirrorOf())) {
-                    getLog().debug("Using repo URL from * mirror in settings 
file.");
-                    return current.getUrl();
-                }
-            }
-        }
-
-        return DEFAULT_REPOURL;
+        return repositorySystem
+                .newResolutionRepositories(
+                        repositorySystemSession,
+                        Collections.singletonList(
+                                new RemoteRepository.Builder(DEFAULT_REPO_ID, 
"default", DEFAULT_REPO_URL).build()))
+                .get(0)
+                .getUrl();
     }
 }
diff --git 
a/maven-wrapper-plugin/src/test/java/org/apache/maven/plugins/wrapper/WrapperMojoTest.java
 
b/maven-wrapper-plugin/src/test/java/org/apache/maven/plugins/wrapper/WrapperMojoTest.java
index 5289e09..303d508 100644
--- 
a/maven-wrapper-plugin/src/test/java/org/apache/maven/plugins/wrapper/WrapperMojoTest.java
+++ 
b/maven-wrapper-plugin/src/test/java/org/apache/maven/plugins/wrapper/WrapperMojoTest.java
@@ -18,62 +18,70 @@
  */
 package org.apache.maven.plugins.wrapper;
 
-import org.apache.maven.settings.Settings;
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.RepositorySystemSession;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.ArgumentMatchers.anyList;
+import static org.mockito.ArgumentMatchers.same;
+import static org.mockito.Mockito.when;
 
+@ExtendWith(MockitoExtension.class)
 class WrapperMojoTest {
+    @Mock(strictness = Mock.Strictness.LENIENT)
+    private RepositorySystem repositorySystem;
+
+    @Mock
+    private RepositorySystemSession repositorySystemSession;
+
+    @InjectMocks
+    private WrapperMojo wrapperMojo;
+
+    @BeforeEach
+    void setupMocks() {
+        
when(repositorySystem.newResolutionRepositories(same(repositorySystemSession), 
anyList()))
+                .then(i -> i.getArguments()[1]);
+    }
 
     @Test
     void userSuppliedRepoUrlGetsTrailingSlashTrimmed() {
-        // given
-        Settings settings = new Settings();
-        WrapperMojo wrapperMojo = new WrapperMojo();
-
         // when
-        String determinedRepoUrl = 
wrapperMojo.determineRepoUrl(WrapperMojo.DEFAULT_REPOURL + "/", settings);
+        String determinedRepoUrl = 
wrapperMojo.determineRepoUrl(WrapperMojo.DEFAULT_REPO_URL + "/");
 
         // then
-        assertEquals(WrapperMojo.DEFAULT_REPOURL, determinedRepoUrl);
+        assertEquals(WrapperMojo.DEFAULT_REPO_URL, determinedRepoUrl);
     }
 
     @Test
     void nullRepoUrlNotUsed() {
-        // given
-        Settings settings = new Settings();
-        WrapperMojo wrapperMojo = new WrapperMojo();
-
         // when
-        String determinedRepoUrl = wrapperMojo.determineRepoUrl(null, 
settings);
+        String determinedRepoUrl = wrapperMojo.determineRepoUrl(null);
 
         // then
-        assertEquals(WrapperMojo.DEFAULT_REPOURL, determinedRepoUrl);
+        assertEquals(WrapperMojo.DEFAULT_REPO_URL, determinedRepoUrl);
     }
 
     @Test
     void emptyRepoUrlNotUsed() {
-        // given
-        Settings settings = new Settings();
-        WrapperMojo wrapperMojo = new WrapperMojo();
-
         // when
-        String determinedRepoUrl = wrapperMojo.determineRepoUrl("", settings);
+        String determinedRepoUrl = wrapperMojo.determineRepoUrl("");
 
         // then
-        assertEquals(WrapperMojo.DEFAULT_REPOURL, determinedRepoUrl);
+        assertEquals(WrapperMojo.DEFAULT_REPO_URL, determinedRepoUrl);
     }
 
     @Test
     void slashRepoUrlNotUsed() {
-        // given
-        Settings settings = new Settings();
-        WrapperMojo wrapperMojo = new WrapperMojo();
-
         // when
-        String determinedRepoUrl = wrapperMojo.determineRepoUrl("/", settings);
+        String determinedRepoUrl = wrapperMojo.determineRepoUrl("/");
 
         // then
-        assertEquals(WrapperMojo.DEFAULT_REPOURL, determinedRepoUrl);
+        assertEquals(WrapperMojo.DEFAULT_REPO_URL, determinedRepoUrl);
     }
 }

Reply via email to