Merge branch '3.3.x' into 3.4.x

Closes gh-44055
This commit is contained in:
Phillip Webb 2025-02-03 19:44:33 -08:00
commit 0ec15c8f9b
5 changed files with 53 additions and 41 deletions

View File

@ -16,6 +16,9 @@
package org.springframework.boot.build;
import java.net.URI;
import java.util.function.BiFunction;
import javax.inject.Inject;
import org.gradle.api.Project;
@ -29,9 +32,9 @@ import org.gradle.api.artifacts.repositories.MavenArtifactRepository;
*/
public class RepositoryTransformersExtension {
private static final String MARKER = "{spring.mavenRepositories}";
private static final String REPOSITORIES_MARKER = "{spring.mavenRepositories}";
private static final String MARKER_PLUGIN = "{spring.mavenPluginRepositories}";
private static final String PLUGIN_REPOSITORIES_MARKER = "{spring.mavenPluginRepositories}";
private final Project project;
@ -45,18 +48,12 @@ public class RepositoryTransformersExtension {
}
private String transformAnt(String line) {
if (line.contains(MARKER)) {
StringBuilder result = new StringBuilder();
String indent = getIndent(line);
this.project.getRepositories().withType(MavenArtifactRepository.class, (repository) -> {
if (line.contains(REPOSITORIES_MARKER)) {
return transform(line, (repository, indent) -> {
String name = repository.getName();
if (name.startsWith("spring-")) {
result.append(!result.isEmpty() ? "\n" : "");
result.append("%s<ibiblio name=\"%s\" m2compatible=\"true\" root=\"%s\" />".formatted(indent, name,
repository.getUrl()));
}
URI url = repository.getUrl();
return "%s<ibiblio name=\"%s\" m2compatible=\"true\" root=\"%s\" />".formatted(indent, name, url);
});
return result.toString();
}
return line;
}
@ -66,26 +63,17 @@ public class RepositoryTransformersExtension {
}
private String transformMavenSettings(String line) {
if (line.contains(MARKER)) {
return transformMarker(line, false);
if (line.contains(REPOSITORIES_MARKER)) {
return transformMavenRepositories(line, false);
}
if (line.contains(MARKER_PLUGIN)) {
return transformMarker(line, true);
if (line.contains(PLUGIN_REPOSITORIES_MARKER)) {
return transformMavenRepositories(line, true);
}
return line;
}
private String transformMarker(String line, boolean pluginRepository) {
StringBuilder result = new StringBuilder();
String indent = getIndent(line);
this.project.getRepositories().withType(MavenArtifactRepository.class, (repository) -> {
String name = repository.getName();
if (name.startsWith("spring-")) {
result.append(!result.isEmpty() ? "\n" : "");
result.append(mavenRepositoryXml(indent, repository, pluginRepository));
}
});
return result.toString();
private String transformMavenRepositories(String line, boolean pluginRepository) {
return transform(line, (repository, indent) -> mavenRepositoryXml(indent, repository, pluginRepository));
}
private String mavenRepositoryXml(String indent, MavenArtifactRepository repository, boolean pluginRepository) {
@ -105,6 +93,22 @@ public class RepositoryTransformersExtension {
return xml.toString();
}
private String transform(String line, BiFunction<MavenArtifactRepository, String, String> generator) {
StringBuilder result = new StringBuilder();
String indent = getIndent(line);
this.project.getRepositories().withType(MavenArtifactRepository.class, (repository) -> {
String name = repository.getName();
if (name.startsWith("spring-")) {
String fragment = generator.apply(repository, indent);
if (fragment != null) {
result.append(!result.isEmpty() ? "\n" : "");
result.append(fragment);
}
}
});
return result.toString();
}
private String getIndent(String line) {
return line.substring(0, line.length() - line.stripLeading().length());
}

View File

@ -59,6 +59,7 @@ import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.springframework.boot.build.DeployedPlugin;
import org.springframework.boot.build.RepositoryTransformersExtension;
import org.springframework.boot.build.bom.Library.Exclusion;
import org.springframework.boot.build.bom.Library.Group;
import org.springframework.boot.build.bom.Library.LibraryVersion;
@ -132,6 +133,8 @@ public class BomExtension {
public void effectiveBomArtifact() {
Configuration effectiveBomConfiguration = this.project.getConfigurations().create("effectiveBom");
RepositoryTransformersExtension repositoryTransformers = this.project.getExtensions()
.getByType(RepositoryTransformersExtension.class);
this.project.getTasks()
.matching((task) -> task.getName().equals(DeployedPlugin.GENERATE_POM_TASK_NAME))
.all((task) -> {
@ -144,8 +147,10 @@ public class BomExtension {
sync.dependsOn(task);
sync.setDestinationDir(generatedBomDir);
sync.from(((GenerateMavenPom) task).getDestination(), (pom) -> pom.rename((name) -> "pom.xml"));
sync.from(this.project.getResources().getText().fromString(loadSettingsXml()),
(settingsXml) -> settingsXml.rename((name) -> "settings.xml"));
sync.from(this.project.getResources().getText().fromString(loadSettingsXml()), (settingsXml) -> {
settingsXml.rename((name) -> "settings.xml");
settingsXml.filter(repositoryTransformers.mavenSettings());
});
});
File effectiveBom = this.project.getLayout()
.getBuildDirectory()

View File

@ -7,17 +7,7 @@
<activeByDefault>true</activeByDefault>
</activation>
<repositories>
<repository>
<id>spring-snapshot</id>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>spring-milestone</id>
<url>https://repo.spring.io/milestone</url>
</repository>
<!-- {spring.mavenRepositories} -->
</repositories>
</profile>
</profiles>

View File

@ -11,5 +11,6 @@
<!-- {spring.mavenRepositories} -->
</chain>
</resolvers>
<credentials host="${env.COMMERCIAL_RELEASE_REPO_URL}" username="${env.COMMERCIAL_REPO_USERNAME}" passwd="${env.COMMERCIAL_REPO_PASSWORD}"/>
<credentials host="${env.COMMERCIAL_SNAPSHOT_REPO_URL}" username="${env.COMMERCIAL_REPO_USERNAME}" passwd="${env.COMMERCIAL_REPO_PASSWORD}"/>
</ivysettings>

View File

@ -1,6 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<settings>
<localRepository>@localRepositoryPath@</localRepository>
<servers>
<server>
<id>spring-commercial-release</id>
<username>${env.COMMERCIAL_REPO_USERNAME}</username>
<password>${env.COMMERCIAL_REPO_PASSWORD}</password>
</server>
<server>
<id>spring-commercial-snapshot</id>
<username>${env.COMMERCIAL_REPO_USERNAME}</username>
<password>${env.COMMERCIAL_REPO_PASSWORD}</password>
</server>
</servers>
<profiles>
<profile>
<id>it-repo</id>