[MNG-4645] Move Central repo definition out of Maven's core so it can be more easily changed (#1139)

Co-authored-by: Christian Schulte <schulte@apache.org>
This commit is contained in:
Guillaume Nodet 2023-06-19 17:04:04 +02:00 committed by GitHub
parent 0a8491c329
commit 229b31b626
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 130 additions and 81 deletions

View File

@ -43,9 +43,9 @@ under the License.
| values (values used when the setting is not specified) are provided.
|
|-->
<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
<settings xmlns="http://maven.apache.org/SETTINGS/1.3.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd">
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.3.0 https://maven.apache.org/xsd/settings-1.3.0.xsd">
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
@ -166,6 +166,38 @@ under the License.
</mirror>
</mirrors>
<!-- repositories
| Specifies the list of default remote repositories that maven will search artifacts for.
-->
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<!-- plugin repositories
| Specifies the list of default remote repositories that maven will search plugins for.
-->
<pluginRepositories>
<pluginRepository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<updatePolicy>never</updatePolicy>
</releases>
</pluginRepository>
</pluginRepositories>
<!-- profiles
| This is a list of profiles which can be activated in a variety of ways, and which can modify
| the build process. Profiles provided in the settings.xml are intended to provide local machine-

View File

@ -65,6 +65,20 @@ under the License.
</params>
</configuration>
</execution>
<execution>
<id>modello-site-docs</id>
<goals>
<goal>xdoc</goal>
<goal>xsd</goal>
</goals>
<phase>generate-resources</phase>
<configuration>
<version>1.3.0</version>
<models>
<model>src/main/mdo/settings.mdo</model>
</models>
</configuration>
</execution>
</executions>
</plugin>
<plugin>

View File

