diff --git a/api/maven-api-settings/pom.xml b/api/maven-api-settings/pom.xml
index a73c2ce1de0d..8262c2efde5a 100644
--- a/api/maven-api-settings/pom.xml
+++ b/api/maven-api-settings/pom.xml
@@ -54,6 +54,9 @@ under the License.
org.codehaus.modello
modello-maven-plugin
+
+ alias
+
2.0.0
${project.basedir}/../../src/mdo
diff --git a/api/maven-api-settings/src/main/mdo/settings.mdo b/api/maven-api-settings/src/main/mdo/settings.mdo
index fe69efeeff16..0e8803b2d464 100644
--- a/api/maven-api-settings/src/main/mdo/settings.mdo
+++ b/api/maven-api-settings/src/main/mdo/settings.mdo
@@ -529,6 +529,18 @@
Extra configuration for the transport layer.
+
+ aliases
+ 1.3.0+
+ List of additional server aliases. For each alias, an additional server entry will be generated
+ with the same configuration as the original one, but with the ID replaced by the alias
+ and with an empty aliases list.
+ This is useful when the same credentials should be used for multiple servers.
+
+ String
+ *
+
+
diff --git a/compat/maven-settings-builder/src/main/java/org/apache/maven/settings/building/DefaultSettingsBuilder.java b/compat/maven-settings-builder/src/main/java/org/apache/maven/settings/building/DefaultSettingsBuilder.java
index 140393bf0659..48bb04bb4f5f 100644
--- a/compat/maven-settings-builder/src/main/java/org/apache/maven/settings/building/DefaultSettingsBuilder.java
+++ b/compat/maven-settings-builder/src/main/java/org/apache/maven/settings/building/DefaultSettingsBuilder.java
@@ -26,12 +26,15 @@
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
+import java.util.stream.Stream;
import org.apache.maven.building.FileSource;
import org.apache.maven.building.Source;
+import org.apache.maven.settings.Server;
import org.apache.maven.settings.Settings;
import org.apache.maven.settings.TrackableBase;
import org.apache.maven.settings.io.SettingsParseException;
@@ -182,6 +185,7 @@ private Settings readSettings(
}
settingsValidator.validate(settings, problems);
+ settings.setServers(new ArrayList<>(serversByIds(settings.getServers())));
return settings;
}
@@ -251,4 +255,18 @@ public Object execute(String expression, Object value) {
return result;
}
+
+ private List serversByIds(List servers) {
+ return servers.stream()
+ .flatMap(server -> Stream.concat(
+ Stream.of(server), server.getAliases().stream().map(id -> serverAlias(server, id))))
+ .toList();
+ }
+
+ private Server serverAlias(Server server, String id) {
+ return new Server(org.apache.maven.api.settings.Server.newBuilder(server.getDelegate(), true)
+ .id(id)
+ .aliases(List.of())
+ .build());
+ }
}
diff --git a/compat/maven-settings-builder/src/main/java/org/apache/maven/settings/validation/DefaultSettingsValidator.java b/compat/maven-settings-builder/src/main/java/org/apache/maven/settings/validation/DefaultSettingsValidator.java
index f1913e00de72..8e497d6b408b 100644
--- a/compat/maven-settings-builder/src/main/java/org/apache/maven/settings/validation/DefaultSettingsValidator.java
+++ b/compat/maven-settings-builder/src/main/java/org/apache/maven/settings/validation/DefaultSettingsValidator.java
@@ -93,6 +93,23 @@ public void validate(Settings settings, SettingsProblemCollector problems) {
"must be unique but found duplicate server with id " + server.getId());
}
}
+
+ for (int i = 0; i < servers.size(); i++) {
+ Server server = servers.get(i);
+ for (int a = 0; a < server.getAliases().size(); a++) {
+ String alias = server.getAliases().get(a);
+ validateStringNotEmpty(
+ problems, "servers.server[" + i + "].aliases[" + a + "]", alias, server.getId());
+ if (!serverIds.add(alias)) {
+ addViolation(
+ problems,
+ Severity.WARNING,
+ "servers.server[" + i + "].aliases[" + a + "]",
+ server.getId(),
+ "must be unique across all server ids and aliases but found duplicate alias " + alias);
+ }
+ }
+ }
}
List mirrors = settings.getMirrors();
diff --git a/compat/maven-settings-builder/src/test/java/org/apache/maven/settings/building/DefaultSettingsBuilderFactoryTest.java b/compat/maven-settings-builder/src/test/java/org/apache/maven/settings/building/DefaultSettingsBuilderFactoryTest.java
index 2959e4f68243..84c74feb0fa9 100644
--- a/compat/maven-settings-builder/src/test/java/org/apache/maven/settings/building/DefaultSettingsBuilderFactoryTest.java
+++ b/compat/maven-settings-builder/src/test/java/org/apache/maven/settings/building/DefaultSettingsBuilderFactoryTest.java
@@ -19,10 +19,16 @@
package org.apache.maven.settings.building;
import java.io.File;
+import java.util.List;
+import java.util.Properties;
+import org.apache.maven.api.settings.Server;
+import org.apache.maven.settings.Settings;
import org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
/**
*/
@@ -32,17 +38,101 @@ private File getSettings(String name) {
return new File("src/test/resources/settings/factory/" + name + ".xml").getAbsoluteFile();
}
- @Test
- void testCompleteWiring() throws Exception {
+ SettingsBuildingResult execute(String settingsName) throws Exception {
+ Properties properties = new Properties();
+ properties.setProperty("user.home", "/home/user");
+
SettingsBuilder builder = new DefaultSettingsBuilderFactory().newInstance();
assertNotNull(builder);
DefaultSettingsBuildingRequest request = new DefaultSettingsBuildingRequest();
- request.setSystemProperties(System.getProperties());
- request.setUserSettingsFile(getSettings("simple"));
+ request.setSystemProperties(properties);
+ request.setUserSettingsFile(getSettings(settingsName));
SettingsBuildingResult result = builder.build(request);
assertNotNull(result);
- assertNotNull(result.getEffectiveSettings());
+ return result;
+ }
+
+ @Test
+ void testCompleteWiring() throws Exception {
+ Settings settings = execute("simple").getEffectiveSettings();
+
+ String localRepository = settings.getLocalRepository();
+ assertTrue(localRepository.equals("/home/user/.m2/repository")
+ || localRepository.endsWith("\\home\\user\\.m2\\repository"));
+ }
+
+ @Test
+ void testSettingsWithServers() throws Exception {
+ Settings settings = execute("settings-servers-1").getEffectiveSettings();
+
+ List servers = settings.getDelegate().getServers();
+ assertEquals(2, servers.size());
+
+ Server server1 = getServerById(servers, "server-1");
+ assertEquals("username1", server1.getUsername());
+ assertEquals("password1", server1.getPassword());
+
+ Server server2 = getServerById(servers, "server-2");
+ assertEquals("username2", server2.getUsername());
+ assertEquals("password2", server2.getPassword());
+ }
+
+ @Test
+ void testSettingsWithServersAndAliases() throws Exception {
+ Settings settings = execute("settings-servers-2").getEffectiveSettings();
+
+ List servers = settings.getDelegate().getServers();
+ assertEquals(6, servers.size());
+
+ Server server1 = getServerById(servers, "server-1");
+ assertEquals("username1", server1.getUsername());
+ assertEquals("password1", server1.getPassword());
+ assertEquals(List.of("server-11", "server-12"), server1.getAliases());
+
+ Server server11 = getServerById(servers, "server-11");
+ assertEquals("username1", server11.getUsername());
+ assertEquals("password1", server11.getPassword());
+ assertTrue(server11.getAliases().isEmpty());
+
+ Server server12 = getServerById(servers, "server-12");
+ assertEquals("username1", server12.getUsername());
+ assertEquals("password1", server12.getPassword());
+ assertTrue(server12.getAliases().isEmpty());
+
+ Server server2 = getServerById(servers, "server-2");
+ assertEquals("username2", server2.getUsername());
+ assertEquals("password2", server2.getPassword());
+ assertEquals(List.of("server-21"), server2.getAliases());
+
+ Server server21 = getServerById(servers, "server-21");
+ assertEquals("username2", server21.getUsername());
+ assertEquals("password2", server21.getPassword());
+ assertTrue(server21.getAliases().isEmpty());
+
+ Server server3 = getServerById(servers, "server-3");
+ assertEquals("username3", server3.getUsername());
+ assertEquals("password3", server3.getPassword());
+ assertTrue(server3.getAliases().isEmpty());
+ }
+
+ private Server getServerById(List servers, String id) {
+ return servers.stream()
+ .filter(s -> s.getId().equals(id))
+ .findFirst()
+ .orElseThrow(
+ () -> new IllegalStateException("Server with id " + id + " not found on list: " + servers));
+ }
+
+ @Test
+ void testSettingsWithDuplicateServersIds() throws Exception {
+ SettingsBuildingResult result = execute("settings-servers-3");
+
+ List problems = result.getProblems();
+ assertEquals(1, problems.size());
+ assertEquals(
+ "'servers.server[0].aliases[0]' for server-1 must be unique across all server ids and aliases but found duplicate alias server-2",
+ problems.get(0).getMessage());
}
}
diff --git a/compat/maven-settings-builder/src/test/java/org/apache/maven/settings/validation/DefaultSettingsValidatorTest.java b/compat/maven-settings-builder/src/test/java/org/apache/maven/settings/validation/DefaultSettingsValidatorTest.java
index d2f95b21dad7..4bec76a359bf 100644
--- a/compat/maven-settings-builder/src/test/java/org/apache/maven/settings/validation/DefaultSettingsValidatorTest.java
+++ b/compat/maven-settings-builder/src/test/java/org/apache/maven/settings/validation/DefaultSettingsValidatorTest.java
@@ -219,6 +219,58 @@ void testValidateProxy() throws Exception {
assertContains(problems.messages.get(0), "'proxies.proxy.host' for default is missing");
}
+ @Test
+ void testValidateServerIdAlias() {
+ Settings settings = new Settings();
+ Server server = new Server();
+ server.setId("server-1");
+ server.addAlias("server-1");
+ settings.addServer(server);
+
+ SimpleProblemCollector problems = new SimpleProblemCollector();
+ validator.validate(settings, problems);
+ assertEquals(1, problems.messages.size());
+ assertContains(
+ problems.messages.get(0),
+ "'servers.server[0].aliases[0]' for server-1 must be unique across all server ids and aliases but found duplicate alias server-1");
+ }
+
+ @Test
+ void testMultipleUsageOfAliases() {
+ Settings settings = new Settings();
+
+ Server server1 = new Server();
+ server1.setId("server-1");
+ server1.addAlias("alias-1");
+ settings.addServer(server1);
+
+ Server server2 = new Server();
+ server2.setId("server-2");
+ server2.addAlias("alias-1");
+ settings.addServer(server2);
+
+ SimpleProblemCollector problems = new SimpleProblemCollector();
+ validator.validate(settings, problems);
+ assertEquals(1, problems.messages.size());
+ assertContains(
+ problems.messages.get(0),
+ "'servers.server[1].aliases[0]' for server-2 must be unique across all server ids and aliases but found duplicate alias alias-1");
+ }
+
+ @Test
+ void testValidateServerIdAliasesWithEmptyValue() {
+ Settings settings = new Settings();
+ Server server = new Server();
+ server.setId("server-1");
+ server.addAlias("");
+ settings.addServer(server);
+
+ SimpleProblemCollector problems = new SimpleProblemCollector();
+ validator.validate(settings, problems);
+ assertEquals(1, problems.messages.size());
+ assertContains(problems.messages.get(0), "'servers.server[0].aliases[0]' for server-1 is missing");
+ }
+
private static class SimpleProblemCollector implements SettingsProblemCollector {
List messages = new ArrayList<>();
diff --git a/compat/maven-settings-builder/src/test/resources/settings/factory/settings-servers-1.xml b/compat/maven-settings-builder/src/test/resources/settings/factory/settings-servers-1.xml
new file mode 100644
index 000000000000..7076749943b2
--- /dev/null
+++ b/compat/maven-settings-builder/src/test/resources/settings/factory/settings-servers-1.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+ ${user.home}/.m2/repository
+
+
+ server-1
+ username1
+ password1
+
+
+ server-2
+ username2
+ password2
+
+
+
+
diff --git a/compat/maven-settings-builder/src/test/resources/settings/factory/settings-servers-2.xml b/compat/maven-settings-builder/src/test/resources/settings/factory/settings-servers-2.xml
new file mode 100644
index 000000000000..a8464a49a302
--- /dev/null
+++ b/compat/maven-settings-builder/src/test/resources/settings/factory/settings-servers-2.xml
@@ -0,0 +1,49 @@
+
+
+
+
+
+ ${user.home}/.m2/repository
+
+
+ server-1
+
+ server-11
+ server-12
+
+ username1
+ password1
+
+
+ server-2
+
+ server-21
+
+ username2
+ password2
+
+
+ server-3
+ username3
+ password3
+
+
+
+
diff --git a/compat/maven-settings-builder/src/test/resources/settings/factory/settings-servers-3.xml b/compat/maven-settings-builder/src/test/resources/settings/factory/settings-servers-3.xml
new file mode 100644
index 000000000000..e0a13454e2e8
--- /dev/null
+++ b/compat/maven-settings-builder/src/test/resources/settings/factory/settings-servers-3.xml
@@ -0,0 +1,40 @@
+
+
+
+
+
+ ${user.home}/.m2/repository
+
+
+ server-1
+
+ server-2
+
+ username1
+ password1
+
+
+ server-2
+ username2
+ password2
+
+
+
+
diff --git a/compat/maven-settings/pom.xml b/compat/maven-settings/pom.xml
index 6aaa0e4e4246..b057a9d8f67b 100644
--- a/compat/maven-settings/pom.xml
+++ b/compat/maven-settings/pom.xml
@@ -68,6 +68,9 @@ under the License.
org.codehaus.modello
modello-maven-plugin
+
+ alias
+
2.0.0
${project.basedir}/../../api/maven-api-settings
${project.basedir}/../../src/mdo
@@ -75,7 +78,7 @@ under the License.
src/main/mdo/settings.mdo
- forcedIOModelVersion=1.2.0
+ forcedIOModelVersion=1.3.0
packageModelV3=org.apache.maven.settings
packageModelV4=org.apache.maven.api.settings
packageToolV4=org.apache.maven.settings.v4
diff --git a/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultSettingsBuilder.java b/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultSettingsBuilder.java
index be7dd9e86312..b5014498bf24 100644
--- a/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultSettingsBuilder.java
+++ b/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultSettingsBuilder.java
@@ -31,6 +31,7 @@
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Supplier;
import java.util.function.UnaryOperator;
+import java.util.stream.Stream;
import org.apache.maven.api.Constants;
import org.apache.maven.api.ProtoSession;
@@ -62,7 +63,6 @@
/**
* Builds the effective settings from a user settings file and/or a global settings file.
- *
*/
@Named
public class DefaultSettingsBuilder implements SettingsBuilder {
@@ -205,7 +205,9 @@ private Settings readSettings(
settingsValidator.validate(settings, isProjectSettings, problems);
- if (isProjectSettings) {
+ if (!isProjectSettings) {
+ settings = settings.withServers(serversByIds(settings.getServers()));
+ } else {
settings = Settings.newBuilder(settings, true)
.localRepository(null)
.interactiveMode(false)
@@ -220,6 +222,7 @@ private Settings readSettings(
.password(null)
.filePermissions(null)
.directoryPermissions(null)
+ .aliases(List.of())
.build())
.toList())
.build();
@@ -228,6 +231,17 @@ private Settings readSettings(
return settings;
}
+ private List serversByIds(List servers) {
+ return servers.stream()
+ .flatMap(server -> Stream.concat(
+ Stream.of(server), server.getAliases().stream().map(id -> serverAlias(server, id))))
+ .toList();
+ }
+
+ private Server serverAlias(Server server, String id) {
+ return Server.newBuilder(server, true).id(id).aliases(List.of()).build();
+ }
+
private Settings interpolate(
Settings settings, SettingsBuilderRequest request, ProblemCollector problems) {
UnaryOperator src;
@@ -348,7 +362,6 @@ public org.apache.maven.api.model.Profile convert(Profile profile) {
/**
* Collects the output of the settings builder.
- *
*/
static class DefaultSettingsBuilderResult implements SettingsBuilderResult {
diff --git a/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultSettingsValidator.java b/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultSettingsValidator.java
index b2df07a6e21c..5e960b152253 100644
--- a/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultSettingsValidator.java
+++ b/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultSettingsValidator.java
@@ -73,6 +73,9 @@ public void validate(Settings settings, boolean isProjectSettings, ProblemCollec
validateStringEmpty(problems, serverField + ".filePermissions", server.getFilePermissions(), msgS);
validateStringEmpty(
problems, serverField + ".directoryPermissions", server.getDirectoryPermissions(), msgS);
+ if (!server.getAliases().isEmpty()) {
+ addViolation(problems, BuilderProblem.Severity.WARNING, serverField + ".aliases", null, msgP);
+ }
}
}
@@ -123,6 +126,23 @@ public void validate(Settings settings, boolean isProjectSettings, ProblemCollec
"must be unique but found duplicate server with id " + server.getId());
}
}
+
+ for (int i = 0; i < servers.size(); i++) {
+ Server server = servers.get(i);
+ for (int a = 0; a < server.getAliases().size(); a++) {
+ String alias = server.getAliases().get(a);
+ validateStringNotEmpty(
+ problems, "servers.server[" + i + "].aliases[" + a + "]", alias, server.getId());
+ if (!serverIds.add(alias)) {
+ addViolation(
+ problems,
+ BuilderProblem.Severity.WARNING,
+ "servers.server[" + i + "].aliases[" + a + "]",
+ server.getId(),
+ "must be unique across all server ids and aliases but found duplicate alias " + alias);
+ }
+ }
+ }
}
List mirrors = settings.getMirrors();
diff --git a/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultSettingsBuilderFactoryTest.java b/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultSettingsBuilderFactoryTest.java
index 5419b27d6287..f76b9067be6c 100644
--- a/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultSettingsBuilderFactoryTest.java
+++ b/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultSettingsBuilderFactoryTest.java
@@ -20,14 +20,19 @@
import java.nio.file.Path;
import java.nio.file.Paths;
+import java.util.List;
import java.util.Map;
import org.apache.maven.api.Session;
+import org.apache.maven.api.services.BuilderProblem;
+import org.apache.maven.api.services.ProblemCollector;
import org.apache.maven.api.services.SettingsBuilder;
import org.apache.maven.api.services.SettingsBuilderRequest;
import org.apache.maven.api.services.SettingsBuilderResult;
import org.apache.maven.api.services.Sources;
import org.apache.maven.api.services.xml.SettingsXmlFactory;
+import org.apache.maven.api.settings.Server;
+import org.apache.maven.api.settings.Settings;
import org.apache.maven.impl.model.DefaultInterpolator;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -36,9 +41,12 @@
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
+import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
/**
+ *
*/
@ExtendWith(MockitoExtension.class)
class DefaultSettingsBuilderFactoryTest {
@@ -53,23 +61,106 @@ void setup() {
.thenReturn(new DefaultSettingsXmlFactory());
}
- @Test
- void testCompleteWiring() {
+ SettingsBuilderResult execute(String settingsName) {
SettingsBuilder builder =
new DefaultSettingsBuilder(new DefaultSettingsXmlFactory(), new DefaultInterpolator(), Map.of());
assertNotNull(builder);
SettingsBuilderRequest request = SettingsBuilderRequest.builder()
.session(session)
- .userSettingsSource(Sources.buildSource(getSettings("settings-simple")))
+ .userSettingsSource(Sources.buildSource(getSettings(settingsName)))
.build();
SettingsBuilderResult result = builder.build(request);
assertNotNull(result);
- assertNotNull(result.getEffectiveSettings());
+ return result;
+ }
+
+ @Test
+ void testCompleteWiring() {
+ Settings settings = execute("settings-simple").getEffectiveSettings();
+
+ String localRepository = settings.getLocalRepository();
+ assertTrue(localRepository.equals("${user.home}/.m2/repository")
+ || localRepository.endsWith("\\${user.home}\\.m2\\repository"));
+ }
+
+ @Test
+ void testSettingsWithServers() {
+ Settings settings = execute("settings-servers-1").getEffectiveSettings();
+
+ List servers = settings.getServers();
+ assertEquals(2, servers.size());
+
+ Server server1 = getServerById(servers, "server-1");
+ assertEquals("username1", server1.getUsername());
+ assertEquals("password1", server1.getPassword());
+
+ Server server2 = getServerById(servers, "server-2");
+ assertEquals("username2", server2.getUsername());
+ assertEquals("password2", server2.getPassword());
+ }
+
+ @Test
+ void testSettingsWithServersAndAliases() {
+ Settings settings = execute("settings-servers-2").getEffectiveSettings();
+
+ assertEquals("${user.home}/.m2/repository", settings.getLocalRepository());
+
+ List servers = settings.getServers();
+ assertEquals(6, servers.size());
+
+ Server server1 = getServerById(servers, "server-1");
+ assertEquals("username1", server1.getUsername());
+ assertEquals("password1", server1.getPassword());
+ assertEquals(List.of("server-11", "server-12"), server1.getAliases());
+
+ Server server11 = getServerById(servers, "server-11");
+ assertEquals("username1", server11.getUsername());
+ assertEquals("password1", server11.getPassword());
+ assertTrue(server11.getAliases().isEmpty());
+
+ Server server12 = getServerById(servers, "server-12");
+ assertEquals("username1", server12.getUsername());
+ assertEquals("password1", server12.getPassword());
+ assertTrue(server12.getAliases().isEmpty());
+
+ Server server2 = getServerById(servers, "server-2");
+ assertEquals("username2", server2.getUsername());
+ assertEquals("password2", server2.getPassword());
+ assertEquals(List.of("server-21"), server2.getAliases());
+
+ Server server21 = getServerById(servers, "server-21");
+ assertEquals("username2", server21.getUsername());
+ assertEquals("password2", server21.getPassword());
+ assertTrue(server21.getAliases().isEmpty());
+
+ Server server3 = getServerById(servers, "server-3");
+ assertEquals("username3", server3.getUsername());
+ assertEquals("password3", server3.getPassword());
+ assertTrue(server3.getAliases().isEmpty());
+ }
+
+ private Server getServerById(List servers, String id) {
+ return servers.stream()
+ .filter(s -> s.getId().equals(id))
+ .findFirst()
+ .orElseThrow(
+ () -> new IllegalStateException("Server with id " + id + " not found on list: " + servers));
+ }
+
+ @Test
+ void testSettingsWithDuplicateServersIds() throws Exception {
+ SettingsBuilderResult result = execute("settings-servers-3");
+
+ ProblemCollector problems = result.getProblems();
+ assertEquals(1, problems.problems().count());
+ assertEquals(
+ "'servers.server[0].aliases[0]' for server-1 must be unique across all server ids and aliases but found duplicate alias server-2",
+ problems.problems().findFirst().orElseThrow().getMessage());
}
private Path getSettings(String name) {
- return Paths.get("src/test/resources/" + name + ".xml").toAbsolutePath();
+ return Paths.get("src/test/resources/settings/" + name + ".xml").toAbsolutePath();
}
}
diff --git a/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultSettingsValidatorTest.java b/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultSettingsValidatorTest.java
index f604fe6bb3af..46ae074de0eb 100644
--- a/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultSettingsValidatorTest.java
+++ b/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultSettingsValidatorTest.java
@@ -26,6 +26,7 @@
import org.apache.maven.api.services.SettingsBuilder;
import org.apache.maven.api.settings.Profile;
import org.apache.maven.api.settings.Repository;
+import org.apache.maven.api.settings.Server;
import org.apache.maven.api.settings.Settings;
import org.apache.maven.impl.model.DefaultInterpolator;
import org.junit.jupiter.api.BeforeEach;
@@ -70,4 +71,50 @@ void testValidate() {
problems = validator.validate(model2);
assertEquals(0, problems.totalProblemsReported());
}
+
+ @Test
+ void testValidateServerIdAlias() {
+ Server server =
+ Server.newBuilder().id("server-1").aliases(List.of("server-1")).build();
+
+ Settings settings = Settings.newBuilder().servers(List.of(server)).build();
+
+ ProblemCollector problems = validator.validate(settings);
+ assertEquals(1, problems.totalProblemsReported());
+ assertEquals(
+ "'servers.server[0].aliases[0]' for server-1 must be unique across all server ids and aliases but found duplicate alias server-1",
+ problems.problems().findFirst().orElseThrow().getMessage());
+ }
+
+ @Test
+ void testMultipleUsageOfAliases() {
+
+ Server server1 =
+ Server.newBuilder().id("server-1").aliases(List.of("alias-1")).build();
+
+ Server server2 =
+ Server.newBuilder().id("server-2").aliases(List.of("alias-1")).build();
+
+ Settings settings =
+ Settings.newBuilder().servers(List.of(server1, server2)).build();
+
+ ProblemCollector problems = validator.validate(settings);
+ assertEquals(1, problems.totalProblemsReported());
+ assertEquals(
+ "'servers.server[1].aliases[0]' for server-2 must be unique across all server ids and aliases but found duplicate alias alias-1",
+ problems.problems().findFirst().orElseThrow().getMessage());
+ }
+
+ @Test
+ void testValidateServerIdAliasesWithEmptyValue() {
+ Server server = Server.newBuilder().id("server-1").aliases(List.of("")).build();
+
+ Settings settings = Settings.newBuilder().servers(List.of(server)).build();
+
+ ProblemCollector problems = validator.validate(settings);
+ assertEquals(1, problems.totalProblemsReported());
+ assertEquals(
+ "'servers.server[0].aliases[0]' for server-1 is missing",
+ problems.problems().findFirst().orElseThrow().getMessage());
+ }
}
diff --git a/impl/maven-impl/src/test/resources/settings/settings-servers-1.xml b/impl/maven-impl/src/test/resources/settings/settings-servers-1.xml
new file mode 100644
index 000000000000..7076749943b2
--- /dev/null
+++ b/impl/maven-impl/src/test/resources/settings/settings-servers-1.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+ ${user.home}/.m2/repository
+
+
+ server-1
+ username1
+ password1
+
+
+ server-2
+ username2
+ password2
+
+
+
+
diff --git a/impl/maven-impl/src/test/resources/settings/settings-servers-2.xml b/impl/maven-impl/src/test/resources/settings/settings-servers-2.xml
new file mode 100644
index 000000000000..a8464a49a302
--- /dev/null
+++ b/impl/maven-impl/src/test/resources/settings/settings-servers-2.xml
@@ -0,0 +1,49 @@
+
+
+
+
+
+ ${user.home}/.m2/repository
+
+
+ server-1
+
+ server-11
+ server-12
+
+ username1
+ password1
+
+
+ server-2
+
+ server-21
+
+ username2
+ password2
+
+
+ server-3
+ username3
+ password3
+
+
+
+
diff --git a/impl/maven-impl/src/test/resources/settings/settings-servers-3.xml b/impl/maven-impl/src/test/resources/settings/settings-servers-3.xml
new file mode 100644
index 000000000000..e0a13454e2e8
--- /dev/null
+++ b/impl/maven-impl/src/test/resources/settings/settings-servers-3.xml
@@ -0,0 +1,40 @@
+
+
+
+
+
+ ${user.home}/.m2/repository
+
+
+ server-1
+
+ server-2
+
+ username1
+ password1
+
+
+ server-2
+ username2
+ password2
+
+
+
+
diff --git a/impl/maven-impl/src/test/resources/settings-simple.xml b/impl/maven-impl/src/test/resources/settings/settings-simple.xml
similarity index 100%
rename from impl/maven-impl/src/test/resources/settings-simple.xml
rename to impl/maven-impl/src/test/resources/settings/settings-simple.xml
diff --git a/impl/maven-support/pom.xml b/impl/maven-support/pom.xml
index 65f1eb0a7c5a..7171363b74fc 100644
--- a/impl/maven-support/pom.xml
+++ b/impl/maven-support/pom.xml
@@ -123,6 +123,9 @@ under the License.
generate-sources
+
+ alias
+
2.0.0
${project.basedir}/../../api/maven-api-settings
${project.basedir}/../../src/mdo
@@ -136,7 +139,7 @@ under the License.
writer-stax.vm
- forcedIOModelVersion=1.2.0
+ forcedIOModelVersion=1.3.0
packageModelV3=org.apache.maven.settings
packageModelV4=org.apache.maven.api.settings
packageToolV4=org.apache.maven.settings.v4
diff --git a/pom.xml b/pom.xml
index d83ddb44cb59..56470eaeac22 100644
--- a/pom.xml
+++ b/pom.xml
@@ -743,6 +743,11 @@ under the License.
build-helper-maven-plugin
3.6.1
+
+ org.codehaus.modello
+ modello-maven-plugin
+ 2.7.0
+
org.apache.maven.plugins
maven-deploy-plugin