Skip to content

Commit

Permalink
[MNG-4645] Move Central repo definition out of Maven's core so it can…
Browse files Browse the repository at this point in the history
… be more easily changed
  • Loading branch information
ChristianSchulte authored and gnodet committed Jun 2, 2023
1 parent 84e133d commit d13c497
Show file tree
Hide file tree
Showing 11 changed files with 129 additions and 80 deletions.
36 changes: 34 additions & 2 deletions apache-maven/src/assembly/maven/conf/settings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -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.
|
Expand Down Expand Up @@ -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-
Expand Down
16 changes: 15 additions & 1 deletion api/maven-api-settings/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ under the License.
<goal>velocity</goal>
</goals>
<configuration>
<version>2.0.0</version>
<version>1.3.0</version>
<velocityBasedir>${project.basedir}/../../src/mdo</velocityBasedir>
<models>
<model>src/main/mdo/settings.mdo</model>
Expand All @@ -64,6 +64,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>
Expand Down
46 changes: 34 additions & 12 deletions api/maven-api-settings/src/main/mdo/settings.mdo
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,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>
Expand Down Expand Up @@ -815,25 +848,14 @@
<class java.clone="deep">
<name>RepositoryBase</name>
<version>1.0.0+</version>
<superClass>IdentifiableBase</superClass>
<description>
<![CDATA[
Repository contains the information needed
for establishing connections with remote repository
]]>
</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>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
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;
Expand Down Expand Up @@ -84,10 +83,6 @@ public MavenExecutionRequest populateDefaults(MavenExecutionRequest request)

populateDefaultPluginGroups(request);

injectDefaultRepositories(request);

injectDefaultPluginRepositories(request);

return request;
}

Expand All @@ -100,32 +95,6 @@ private void populateDefaultPluginGroups(MavenExecutionRequest request) {
request.addPluginGroup("org.codehaus.mojo");
}

private void injectDefaultRepositories(MavenExecutionRequest request)
throws MavenExecutionRequestPopulationException {
Set<String> definedRepositories = repositorySystem.getRepoIds(request.getRemoteRepositories());

if (!definedRepositories.contains(RepositorySystem.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(RepositorySystem.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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
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 {
Expand Down Expand Up @@ -133,10 +134,10 @@ void testBuildStubModelForMissingRemotePom() throws Exception {
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());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -575,7 +575,7 @@ void testExecutionConfigurationSubcollections() throws Exception {
@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 */
Expand Down Expand Up @@ -1371,12 +1371,10 @@ private void testCompleteModel(PomTestWrapper pom) throws Exception {
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(RepositorySystem.DEFAULT_REMOTE_REPO_ID, pom.getValue("repositories[2]/id"));
assertEquals(RepositorySystem.DEFAULT_REMOTE_REPO_URL, pom.getValue("repositories[2]/url"));

assertEquals("test", pom.getValue("build/defaultGoal"));
assertEquals("coreit", pom.getValue("build/finalName"));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,22 @@ private MavenExecutionRequest populateFromSettings(MavenExecutionRequest request
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()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@

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.Settings;
import org.apache.maven.settings.TrackableBase;
import org.apache.maven.settings.io.SettingsParseException;
Expand Down Expand Up @@ -97,6 +99,26 @@ public SettingsBuildingResult build(SettingsBuildingRequest request) throws Sett

settingsMerger.merge(userSettings, globalSettings, TrackableBase.GLOBAL_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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,8 @@ public void merge(Settings dominant, Settings recessive, String recessiveSourceL
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);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ void testValidate() {
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);
Expand Down

0 comments on commit d13c497

Please sign in to comment.