@ -223,6 +223,39 @@
<multiplicity>*</multiplicity>
</association>
</field>
<field xdoc.separator="blank">
<name>repositories</name>
<version>1.3.0+</version>
<description>
<![CDATA[
The lists of the remote repositories.
]]>
</description>
<association>
<type>Repository</type>
<multiplicity>*</multiplicity>
</association>
</field>
<field>
<name>pluginRepositories</name>
<version>1.3.0+</version>
<description>
<![CDATA[
The lists of the remote repositories for discovering plugins.
]]>
</description>
<association>
<type>Repository</type>
<multiplicity>*</multiplicity>
</association>
<comment>
<![CDATA[
This may be removed or relocated in the near
future. It is undecided whether plugins really need a remote
repository set of their own.
]]>
</comment>
</field>
<field xdoc.separator="blank">
<name>profiles</name>
<version>1.0.0+</version>
@ -266,7 +299,7 @@
</fields>
<codeSegments>
<codeSegment>
<version>1.0.0/1.2.0</version>
<version>1.0.0/1.3.0</version>
<code>
<![CDATA[
public Boolean getInteractiveMode()
@ -816,6 +849,7 @@
<class java.clone="deep">
<name>RepositoryBase</name>
<version>1.0.0+</version>
<superClass>IdentifiableBase</superClass>
<description>
<![CDATA[
Repository contains the information needed
@ -823,18 +857,6 @@
]]>
</description>
<fields>
<field>
<name>id</name>
<version>1.0.0+</version>
<required>true</required>
<identifier>true</identifier>
<description>
<![CDATA[
A unique identifier for a repository.
]]>
</description>
<type>String</type>
</field>
<field>
<name>name</name>
<version>1.0.0+</version>

View File

@ -27,7 +27,6 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.maven.artifact.InvalidRepositoryException;
import org.apache.maven.artifact.repository.ArtifactRepository;
@ -83,10 +82,6 @@ public class DefaultMavenExecutionRequestPopulator implements MavenExecutionRequ
populateDefaultPluginGroups(request);
injectDefaultRepositories(request);
injectDefaultPluginRepositories(request);
return request;
}
@ -99,32 +94,6 @@ public class DefaultMavenExecutionRequestPopulator implements MavenExecutionRequ
request.addPluginGroup("org.codehaus.mojo");
}
private void injectDefaultRepositories(MavenExecutionRequest request)
throws MavenExecutionRequestPopulationException {
Set<String> definedRepositories = repositorySystem.getRepoIds(request.getRemoteRepositories());
if (!definedRepositories.contains(MavenRepositorySystem.DEFAULT_REMOTE_REPO_ID)) {
try {
request.addRemoteRepository(repositorySystem.createDefaultRemoteRepository(request));
} catch (Exception e) {
throw new MavenExecutionRequestPopulationException("Cannot create default remote repository.", e);
}
}
}
private void injectDefaultPluginRepositories(MavenExecutionRequest request)
throws MavenExecutionRequestPopulationException {
Set<String> definedRepositories = repositorySystem.getRepoIds(request.getPluginArtifactRepositories());
if (!definedRepositories.contains(MavenRepositorySystem.DEFAULT_REMOTE_REPO_ID)) {
try {
request.addPluginArtifactRepository(repositorySystem.createDefaultRemoteRepository(request));
} catch (Exception e) {
throw new MavenExecutionRequestPopulationException("Cannot create default remote repository.", e);
}
}
}
private void localRepository(MavenExecutionRequest request) throws MavenExecutionRequestPopulationException {
// ------------------------------------------------------------------------
// Local Repository

View File

@ -43,6 +43,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;
class DefaultMavenProjectBuilderTest extends AbstractMavenProjectTestCase {
@ -133,10 +134,10 @@ class DefaultMavenProjectBuilderTest extends AbstractMavenProjectTestCase {
assertNotNull(project.getArtifactId());
assertNotNull(project.getRemoteArtifactRepositories());
assertFalse(project.getRemoteArtifactRepositories().isEmpty());
assertTrue(project.getRemoteArtifactRepositories().isEmpty());
assertNotNull(project.getPluginArtifactRepositories());
assertFalse(project.getPluginArtifactRepositories().isEmpty());
assertTrue(project.getPluginArtifactRepositories().isEmpty());
assertNull(project.getParent());
assertNull(project.getParentArtifact());

View File

@ -575,7 +575,7 @@ class PomConstructionTest {
@Test
void testMultipleRepositories() throws Exception {
PomTestWrapper pom = buildPom("multiple-repos/sub");
assertEquals(3, ((List<?>) pom.getValue("repositories")).size());
assertEquals(2, ((List<?>) pom.getValue("repositories")).size());
}
/** MNG-3965 */
@ -1371,12 +1371,10 @@ class PomConstructionTest {
assertEquals("org.apache.maven.its", pom.getValue("dependencies[1]/exclusions[1]/groupId"));
assertEquals("excluded-dep", pom.getValue("dependencies[1]/exclusions[1]/artifactId"));
assertEquals(2, ((List<?>) pom.getValue("repositories")).size());
assertEquals(1, ((List<?>) pom.getValue("repositories")).size());
assertEquals("project-remote-repo", pom.getValue("repositories[1]/id"));
assertEquals("https://project.url/remote", pom.getValue("repositories[1]/url"));
assertEquals("repo", pom.getValue("repositories[1]/name"));
assertEquals(MavenRepositorySystem.DEFAULT_REMOTE_REPO_ID, pom.getValue("repositories[2]/id"));
assertEquals(MavenRepositorySystem.DEFAULT_REMOTE_REPO_URL, pom.getValue("repositories[2]/url"));
assertEquals("test", pom.getValue("build/defaultGoal"));
assertEquals("coreit", pom.getValue("build/finalName"));

View File

@ -233,6 +233,22 @@ public class SettingsXmlConfigurationProcessor implements ConfigurationProcessor
request.addMirror(mirror);
}
for (Repository remoteRepository : settings.getRepositories()) {
try {
request.addRemoteRepository(MavenRepositorySystem.buildArtifactRepository(remoteRepository));
} catch (InvalidRepositoryException e) {
// do nothing for now
}
}
for (Repository pluginRepository : settings.getPluginRepositories()) {
try {
request.addPluginArtifactRepository(MavenRepositorySystem.buildArtifactRepository(pluginRepository));
} catch (InvalidRepositoryException e) {
// do nothing for now
}
}
request.setActiveProfiles(settings.getActiveProfiles());
for (Profile rawProfile : settings.getProfiles()) {

View File

@ -28,33 +28,6 @@ under the License.
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<repositories>
<repository>
<id>central</id>
<name>Maven Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<name>Maven Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<updatePolicy>never</updatePolicy>
</releases>
</pluginRepository>
</pluginRepositories>
<build>
<directory>${project.basedir}/target</directory>
<outputDirectory>${project.build.directory}/classes</outputDirectory>

View File

@ -32,6 +32,8 @@ import java.util.Map;
import org.apache.maven.api.settings.InputSource;
import org.apache.maven.building.FileSource;
import org.apache.maven.building.Source;
import org.apache.maven.settings.Repository;
import org.apache.maven.settings.RepositoryPolicy;
import org.apache.maven.settings.Server;
import org.apache.maven.settings.Settings;
import org.apache.maven.settings.TrackableBase;
@ -104,6 +106,26 @@ public class DefaultSettingsBuilder implements SettingsBuilder {
settingsMerger.merge(projectSettings, globalSettings, TrackableBase.GLOBAL_LEVEL);
settingsMerger.merge(userSettings, projectSettings, TrackableBase.PROJECT_LEVEL);
// If no repository is defined in the user/global settings,
// it means that we have "old" settings (as those are new in 4.0)
// so add central to the computed settings for backward compatibility.
if (userSettings.getRepositories().isEmpty()
&& userSettings.getPluginRepositories().isEmpty()) {
Repository central = new Repository();
central.setId("central");
central.setName("Central Repository");
central.setUrl("https://repo.maven.apache.org/maven2");
RepositoryPolicy disabledPolicy = new RepositoryPolicy();
disabledPolicy.setEnabled(false);
central.setSnapshots(disabledPolicy);
userSettings.getRepositories().add(central);
central = central.clone();
RepositoryPolicy updateNeverPolicy = new RepositoryPolicy();
disabledPolicy.setUpdatePolicy("never");
central.setReleases(updateNeverPolicy);
userSettings.getPluginRepositories().add(central);
}
problems.setSource("");
userSettings = interpolate(userSettings, request, problems);

View File

@ -88,6 +88,8 @@ public class MavenSettingsMerger {
shallowMergeById(dominant.getServers(), recessive.getServers(), recessiveSourceLevel);
shallowMergeById(dominant.getProxies(), recessive.getProxies(), recessiveSourceLevel);
shallowMergeById(dominant.getProfiles(), recessive.getProfiles(), recessiveSourceLevel);
shallowMergeById(dominant.getRepositories(), recessive.getRepositories(), recessiveSourceLevel);
shallowMergeById(dominant.getPluginRepositories(), recessive.getPluginRepositories(), recessiveSourceLevel);
}
/**

View File

@ -67,7 +67,7 @@ class DefaultSettingsValidatorTest {
validator.validate(model, problems);
assertEquals(0, problems.messages.size());
Repository repo = new Repository();
Repository repo = new Repository(org.apache.maven.api.settings.Repository.newInstance(false));
prof.addRepository(repo);
problems = new SimpleProblemCollector();
validator.validate(model, problems);

View File

@ -94,7 +94,7 @@ under the License.
</goals>
<phase>generate-sources</phase>
<configuration>
<version>1.2.0</version>
<version>1.3.0</version>
<templates>
<template>model-v3.vm</template>
</templates>