Merge branch '2.7.x' into 3.0.x
This commit is contained in:
@@ -72,8 +72,9 @@ class AsciidoctorConventions {
|
||||
makeAllWarningsFatal(project);
|
||||
upgradeAsciidoctorJVersion(project);
|
||||
createAsciidoctorExtensionsConfiguration(project);
|
||||
project.getTasks().withType(AbstractAsciidoctorTask.class,
|
||||
(asciidoctorTask) -> configureAsciidoctorTask(project, asciidoctorTask));
|
||||
project.getTasks()
|
||||
.withType(AbstractAsciidoctorTask.class,
|
||||
(asciidoctorTask) -> configureAsciidoctorTask(project, asciidoctorTask));
|
||||
});
|
||||
}
|
||||
|
||||
@@ -87,12 +88,14 @@ class AsciidoctorConventions {
|
||||
|
||||
private void createAsciidoctorExtensionsConfiguration(Project project) {
|
||||
project.getConfigurations().create(EXTENSIONS_CONFIGURATION_NAME, (configuration) -> {
|
||||
project.getConfigurations().matching((candidate) -> "dependencyManagement".equals(candidate.getName()))
|
||||
.all(configuration::extendsFrom);
|
||||
configuration.getDependencies().add(project.getDependencies()
|
||||
project.getConfigurations()
|
||||
.matching((candidate) -> "dependencyManagement".equals(candidate.getName()))
|
||||
.all(configuration::extendsFrom);
|
||||
configuration.getDependencies()
|
||||
.add(project.getDependencies()
|
||||
.create("io.spring.asciidoctor.backends:spring-asciidoctor-backends:0.0.4"));
|
||||
configuration.getDependencies()
|
||||
.add(project.getDependencies().create("org.asciidoctor:asciidoctorj-pdf:1.5.3"));
|
||||
.add(project.getDependencies().create("org.asciidoctor:asciidoctorj-pdf:1.5.3"));
|
||||
});
|
||||
}
|
||||
|
||||
@@ -140,13 +143,15 @@ class AsciidoctorConventions {
|
||||
|
||||
private Sync createSyncDocumentationSourceTask(Project project, AbstractAsciidoctorTask asciidoctorTask) {
|
||||
Sync syncDocumentationSource = project.getTasks()
|
||||
.create("syncDocumentationSourceFor" + StringUtils.capitalize(asciidoctorTask.getName()), Sync.class);
|
||||
.create("syncDocumentationSourceFor" + StringUtils.capitalize(asciidoctorTask.getName()), Sync.class);
|
||||
File syncedSource = new File(project.getBuildDir(), "docs/src/" + asciidoctorTask.getName());
|
||||
syncDocumentationSource.setDestinationDir(syncedSource);
|
||||
syncDocumentationSource.from("src/docs/");
|
||||
asciidoctorTask.dependsOn(syncDocumentationSource);
|
||||
asciidoctorTask.getInputs().dir(syncedSource).withPathSensitivity(PathSensitivity.RELATIVE)
|
||||
.withPropertyName("synced source");
|
||||
asciidoctorTask.getInputs()
|
||||
.dir(syncedSource)
|
||||
.withPathSensitivity(PathSensitivity.RELATIVE)
|
||||
.withPropertyName("synced source");
|
||||
asciidoctorTask.setSourceDir(project.relativePath(new File(syncedSource, "asciidoc/")));
|
||||
return syncDocumentationSource;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2022 the original author or authors.
|
||||
* Copyright 2012-2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -46,12 +46,16 @@ public class DeployedPlugin implements Plugin<Project> {
|
||||
MavenPublication mavenPublication = publishing.getPublications().create("maven", MavenPublication.class);
|
||||
project.afterEvaluate((evaluated) -> project.getPlugins().withType(JavaPlugin.class).all((javaPlugin) -> {
|
||||
if (((Jar) project.getTasks().getByName(JavaPlugin.JAR_TASK_NAME)).isEnabled()) {
|
||||
project.getComponents().matching((component) -> component.getName().equals("java"))
|
||||
.all(mavenPublication::from);
|
||||
project.getComponents()
|
||||
.matching((component) -> component.getName().equals("java"))
|
||||
.all(mavenPublication::from);
|
||||
}
|
||||
}));
|
||||
project.getPlugins().withType(JavaPlatformPlugin.class).all((javaPlugin) -> project.getComponents()
|
||||
.matching((component) -> component.getName().equals("javaPlatform")).all(mavenPublication::from));
|
||||
project.getPlugins()
|
||||
.withType(JavaPlatformPlugin.class)
|
||||
.all((javaPlugin) -> project.getComponents()
|
||||
.matching((component) -> component.getName().equals("javaPlatform"))
|
||||
.all(mavenPublication::from));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -121,16 +121,18 @@ class JavaConventions {
|
||||
}
|
||||
|
||||
private void configureJarManifestConventions(Project project) {
|
||||
ExtractResources extractLegalResources = project.getTasks().create("extractLegalResources",
|
||||
ExtractResources.class);
|
||||
ExtractResources extractLegalResources = project.getTasks()
|
||||
.create("extractLegalResources", ExtractResources.class);
|
||||
extractLegalResources.getDestinationDirectory().set(project.getLayout().getBuildDirectory().dir("legal"));
|
||||
extractLegalResources.setResourcesNames(Arrays.asList("LICENSE.txt", "NOTICE.txt"));
|
||||
extractLegalResources.property("version", project.getVersion().toString());
|
||||
SourceSetContainer sourceSets = project.getExtensions().getByType(SourceSetContainer.class);
|
||||
Set<String> sourceJarTaskNames = sourceSets.stream().map(SourceSet::getSourcesJarTaskName)
|
||||
.collect(Collectors.toSet());
|
||||
Set<String> javadocJarTaskNames = sourceSets.stream().map(SourceSet::getJavadocJarTaskName)
|
||||
.collect(Collectors.toSet());
|
||||
Set<String> sourceJarTaskNames = sourceSets.stream()
|
||||
.map(SourceSet::getSourcesJarTaskName)
|
||||
.collect(Collectors.toSet());
|
||||
Set<String> javadocJarTaskNames = sourceSets.stream()
|
||||
.map(SourceSet::getJavadocJarTaskName)
|
||||
.collect(Collectors.toSet());
|
||||
project.getTasks().withType(Jar.class, (jar) -> project.afterEvaluate((evaluated) -> {
|
||||
jar.metaInf((metaInf) -> metaInf.from(extractLegalResources));
|
||||
jar.manifest((manifest) -> {
|
||||
@@ -167,7 +169,8 @@ class JavaConventions {
|
||||
testRetry.getFailOnPassedAfterRetry().set(true);
|
||||
testRetry.getMaxRetries().set(isCi() ? 3 : 0);
|
||||
});
|
||||
project.getPlugins().withType(JavaPlugin.class, (javaPlugin) -> project.getDependencies()
|
||||
project.getPlugins()
|
||||
.withType(JavaPlugin.class, (javaPlugin) -> project.getDependencies()
|
||||
.add(JavaPlugin.TEST_RUNTIME_ONLY_CONFIGURATION_NAME, "org.junit.platform:junit-platform-launcher"));
|
||||
}
|
||||
|
||||
@@ -220,7 +223,7 @@ class JavaConventions {
|
||||
String version = SpringJavaFormatPlugin.class.getPackage().getImplementationVersion();
|
||||
DependencySet checkstyleDependencies = project.getConfigurations().getByName("checkstyle").getDependencies();
|
||||
checkstyleDependencies
|
||||
.add(project.getDependencies().create("io.spring.javaformat:spring-javaformat-checkstyle:" + version));
|
||||
.add(project.getDependencies().create("io.spring.javaformat:spring-javaformat-checkstyle:" + version));
|
||||
}
|
||||
|
||||
private void configureDependencyManagement(Project project) {
|
||||
@@ -231,14 +234,18 @@ class JavaConventions {
|
||||
configuration.setCanBeResolved(false);
|
||||
});
|
||||
configurations
|
||||
.matching((configuration) -> configuration.getName().endsWith("Classpath")
|
||||
|| JavaPlugin.ANNOTATION_PROCESSOR_CONFIGURATION_NAME.equals(configuration.getName()))
|
||||
.all((configuration) -> configuration.extendsFrom(dependencyManagement));
|
||||
Dependency springBootParent = project.getDependencies().enforcedPlatform(project.getDependencies()
|
||||
.matching((configuration) -> configuration.getName().endsWith("Classpath")
|
||||
|| JavaPlugin.ANNOTATION_PROCESSOR_CONFIGURATION_NAME.equals(configuration.getName()))
|
||||
.all((configuration) -> configuration.extendsFrom(dependencyManagement));
|
||||
Dependency springBootParent = project.getDependencies()
|
||||
.enforcedPlatform(project.getDependencies()
|
||||
.project(Collections.singletonMap("path", ":spring-boot-project:spring-boot-parent")));
|
||||
dependencyManagement.getDependencies().add(springBootParent);
|
||||
project.getPlugins().withType(OptionalDependenciesPlugin.class, (optionalDependencies) -> configurations
|
||||
.getByName(OptionalDependenciesPlugin.OPTIONAL_CONFIGURATION_NAME).extendsFrom(dependencyManagement));
|
||||
project.getPlugins()
|
||||
.withType(OptionalDependenciesPlugin.class,
|
||||
(optionalDependencies) -> configurations
|
||||
.getByName(OptionalDependenciesPlugin.OPTIONAL_CONFIGURATION_NAME)
|
||||
.extendsFrom(dependencyManagement));
|
||||
}
|
||||
|
||||
private void configureToolchain(Project project) {
|
||||
@@ -260,9 +267,9 @@ class JavaConventions {
|
||||
}
|
||||
|
||||
private void createProhibitedDependenciesCheck(Configuration classpath, Project project) {
|
||||
CheckClasspathForProhibitedDependencies checkClasspathForProhibitedDependencies = project.getTasks().create(
|
||||
"check" + StringUtils.capitalize(classpath.getName() + "ForProhibitedDependencies"),
|
||||
CheckClasspathForProhibitedDependencies.class);
|
||||
CheckClasspathForProhibitedDependencies checkClasspathForProhibitedDependencies = project.getTasks()
|
||||
.create("check" + StringUtils.capitalize(classpath.getName() + "ForProhibitedDependencies"),
|
||||
CheckClasspathForProhibitedDependencies.class);
|
||||
checkClasspathForProhibitedDependencies.setClasspath(classpath);
|
||||
project.getTasks().getByName(JavaBasePlugin.CHECK_TASK_NAME).dependsOn(checkClasspathForProhibitedDependencies);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2022 the original author or authors.
|
||||
* Copyright 2012-2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -44,8 +44,9 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile;
|
||||
class KotlinConventions {
|
||||
|
||||
void apply(Project project) {
|
||||
project.getPlugins().withId("org.jetbrains.kotlin.jvm",
|
||||
(plugin) -> project.getTasks().withType(KotlinCompile.class, this::configure));
|
||||
project.getPlugins()
|
||||
.withId("org.jetbrains.kotlin.jvm",
|
||||
(plugin) -> project.getTasks().withType(KotlinCompile.class, this::configure));
|
||||
}
|
||||
|
||||
private void configure(KotlinCompile compile) {
|
||||
|
||||
@@ -67,8 +67,9 @@ class MavenPublishingConventions {
|
||||
mavenRepository.setName("deployment");
|
||||
});
|
||||
}
|
||||
publishing.getPublications().withType(MavenPublication.class)
|
||||
.all((mavenPublication) -> customizeMavenPublication(mavenPublication, project));
|
||||
publishing.getPublications()
|
||||
.withType(MavenPublication.class)
|
||||
.all((mavenPublication) -> customizeMavenPublication(mavenPublication, project));
|
||||
project.getPlugins().withType(JavaPlugin.class).all((javaPlugin) -> {
|
||||
JavaPluginExtension extension = project.getExtensions().getByType(JavaPluginExtension.class);
|
||||
extension.withJavadocJar();
|
||||
@@ -79,8 +80,9 @@ class MavenPublishingConventions {
|
||||
|
||||
private void customizeMavenPublication(MavenPublication publication, Project project) {
|
||||
customizePom(publication.getPom(), project);
|
||||
project.getPlugins().withType(JavaPlugin.class)
|
||||
.all((javaPlugin) -> customizeJavaMavenPublication(publication, project));
|
||||
project.getPlugins()
|
||||
.withType(JavaPlugin.class)
|
||||
.all((javaPlugin) -> customizeJavaMavenPublication(publication, project));
|
||||
suppressMavenOptionalFeatureWarnings(publication);
|
||||
}
|
||||
|
||||
@@ -102,7 +104,7 @@ class MavenPublishingConventions {
|
||||
private void customizeJavaMavenPublication(MavenPublication publication, Project project) {
|
||||
addMavenOptionalFeature(project);
|
||||
publication.versionMapping((strategy) -> strategy.usage(Usage.JAVA_API, (mappingStrategy) -> mappingStrategy
|
||||
.fromResolutionOf(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME)));
|
||||
.fromResolutionOf(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME)));
|
||||
publication.versionMapping(
|
||||
(strategy) -> strategy.usage(Usage.JAVA_RUNTIME, VariantVersionMappingStrategy::fromResolutionResult));
|
||||
}
|
||||
@@ -117,7 +119,7 @@ class MavenPublishingConventions {
|
||||
extension.registerFeature("mavenOptional",
|
||||
(feature) -> feature.usingSourceSet(extension.getSourceSets().getByName("main")));
|
||||
AdhocComponentWithVariants javaComponent = (AdhocComponentWithVariants) project.getComponents()
|
||||
.findByName("java");
|
||||
.findByName("java");
|
||||
javaComponent.addVariantsFromConfiguration(
|
||||
project.getConfigurations().findByName("mavenOptionalRuntimeElements"),
|
||||
ConfigurationVariantDetails::mapToOptional);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2020 the original author or authors.
|
||||
* Copyright 2012-2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -61,36 +61,45 @@ public class MavenRepositoryPlugin implements Plugin<Project> {
|
||||
mavenRepository.setName("project");
|
||||
mavenRepository.setUrl(repositoryLocation.toURI());
|
||||
});
|
||||
project.getTasks().matching((task) -> task.getName().equals(PUBLISH_TO_PROJECT_REPOSITORY_TASK_NAME))
|
||||
.all((task) -> setUpProjectRepository(project, task, repositoryLocation));
|
||||
project.getTasks().matching((task) -> task.getName().equals("publishPluginMavenPublicationToProjectRepository"))
|
||||
.all((task) -> setUpProjectRepository(project, task, repositoryLocation));
|
||||
project.getTasks()
|
||||
.matching((task) -> task.getName().equals(PUBLISH_TO_PROJECT_REPOSITORY_TASK_NAME))
|
||||
.all((task) -> setUpProjectRepository(project, task, repositoryLocation));
|
||||
project.getTasks()
|
||||
.matching((task) -> task.getName().equals("publishPluginMavenPublicationToProjectRepository"))
|
||||
.all((task) -> setUpProjectRepository(project, task, repositoryLocation));
|
||||
}
|
||||
|
||||
private void setUpProjectRepository(Project project, Task publishTask, File repositoryLocation) {
|
||||
publishTask.doFirst(new CleanAction(repositoryLocation));
|
||||
Configuration projectRepository = project.getConfigurations().create(MAVEN_REPOSITORY_CONFIGURATION_NAME);
|
||||
project.getArtifacts().add(projectRepository.getName(), repositoryLocation,
|
||||
(artifact) -> artifact.builtBy(publishTask));
|
||||
project.getArtifacts()
|
||||
.add(projectRepository.getName(), repositoryLocation, (artifact) -> artifact.builtBy(publishTask));
|
||||
DependencySet target = projectRepository.getDependencies();
|
||||
project.getPlugins().withType(JavaPlugin.class).all((javaPlugin) -> addMavenRepositoryDependencies(project,
|
||||
JavaPlugin.IMPLEMENTATION_CONFIGURATION_NAME, target));
|
||||
project.getPlugins().withType(JavaLibraryPlugin.class)
|
||||
.all((javaLibraryPlugin) -> addMavenRepositoryDependencies(project, JavaPlugin.API_CONFIGURATION_NAME,
|
||||
target));
|
||||
project.getPlugins().withType(JavaPlatformPlugin.class)
|
||||
.all((javaPlugin) -> addMavenRepositoryDependencies(project, JavaPlatformPlugin.API_CONFIGURATION_NAME,
|
||||
target));
|
||||
project.getPlugins()
|
||||
.withType(JavaPlugin.class)
|
||||
.all((javaPlugin) -> addMavenRepositoryDependencies(project, JavaPlugin.IMPLEMENTATION_CONFIGURATION_NAME,
|
||||
target));
|
||||
project.getPlugins()
|
||||
.withType(JavaLibraryPlugin.class)
|
||||
.all((javaLibraryPlugin) -> addMavenRepositoryDependencies(project, JavaPlugin.API_CONFIGURATION_NAME,
|
||||
target));
|
||||
project.getPlugins()
|
||||
.withType(JavaPlatformPlugin.class)
|
||||
.all((javaPlugin) -> addMavenRepositoryDependencies(project, JavaPlatformPlugin.API_CONFIGURATION_NAME,
|
||||
target));
|
||||
}
|
||||
|
||||
private void addMavenRepositoryDependencies(Project project, String sourceConfigurationName, DependencySet target) {
|
||||
project.getConfigurations().getByName(sourceConfigurationName).getDependencies()
|
||||
.withType(ProjectDependency.class).all((dependency) -> {
|
||||
Map<String, String> dependencyDescriptor = new HashMap<>();
|
||||
dependencyDescriptor.put("path", dependency.getDependencyProject().getPath());
|
||||
dependencyDescriptor.put("configuration", MAVEN_REPOSITORY_CONFIGURATION_NAME);
|
||||
target.add(project.getDependencies().project(dependencyDescriptor));
|
||||
});
|
||||
project.getConfigurations()
|
||||
.getByName(sourceConfigurationName)
|
||||
.getDependencies()
|
||||
.withType(ProjectDependency.class)
|
||||
.all((dependency) -> {
|
||||
Map<String, String> dependencyDescriptor = new HashMap<>();
|
||||
dependencyDescriptor.put("path", dependency.getDependencyProject().getPath());
|
||||
dependencyDescriptor.put("configuration", MAVEN_REPOSITORY_CONFIGURATION_NAME);
|
||||
target.add(project.getDependencies().project(dependencyDescriptor));
|
||||
});
|
||||
}
|
||||
|
||||
private static final class CleanAction implements Action<Task> {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2021-2021 the original author or authors.
|
||||
* Copyright 2021-2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -44,7 +44,7 @@ public class SyncAppSource extends DefaultTask {
|
||||
this.sourceDirectory = objects.directoryProperty();
|
||||
this.destinationDirectory = objects.directoryProperty();
|
||||
this.pluginVersion = objects.property(String.class)
|
||||
.convention(getProject().provider(() -> getProject().getVersion().toString()));
|
||||
.convention(getProject().provider(() -> getProject().getVersion().toString()));
|
||||
}
|
||||
|
||||
@TaskAction
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2022 the original author or authors.
|
||||
* Copyright 2012-2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -46,14 +46,14 @@ public class ArchitecturePlugin implements Plugin<Project> {
|
||||
JavaPluginExtension javaPluginExtension = project.getExtensions().getByType(JavaPluginExtension.class);
|
||||
List<TaskProvider<PackageTangleCheck>> packageTangleChecks = new ArrayList<>();
|
||||
for (SourceSet sourceSet : javaPluginExtension.getSourceSets()) {
|
||||
TaskProvider<PackageTangleCheck> checkPackageTangles = project.getTasks().register(
|
||||
"checkForPackageTangles" + StringUtils.capitalize(sourceSet.getName()), PackageTangleCheck.class,
|
||||
(task) -> {
|
||||
task.setClasses(sourceSet.getOutput().getClassesDirs());
|
||||
task.setDescription("Checks the classes of the " + sourceSet.getName()
|
||||
+ " source set for package tangles.");
|
||||
task.setGroup(LifecycleBasePlugin.VERIFICATION_GROUP);
|
||||
});
|
||||
TaskProvider<PackageTangleCheck> checkPackageTangles = project.getTasks()
|
||||
.register("checkForPackageTangles" + StringUtils.capitalize(sourceSet.getName()),
|
||||
PackageTangleCheck.class, (task) -> {
|
||||
task.setClasses(sourceSet.getOutput().getClassesDirs());
|
||||
task.setDescription("Checks the classes of the " + sourceSet.getName()
|
||||
+ " source set for package tangles.");
|
||||
task.setGroup(LifecycleBasePlugin.VERIFICATION_GROUP);
|
||||
});
|
||||
packageTangleChecks.add(checkPackageTangles);
|
||||
}
|
||||
if (!packageTangleChecks.isEmpty()) {
|
||||
|
||||
@@ -61,7 +61,7 @@ public abstract class PackageTangleCheck extends DefaultTask {
|
||||
@TaskAction
|
||||
void checkForPackageTangles() throws IOException {
|
||||
JavaClasses javaClasses = new ClassFileImporter()
|
||||
.importPaths(this.classes.getFiles().stream().map(File::toPath).collect(Collectors.toList()));
|
||||
.importPaths(this.classes.getFiles().stream().map(File::toPath).collect(Collectors.toList()));
|
||||
SliceRule freeOfCycles = SlicesRuleDefinition.slices().matching("(**)").should().beFreeOfCycles();
|
||||
EvaluationResult result = freeOfCycles.evaluate(javaClasses);
|
||||
File outputFile = getOutputDirectory().file("failure-report.txt").get().getAsFile();
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2022 the original author or authors.
|
||||
* Copyright 2012-2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -58,14 +58,14 @@ public class AutoConfigurationMetadata extends DefaultTask {
|
||||
|
||||
public AutoConfigurationMetadata() {
|
||||
getInputs()
|
||||
.file((Callable<File>) () -> new File(this.sourceSet.getOutput().getResourcesDir(),
|
||||
"META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports"))
|
||||
.withPathSensitivity(PathSensitivity.RELATIVE)
|
||||
.withPropertyName("org.springframework.boot.autoconfigure.AutoConfiguration");
|
||||
.file((Callable<File>) () -> new File(this.sourceSet.getOutput().getResourcesDir(),
|
||||
"META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports"))
|
||||
.withPathSensitivity(PathSensitivity.RELATIVE)
|
||||
.withPropertyName("org.springframework.boot.autoconfigure.AutoConfiguration");
|
||||
|
||||
dependsOn((Callable<String>) () -> this.sourceSet.getProcessResourcesTaskName());
|
||||
getProject().getConfigurations()
|
||||
.maybeCreate(AutoConfigurationPlugin.AUTO_CONFIGURATION_METADATA_CONFIGURATION_NAME);
|
||||
.maybeCreate(AutoConfigurationPlugin.AUTO_CONFIGURATION_METADATA_CONFIGURATION_NAME);
|
||||
}
|
||||
|
||||
public void setSourceSet(SourceSet sourceSet) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2022 the original author or authors.
|
||||
* Copyright 2012-2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -58,21 +58,27 @@ public class AutoConfigurationPlugin implements Plugin<Project> {
|
||||
project.getPlugins().withType(JavaPlugin.class, (javaPlugin) -> {
|
||||
project.getPlugins().apply(ConfigurationPropertiesPlugin.class);
|
||||
Configuration annotationProcessors = project.getConfigurations()
|
||||
.getByName(JavaPlugin.ANNOTATION_PROCESSOR_CONFIGURATION_NAME);
|
||||
.getByName(JavaPlugin.ANNOTATION_PROCESSOR_CONFIGURATION_NAME);
|
||||
annotationProcessors.getDependencies()
|
||||
.add(project.getDependencies().project(Collections.singletonMap("path",
|
||||
.add(project.getDependencies()
|
||||
.project(Collections.singletonMap("path",
|
||||
":spring-boot-project:spring-boot-tools:spring-boot-autoconfigure-processor")));
|
||||
annotationProcessors.getDependencies()
|
||||
.add(project.getDependencies().project(Collections.singletonMap("path",
|
||||
.add(project.getDependencies()
|
||||
.project(Collections.singletonMap("path",
|
||||
":spring-boot-project:spring-boot-tools:spring-boot-configuration-processor")));
|
||||
project.getTasks().create("autoConfigurationMetadata", AutoConfigurationMetadata.class, (task) -> {
|
||||
SourceSet main = project.getExtensions().getByType(JavaPluginExtension.class).getSourceSets()
|
||||
.getByName(SourceSet.MAIN_SOURCE_SET_NAME);
|
||||
SourceSet main = project.getExtensions()
|
||||
.getByType(JavaPluginExtension.class)
|
||||
.getSourceSets()
|
||||
.getByName(SourceSet.MAIN_SOURCE_SET_NAME);
|
||||
task.setSourceSet(main);
|
||||
task.dependsOn(main.getClassesTaskName());
|
||||
task.setOutputFile(new File(project.getBuildDir(), "auto-configuration-metadata.properties"));
|
||||
project.getArtifacts().add(AutoConfigurationPlugin.AUTO_CONFIGURATION_METADATA_CONFIGURATION_NAME,
|
||||
project.provider((Callable<File>) task::getOutputFile), (artifact) -> artifact.builtBy(task));
|
||||
project.getArtifacts()
|
||||
.add(AutoConfigurationPlugin.AUTO_CONFIGURATION_METADATA_CONFIGURATION_NAME,
|
||||
project.provider((Callable<File>) task::getOutputFile),
|
||||
(artifact) -> artifact.builtBy(task));
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@@ -125,39 +125,41 @@ public class BomExtension {
|
||||
|
||||
public void effectiveBomArtifact() {
|
||||
Configuration effectiveBomConfiguration = this.project.getConfigurations().create("effectiveBom");
|
||||
this.project.getTasks().matching((task) -> task.getName().equals(DeployedPlugin.GENERATE_POM_TASK_NAME))
|
||||
.all((task) -> {
|
||||
Sync syncBom = this.project.getTasks().create("syncBom", Sync.class);
|
||||
syncBom.dependsOn(task);
|
||||
File generatedBomDir = new File(this.project.getBuildDir(), "generated/bom");
|
||||
syncBom.setDestinationDir(generatedBomDir);
|
||||
syncBom.from(((GenerateMavenPom) task).getDestination(), (pom) -> pom.rename((name) -> "pom.xml"));
|
||||
try {
|
||||
String settingsXmlContent = FileCopyUtils
|
||||
.copyToString(new InputStreamReader(
|
||||
getClass().getClassLoader().getResourceAsStream("effective-bom-settings.xml"),
|
||||
StandardCharsets.UTF_8))
|
||||
.replace("localRepositoryPath",
|
||||
new File(this.project.getBuildDir(), "local-m2-repository").getAbsolutePath());
|
||||
syncBom.from(this.project.getResources().getText().fromString(settingsXmlContent),
|
||||
(settingsXml) -> settingsXml.rename((name) -> "settings.xml"));
|
||||
}
|
||||
catch (IOException ex) {
|
||||
throw new GradleException("Failed to prepare settings.xml", ex);
|
||||
}
|
||||
MavenExec generateEffectiveBom = this.project.getTasks().create("generateEffectiveBom",
|
||||
MavenExec.class);
|
||||
generateEffectiveBom.setProjectDir(generatedBomDir);
|
||||
File effectiveBom = new File(this.project.getBuildDir(),
|
||||
"generated/effective-bom/" + this.project.getName() + "-effective-bom.xml");
|
||||
generateEffectiveBom.args("--settings", "settings.xml", "help:effective-pom",
|
||||
"-Doutput=" + effectiveBom);
|
||||
generateEffectiveBom.dependsOn(syncBom);
|
||||
generateEffectiveBom.getOutputs().file(effectiveBom);
|
||||
generateEffectiveBom.doLast(new StripUnrepeatableOutputAction(effectiveBom));
|
||||
this.project.getArtifacts().add(effectiveBomConfiguration.getName(), effectiveBom,
|
||||
this.project.getTasks()
|
||||
.matching((task) -> task.getName().equals(DeployedPlugin.GENERATE_POM_TASK_NAME))
|
||||
.all((task) -> {
|
||||
Sync syncBom = this.project.getTasks().create("syncBom", Sync.class);
|
||||
syncBom.dependsOn(task);
|
||||
File generatedBomDir = new File(this.project.getBuildDir(), "generated/bom");
|
||||
syncBom.setDestinationDir(generatedBomDir);
|
||||
syncBom.from(((GenerateMavenPom) task).getDestination(), (pom) -> pom.rename((name) -> "pom.xml"));
|
||||
try {
|
||||
String settingsXmlContent = FileCopyUtils
|
||||
.copyToString(new InputStreamReader(
|
||||
getClass().getClassLoader().getResourceAsStream("effective-bom-settings.xml"),
|
||||
StandardCharsets.UTF_8))
|
||||
.replace("localRepositoryPath",
|
||||
new File(this.project.getBuildDir(), "local-m2-repository").getAbsolutePath());
|
||||
syncBom.from(this.project.getResources().getText().fromString(settingsXmlContent),
|
||||
(settingsXml) -> settingsXml.rename((name) -> "settings.xml"));
|
||||
}
|
||||
catch (IOException ex) {
|
||||
throw new GradleException("Failed to prepare settings.xml", ex);
|
||||
}
|
||||
MavenExec generateEffectiveBom = this.project.getTasks()
|
||||
.create("generateEffectiveBom", MavenExec.class);
|
||||
generateEffectiveBom.setProjectDir(generatedBomDir);
|
||||
File effectiveBom = new File(this.project.getBuildDir(),
|
||||
"generated/effective-bom/" + this.project.getName() + "-effective-bom.xml");
|
||||
generateEffectiveBom.args("--settings", "settings.xml", "help:effective-pom",
|
||||
"-Doutput=" + effectiveBom);
|
||||
generateEffectiveBom.dependsOn(syncBom);
|
||||
generateEffectiveBom.getOutputs().file(effectiveBom);
|
||||
generateEffectiveBom.doLast(new StripUnrepeatableOutputAction(effectiveBom));
|
||||
this.project.getArtifacts()
|
||||
.add(effectiveBomConfiguration.getName(), effectiveBom,
|
||||
(artifact) -> artifact.builtBy(generateEffectiveBom));
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
private String createDependencyNotation(String groupId, String artifactId, DependencyVersion version) {
|
||||
@@ -196,8 +198,9 @@ public class BomExtension {
|
||||
for (Group group : library.getGroups()) {
|
||||
for (Module module : group.getModules()) {
|
||||
putArtifactVersionProperty(group.getId(), module.getName(), module.getClassifier(), versionProperty);
|
||||
this.dependencyHandler.getConstraints().add(JavaPlatformPlugin.API_CONFIGURATION_NAME,
|
||||
createDependencyNotation(group.getId(), module.getName(), library.getVersion().getVersion()));
|
||||
this.dependencyHandler.getConstraints()
|
||||
.add(JavaPlatformPlugin.API_CONFIGURATION_NAME, createDependencyNotation(group.getId(),
|
||||
module.getName(), library.getVersion().getVersion()));
|
||||
}
|
||||
for (String bomImport : group.getBoms()) {
|
||||
putArtifactVersionProperty(group.getId(), bomImport, versionProperty);
|
||||
@@ -242,7 +245,7 @@ public class BomExtension {
|
||||
GroupHandler groupHandler = new GroupHandler(id);
|
||||
action.execute(groupHandler);
|
||||
this.groups
|
||||
.add(new Group(groupHandler.id, groupHandler.modules, groupHandler.plugins, groupHandler.imports));
|
||||
.add(new Group(groupHandler.id, groupHandler.modules, groupHandler.plugins, groupHandler.imports));
|
||||
}
|
||||
|
||||
public void prohibit(Action<ProhibitedHandler> action) {
|
||||
@@ -254,7 +257,7 @@ public class BomExtension {
|
||||
|
||||
public void dependencyVersions(Action<DependencyVersionsHandler> action) {
|
||||
DependencyVersionsHandler dependencyVersionsHandler = this.objectFactory
|
||||
.newInstance(DependencyVersionsHandler.class, this.version);
|
||||
.newInstance(DependencyVersionsHandler.class, this.version);
|
||||
action.execute(dependencyVersionsHandler);
|
||||
this.dependencyVersions = dependencyVersionsHandler.dependencyVersions;
|
||||
}
|
||||
@@ -336,8 +339,8 @@ public class BomExtension {
|
||||
|
||||
public void setModules(List<Object> modules) {
|
||||
this.modules = modules.stream()
|
||||
.map((input) -> (input instanceof Module module) ? module : new Module((String) input))
|
||||
.toList();
|
||||
.map((input) -> (input instanceof Module module) ? module : new Module((String) input))
|
||||
.toList();
|
||||
}
|
||||
|
||||
public void setImports(List<String> imports) {
|
||||
@@ -530,8 +533,9 @@ public class BomExtension {
|
||||
org.w3c.dom.Node reporting = (org.w3c.dom.Node) xpath.evaluate("/project/reporting", document,
|
||||
XPathConstants.NODE);
|
||||
reporting.getParentNode().removeChild(reporting);
|
||||
TransformerFactory.newInstance().newTransformer().transform(new DOMSource(document),
|
||||
new StreamResult(this.effectiveBom));
|
||||
TransformerFactory.newInstance()
|
||||
.newTransformer()
|
||||
.transform(new DOMSource(document), new StreamResult(this.effectiveBom));
|
||||
}
|
||||
catch (Exception ex) {
|
||||
throw new TaskExecutionException(task, ex);
|
||||
|
||||
@@ -60,8 +60,8 @@ public class BomPlugin implements Plugin<Project> {
|
||||
JavaPlatformExtension javaPlatform = project.getExtensions().getByType(JavaPlatformExtension.class);
|
||||
javaPlatform.allowDependencies();
|
||||
createApiEnforcedConfiguration(project);
|
||||
BomExtension bom = project.getExtensions().create("bom", BomExtension.class, project.getDependencies(),
|
||||
project);
|
||||
BomExtension bom = project.getExtensions()
|
||||
.create("bom", BomExtension.class, project.getDependencies(), project);
|
||||
project.getTasks().create("bomrCheck", CheckBom.class, bom);
|
||||
project.getTasks().create("bomrUpgrade", UpgradeBom.class, bom);
|
||||
project.getTasks().create("moveToSnapshots", MoveToSnapshots.class, bom);
|
||||
@@ -70,16 +70,18 @@ public class BomPlugin implements Plugin<Project> {
|
||||
}
|
||||
|
||||
private void createApiEnforcedConfiguration(Project project) {
|
||||
Configuration apiEnforced = project.getConfigurations().create(API_ENFORCED_CONFIGURATION_NAME,
|
||||
(configuration) -> {
|
||||
configuration.setCanBeConsumed(false);
|
||||
configuration.setCanBeResolved(false);
|
||||
configuration.setVisible(false);
|
||||
});
|
||||
project.getConfigurations().getByName(JavaPlatformPlugin.ENFORCED_API_ELEMENTS_CONFIGURATION_NAME)
|
||||
.extendsFrom(apiEnforced);
|
||||
project.getConfigurations().getByName(JavaPlatformPlugin.ENFORCED_RUNTIME_ELEMENTS_CONFIGURATION_NAME)
|
||||
.extendsFrom(apiEnforced);
|
||||
Configuration apiEnforced = project.getConfigurations()
|
||||
.create(API_ENFORCED_CONFIGURATION_NAME, (configuration) -> {
|
||||
configuration.setCanBeConsumed(false);
|
||||
configuration.setCanBeResolved(false);
|
||||
configuration.setVisible(false);
|
||||
});
|
||||
project.getConfigurations()
|
||||
.getByName(JavaPlatformPlugin.ENFORCED_API_ELEMENTS_CONFIGURATION_NAME)
|
||||
.extendsFrom(apiEnforced);
|
||||
project.getConfigurations()
|
||||
.getByName(JavaPlatformPlugin.ENFORCED_RUNTIME_ELEMENTS_CONFIGURATION_NAME)
|
||||
.extendsFrom(apiEnforced);
|
||||
}
|
||||
|
||||
private static final class PublishingCustomizer {
|
||||
@@ -155,16 +157,19 @@ public class BomPlugin implements Plugin<Project> {
|
||||
for (Node dependency : findChildren(dependencies, "dependency")) {
|
||||
String groupId = findChild(dependency, "groupId").text();
|
||||
String artifactId = findChild(dependency, "artifactId").text();
|
||||
this.bom.getLibraries().stream().flatMap((library) -> library.getGroups().stream())
|
||||
.filter((group) -> group.getId().equals(groupId))
|
||||
.flatMap((group) -> group.getModules().stream())
|
||||
.filter((module) -> module.getName().equals(artifactId))
|
||||
.flatMap((module) -> module.getExclusions().stream()).forEach((exclusion) -> {
|
||||
Node exclusions = findOrCreateNode(dependency, "exclusions");
|
||||
Node node = new Node(exclusions, "exclusion");
|
||||
node.appendNode("groupId", exclusion.getGroupId());
|
||||
node.appendNode("artifactId", exclusion.getArtifactId());
|
||||
});
|
||||
this.bom.getLibraries()
|
||||
.stream()
|
||||
.flatMap((library) -> library.getGroups().stream())
|
||||
.filter((group) -> group.getId().equals(groupId))
|
||||
.flatMap((group) -> group.getModules().stream())
|
||||
.filter((module) -> module.getName().equals(artifactId))
|
||||
.flatMap((module) -> module.getExclusions().stream())
|
||||
.forEach((exclusion) -> {
|
||||
Node exclusions = findOrCreateNode(dependency, "exclusions");
|
||||
Node node = new Node(exclusions, "exclusion");
|
||||
node.appendNode("groupId", exclusion.getGroupId());
|
||||
node.appendNode("artifactId", exclusion.getArtifactId());
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -175,12 +180,15 @@ public class BomPlugin implements Plugin<Project> {
|
||||
for (Node dependency : findChildren(dependencies, "dependency")) {
|
||||
String groupId = findChild(dependency, "groupId").text();
|
||||
String artifactId = findChild(dependency, "artifactId").text();
|
||||
Set<String> types = this.bom.getLibraries().stream()
|
||||
.flatMap((library) -> library.getGroups().stream())
|
||||
.filter((group) -> group.getId().equals(groupId))
|
||||
.flatMap((group) -> group.getModules().stream())
|
||||
.filter((module) -> module.getName().equals(artifactId)).map(Module::getType)
|
||||
.filter(Objects::nonNull).collect(Collectors.toSet());
|
||||
Set<String> types = this.bom.getLibraries()
|
||||
.stream()
|
||||
.flatMap((library) -> library.getGroups().stream())
|
||||
.filter((group) -> group.getId().equals(groupId))
|
||||
.flatMap((group) -> group.getModules().stream())
|
||||
.filter((module) -> module.getName().equals(artifactId))
|
||||
.map(Module::getType)
|
||||
.filter(Objects::nonNull)
|
||||
.collect(Collectors.toSet());
|
||||
if (types.size() > 1) {
|
||||
throw new IllegalStateException(
|
||||
"Multiple types for " + groupId + ":" + artifactId + ": " + types);
|
||||
@@ -201,12 +209,15 @@ public class BomPlugin implements Plugin<Project> {
|
||||
String groupId = findChild(dependency, "groupId").text();
|
||||
String artifactId = findChild(dependency, "artifactId").text();
|
||||
String version = findChild(dependency, "version").text();
|
||||
Set<String> classifiers = this.bom.getLibraries().stream()
|
||||
.flatMap((library) -> library.getGroups().stream())
|
||||
.filter((group) -> group.getId().equals(groupId))
|
||||
.flatMap((group) -> group.getModules().stream())
|
||||
.filter((module) -> module.getName().equals(artifactId)).map(Module::getClassifier)
|
||||
.filter(Objects::nonNull).collect(Collectors.toSet());
|
||||
Set<String> classifiers = this.bom.getLibraries()
|
||||
.stream()
|
||||
.flatMap((library) -> library.getGroups().stream())
|
||||
.filter((group) -> group.getId().equals(groupId))
|
||||
.flatMap((group) -> group.getModules().stream())
|
||||
.filter((module) -> module.getName().equals(artifactId))
|
||||
.map(Module::getClassifier)
|
||||
.filter(Objects::nonNull)
|
||||
.collect(Collectors.toSet());
|
||||
Node target = dependency;
|
||||
for (String classifier : classifiers) {
|
||||
if (classifier.length() > 0) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2021 the original author or authors.
|
||||
* Copyright 2012-2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -59,14 +59,18 @@ public class CheckBom extends DefaultTask {
|
||||
|
||||
private void checkExclusions(String groupId, Module module, DependencyVersion version) {
|
||||
Set<String> resolved = getProject().getConfigurations()
|
||||
.detachedConfiguration(
|
||||
getProject().getDependencies().create(groupId + ":" + module.getName() + ":" + version))
|
||||
.getResolvedConfiguration().getResolvedArtifacts().stream()
|
||||
.map((artifact) -> artifact.getModuleVersion().getId())
|
||||
.map((id) -> id.getGroup() + ":" + id.getModule().getName()).collect(Collectors.toSet());
|
||||
Set<String> exclusions = module.getExclusions().stream()
|
||||
.map((exclusion) -> exclusion.getGroupId() + ":" + exclusion.getArtifactId())
|
||||
.collect(Collectors.toSet());
|
||||
.detachedConfiguration(
|
||||
getProject().getDependencies().create(groupId + ":" + module.getName() + ":" + version))
|
||||
.getResolvedConfiguration()
|
||||
.getResolvedArtifacts()
|
||||
.stream()
|
||||
.map((artifact) -> artifact.getModuleVersion().getId())
|
||||
.map((id) -> id.getGroup() + ":" + id.getModule().getName())
|
||||
.collect(Collectors.toSet());
|
||||
Set<String> exclusions = module.getExclusions()
|
||||
.stream()
|
||||
.map((exclusion) -> exclusion.getGroupId() + ":" + exclusion.getArtifactId())
|
||||
.collect(Collectors.toSet());
|
||||
Set<String> unused = new TreeSet<>();
|
||||
for (String exclusion : exclusions) {
|
||||
if (!resolved.contains(exclusion)) {
|
||||
|
||||
@@ -322,7 +322,7 @@ public class Library {
|
||||
if (!line.startsWith("#")) {
|
||||
String[] components = line.split(":");
|
||||
Map<String, String> groupDependencies = this.dependencyVersions
|
||||
.computeIfAbsent(components[0], (key) -> new HashMap<>());
|
||||
.computeIfAbsent(components[0], (key) -> new HashMap<>());
|
||||
groupDependencies.put(components[1], components[2]);
|
||||
}
|
||||
}
|
||||
@@ -372,7 +372,7 @@ public class Library {
|
||||
Matcher matcher = CONSTRAINT_PATTERN.matcher(line.trim());
|
||||
if (matcher.matches()) {
|
||||
Map<String, String> groupDependencies = this.dependencyVersions
|
||||
.computeIfAbsent(matcher.group(1), (key) -> new HashMap<>());
|
||||
.computeIfAbsent(matcher.group(1), (key) -> new HashMap<>());
|
||||
groupDependencies.put(matcher.group(2), matcher.group(3));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -50,7 +50,7 @@ public final class InteractiveUpgradeResolver implements UpgradeResolver {
|
||||
librariesByName.put(library.getName(), library);
|
||||
}
|
||||
List<LibraryWithVersionOptions> libraryUpdates = this.libraryUpdateResolver
|
||||
.findLibraryUpdates(librariesToUpgrade, librariesByName);
|
||||
.findLibraryUpdates(librariesToUpgrade, librariesByName);
|
||||
return libraryUpdates.stream().map(this::resolveUpgrade).filter(Objects::nonNull).toList();
|
||||
}
|
||||
|
||||
|
||||
@@ -75,10 +75,12 @@ final class MavenMetadataVersionResolver implements VersionResolver {
|
||||
URI url = repositoryUrl.resolve(groupId.replace('.', '/') + "/" + artifactId + "/maven-metadata.xml");
|
||||
try {
|
||||
String metadata = this.rest.getForObject(url, String.class);
|
||||
Document metadataDocument = DocumentBuilderFactory.newInstance().newDocumentBuilder()
|
||||
.parse(new InputSource(new StringReader(metadata)));
|
||||
NodeList versionNodes = (NodeList) XPathFactory.newInstance().newXPath()
|
||||
.evaluate("/metadata/versioning/versions/version", metadataDocument, XPathConstants.NODESET);
|
||||
Document metadataDocument = DocumentBuilderFactory.newInstance()
|
||||
.newDocumentBuilder()
|
||||
.parse(new InputSource(new StringReader(metadata)));
|
||||
NodeList versionNodes = (NodeList) XPathFactory.newInstance()
|
||||
.newXPath()
|
||||
.evaluate("/metadata/versioning/versions/version", metadataDocument, XPathConstants.NODESET);
|
||||
for (int i = 0; i < versionNodes.getLength(); i++) {
|
||||
versions.add(versionNodes.item(i).getTextContent());
|
||||
}
|
||||
|
||||
@@ -106,14 +106,19 @@ class StandardLibraryUpdateResolver implements LibraryUpdateResolver {
|
||||
getLaterVersionsForModule(group.getId(), plugin, libraryVersion));
|
||||
}
|
||||
}
|
||||
List<DependencyVersion> allVersions = moduleVersions.values().stream().flatMap(SortedSet::stream).distinct()
|
||||
.filter((dependencyVersion) -> isPermitted(dependencyVersion, library.getProhibitedVersions()))
|
||||
.collect(Collectors.toList());
|
||||
List<DependencyVersion> allVersions = moduleVersions.values()
|
||||
.stream()
|
||||
.flatMap(SortedSet::stream)
|
||||
.distinct()
|
||||
.filter((dependencyVersion) -> isPermitted(dependencyVersion, library.getProhibitedVersions()))
|
||||
.collect(Collectors.toList());
|
||||
if (allVersions.isEmpty()) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
return allVersions.stream().map((version) -> new VersionOption.ResolvedVersionOption(version,
|
||||
getMissingModules(moduleVersions, version))).collect(Collectors.toList());
|
||||
return allVersions.stream()
|
||||
.map((version) -> new VersionOption.ResolvedVersionOption(version,
|
||||
getMissingModules(moduleVersions, version)))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private List<VersionOption> determineAlignedVersionOption(Library library, Map<String, Library> libraries) {
|
||||
@@ -165,7 +170,7 @@ class StandardLibraryUpdateResolver implements LibraryUpdateResolver {
|
||||
for (ProhibitedVersion prohibitedVersion : prohibitedVersions) {
|
||||
String dependencyVersionToString = dependencyVersion.toString();
|
||||
if (prohibitedVersion.getRange() != null && prohibitedVersion.getRange()
|
||||
.containsVersion(new DefaultArtifactVersion(dependencyVersionToString))) {
|
||||
.containsVersion(new DefaultArtifactVersion(dependencyVersionToString))) {
|
||||
return false;
|
||||
}
|
||||
for (String startsWith : prohibitedVersion.getStartsWith()) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2022 the original author or authors.
|
||||
* Copyright 2012-2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -43,12 +43,12 @@ class UpgradeApplicator {
|
||||
Path apply(Upgrade upgrade) throws IOException {
|
||||
String buildFileContents = Files.readString(this.buildFile);
|
||||
Matcher matcher = Pattern.compile("library\\(\"" + upgrade.getLibrary().getName() + "\", \"(.+)\"\\)")
|
||||
.matcher(buildFileContents);
|
||||
.matcher(buildFileContents);
|
||||
if (!matcher.find()) {
|
||||
matcher = Pattern
|
||||
.compile("library\\(\"" + upgrade.getLibrary().getName() + "\"\\) \\{\\s+version\\(\"(.+)\"\\)",
|
||||
Pattern.MULTILINE)
|
||||
.matcher(buildFileContents);
|
||||
.compile("library\\(\"" + upgrade.getLibrary().getName() + "\"\\) \\{\\s+version\\(\"(.+)\"\\)",
|
||||
Pattern.MULTILINE)
|
||||
.matcher(buildFileContents);
|
||||
if (!matcher.find()) {
|
||||
throw new IllegalStateException("Failed to find definition for library '"
|
||||
+ upgrade.getLibrary().getName() + "' in bom '" + this.buildFile + "'");
|
||||
|
||||
@@ -129,12 +129,14 @@ public abstract class UpgradeDependencies extends DefaultTask {
|
||||
existingUpgradeIssue.label(Arrays.asList("type: task", "status: superseded"));
|
||||
}
|
||||
}
|
||||
if (new ProcessBuilder().command("git", "add", modified.toFile().getAbsolutePath()).start()
|
||||
.waitFor() != 0) {
|
||||
if (new ProcessBuilder().command("git", "add", modified.toFile().getAbsolutePath())
|
||||
.start()
|
||||
.waitFor() != 0) {
|
||||
throw new IllegalStateException("git add failed");
|
||||
}
|
||||
if (new ProcessBuilder().command("git", "commit", "-m", commitMessage(upgrade, issueNumber)).start()
|
||||
.waitFor() != 0) {
|
||||
if (new ProcessBuilder().command("git", "commit", "-m", commitMessage(upgrade, issueNumber))
|
||||
.start()
|
||||
.waitFor() != 0) {
|
||||
throw new IllegalStateException("git commit failed");
|
||||
}
|
||||
}
|
||||
@@ -175,7 +177,8 @@ public abstract class UpgradeDependencies extends DefaultTask {
|
||||
private Milestone determineMilestone(GitHubRepository repository) {
|
||||
List<Milestone> milestones = repository.getMilestones();
|
||||
java.util.Optional<Milestone> matchingMilestone = milestones.stream()
|
||||
.filter((milestone) -> milestone.getName().equals(getMilestone().get())).findFirst();
|
||||
.filter((milestone) -> milestone.getName().equals(getMilestone().get()))
|
||||
.findFirst();
|
||||
if (!matchingMilestone.isPresent()) {
|
||||
throw new InvalidUserDataException("Unknown milestone: " + getMilestone().get());
|
||||
}
|
||||
@@ -185,8 +188,9 @@ public abstract class UpgradeDependencies extends DefaultTask {
|
||||
private Issue findExistingUpgradeIssue(List<Issue> existingUpgradeIssues, Upgrade upgrade) {
|
||||
String toMatch = "Upgrade to " + upgrade.getLibrary().getName();
|
||||
for (Issue existingUpgradeIssue : existingUpgradeIssues) {
|
||||
if (existingUpgradeIssue.getTitle().substring(0, existingUpgradeIssue.getTitle().lastIndexOf(' '))
|
||||
.equals(toMatch)) {
|
||||
if (existingUpgradeIssue.getTitle()
|
||||
.substring(0, existingUpgradeIssue.getTitle().lastIndexOf(' '))
|
||||
.equals(toMatch)) {
|
||||
return existingUpgradeIssue;
|
||||
}
|
||||
}
|
||||
@@ -197,8 +201,8 @@ public abstract class UpgradeDependencies extends DefaultTask {
|
||||
private List<Upgrade> resolveUpgrades() {
|
||||
List<Upgrade> upgrades = new InteractiveUpgradeResolver(getServices().get(UserInputHandler.class),
|
||||
new MultithreadedLibraryUpdateResolver(new MavenMetadataVersionResolver(getRepositoryUris().get()),
|
||||
this.bom.getUpgrade().getPolicy(), getThreads().get())).resolveUpgrades(
|
||||
matchingLibraries(getLibraries().getOrNull()), this.bom.getLibraries());
|
||||
this.bom.getUpgrade().getPolicy(), getThreads().get()))
|
||||
.resolveUpgrades(matchingLibraries(getLibraries().getOrNull()), this.bom.getLibraries());
|
||||
return upgrades;
|
||||
}
|
||||
|
||||
@@ -207,8 +211,10 @@ public abstract class UpgradeDependencies extends DefaultTask {
|
||||
return this.bom.getLibraries();
|
||||
}
|
||||
Predicate<String> libraryPredicate = Pattern.compile(pattern).asPredicate();
|
||||
List<Library> matchingLibraries = this.bom.getLibraries().stream()
|
||||
.filter((library) -> libraryPredicate.test(library.getName())).toList();
|
||||
List<Library> matchingLibraries = this.bom.getLibraries()
|
||||
.stream()
|
||||
.filter((library) -> libraryPredicate.test(library.getName()))
|
||||
.toList();
|
||||
if (matchingLibraries.isEmpty()) {
|
||||
throw new InvalidUserDataException("No libraries matched '" + pattern + "'");
|
||||
}
|
||||
|
||||
@@ -49,7 +49,8 @@ final class StandardGitHub implements GitHub {
|
||||
Collections.singletonList(new MappingJackson2HttpMessageConverter(new ObjectMapper())));
|
||||
restTemplate.getInterceptors().add((request, body, execution) -> {
|
||||
request.getHeaders().add("User-Agent", StandardGitHub.this.username);
|
||||
request.getHeaders().add("Authorization", "Basic " + Base64.getEncoder()
|
||||
request.getHeaders()
|
||||
.add("Authorization", "Basic " + Base64.getEncoder()
|
||||
.encodeToString((StandardGitHub.this.username + ":" + StandardGitHub.this.password).getBytes()));
|
||||
request.getHeaders().add("Accept", MediaType.APPLICATION_JSON_VALUE);
|
||||
return execution.execute(request, body);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2022 the original author or authors.
|
||||
* Copyright 2012-2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -70,8 +70,8 @@ public class CheckClasspathForConflicts extends DefaultTask {
|
||||
if (file.isDirectory()) {
|
||||
Path root = file.toPath();
|
||||
try (Stream<Path> pathStream = Files.walk(root)) {
|
||||
pathStream.filter(Files::isRegularFile).forEach(
|
||||
(entry) -> classpathContents.add(root.relativize(entry).toString(), root.toString()));
|
||||
pathStream.filter(Files::isRegularFile)
|
||||
.forEach((entry) -> classpathContents.add(root.relativize(entry).toString(), root.toString()));
|
||||
}
|
||||
}
|
||||
else {
|
||||
@@ -111,9 +111,11 @@ public class CheckClasspathForConflicts extends DefaultTask {
|
||||
}
|
||||
|
||||
private Map<String, List<String>> getConflicts(List<Predicate<String>> ignores) {
|
||||
return this.classpathContents.entrySet().stream().filter((entry) -> entry.getValue().size() > 1)
|
||||
.filter((entry) -> canConflict(entry.getKey(), ignores))
|
||||
.collect(Collectors.toMap(Entry::getKey, Entry::getValue, (v1, v2) -> v1, TreeMap::new));
|
||||
return this.classpathContents.entrySet()
|
||||
.stream()
|
||||
.filter((entry) -> entry.getValue().size() > 1)
|
||||
.filter((entry) -> canConflict(entry.getKey(), ignores))
|
||||
.collect(Collectors.toMap(Entry::getKey, Entry::getValue, (v1, v2) -> v1, TreeMap::new));
|
||||
}
|
||||
|
||||
private boolean canConflict(String name, List<Predicate<String>> ignores) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2022 the original author or authors.
|
||||
* Copyright 2012-2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -52,9 +52,13 @@ public class CheckClasspathForProhibitedDependencies extends DefaultTask {
|
||||
|
||||
@TaskAction
|
||||
public void checkForProhibitedDependencies() {
|
||||
TreeSet<String> prohibited = this.classpath.getResolvedConfiguration().getResolvedArtifacts().stream()
|
||||
.map((artifact) -> artifact.getModuleVersion().getId()).filter(this::prohibited)
|
||||
.map((id) -> id.getGroup() + ":" + id.getName()).collect(Collectors.toCollection(TreeSet::new));
|
||||
TreeSet<String> prohibited = this.classpath.getResolvedConfiguration()
|
||||
.getResolvedArtifacts()
|
||||
.stream()
|
||||
.map((artifact) -> artifact.getModuleVersion().getId())
|
||||
.filter(this::prohibited)
|
||||
.map((id) -> id.getGroup() + ":" + id.getName())
|
||||
.collect(Collectors.toCollection(TreeSet::new));
|
||||
if (!prohibited.isEmpty()) {
|
||||
StringBuilder message = new StringBuilder(String.format("Found prohibited dependencies:%n"));
|
||||
for (String dependency : prohibited) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2022 the original author or authors.
|
||||
* Copyright 2012-2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -67,8 +67,8 @@ public class CheckClasspathForUnnecessaryExclusions extends DefaultTask {
|
||||
ConfigurationContainer configurations) {
|
||||
this.dependencyHandler = getProject().getDependencies();
|
||||
this.configurations = getProject().getConfigurations();
|
||||
this.platform = this.dependencyHandler.create(
|
||||
this.dependencyHandler.platform(this.dependencyHandler.project(SPRING_BOOT_DEPENDENCIES_PROJECT)));
|
||||
this.platform = this.dependencyHandler
|
||||
.create(this.dependencyHandler.platform(this.dependencyHandler.project(SPRING_BOOT_DEPENDENCIES_PROJECT)));
|
||||
getOutputs().upToDateWhen((task) -> true);
|
||||
}
|
||||
|
||||
@@ -86,8 +86,10 @@ public class CheckClasspathForUnnecessaryExclusions extends DefaultTask {
|
||||
|
||||
private void processDependency(ModuleDependency dependency) {
|
||||
String dependencyId = getId(dependency);
|
||||
TreeSet<String> exclusions = dependency.getExcludeRules().stream().map(this::getId)
|
||||
.collect(Collectors.toCollection(TreeSet::new));
|
||||
TreeSet<String> exclusions = dependency.getExcludeRules()
|
||||
.stream()
|
||||
.map(this::getId)
|
||||
.collect(Collectors.toCollection(TreeSet::new));
|
||||
this.exclusionsByDependencyId.put(dependencyId, exclusions);
|
||||
if (!exclusions.isEmpty()) {
|
||||
this.dependencyById.put(dependencyId, getProject().getDependencies().create(dependencyId));
|
||||
@@ -106,7 +108,12 @@ public class CheckClasspathForUnnecessaryExclusions extends DefaultTask {
|
||||
if (!exclusions.isEmpty()) {
|
||||
Dependency toCheck = this.dependencyById.get(dependencyId);
|
||||
List<String> dependencies = this.configurations.detachedConfiguration(toCheck, this.platform)
|
||||
.getIncoming().getArtifacts().getArtifacts().stream().map(this::getId).toList();
|
||||
.getIncoming()
|
||||
.getArtifacts()
|
||||
.getArtifacts()
|
||||
.stream()
|
||||
.map(this::getId)
|
||||
.toList();
|
||||
exclusions.removeAll(dependencies);
|
||||
removeProfileExclusions(dependencyId, exclusions);
|
||||
if (!exclusions.isEmpty()) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2020 the original author or authors.
|
||||
* Copyright 2012-2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -64,8 +64,10 @@ public class ExtractVersionConstraints extends DefaultTask {
|
||||
}
|
||||
|
||||
public void enforcedPlatform(String projectPath) {
|
||||
this.configuration.getDependencies().add(getProject().getDependencies().enforcedPlatform(
|
||||
getProject().getDependencies().project(Collections.singletonMap("path", projectPath))));
|
||||
this.configuration.getDependencies()
|
||||
.add(getProject().getDependencies()
|
||||
.enforcedPlatform(
|
||||
getProject().getDependencies().project(Collections.singletonMap("path", projectPath))));
|
||||
this.projectPaths.add(projectPath);
|
||||
}
|
||||
|
||||
@@ -89,8 +91,10 @@ public class ExtractVersionConstraints extends DefaultTask {
|
||||
this.configuration.resolve();
|
||||
for (String projectPath : this.projectPaths) {
|
||||
extractVersionProperties(projectPath);
|
||||
for (DependencyConstraint constraint : getProject().project(projectPath).getConfigurations()
|
||||
.getByName("apiElements").getAllDependencyConstraints()) {
|
||||
for (DependencyConstraint constraint : getProject().project(projectPath)
|
||||
.getConfigurations()
|
||||
.getByName("apiElements")
|
||||
.getAllDependencyConstraints()) {
|
||||
this.versionConstraints.put(constraint.getGroup() + ":" + constraint.getName(),
|
||||
constraint.getVersionConstraint().toString());
|
||||
this.constrainedVersions.add(new ConstrainedVersion(constraint.getGroup(), constraint.getName(),
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2022 the original author or authors.
|
||||
* Copyright 2012-2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -87,75 +87,102 @@ public class ConfigurationPropertiesPlugin implements Plugin<Project> {
|
||||
|
||||
private void configureConfigurationPropertiesAnnotationProcessor(Project project) {
|
||||
Configuration annotationProcessors = project.getConfigurations()
|
||||
.getByName(JavaPlugin.ANNOTATION_PROCESSOR_CONFIGURATION_NAME);
|
||||
annotationProcessors.getDependencies().add(project.getDependencies().project(Collections.singletonMap("path",
|
||||
":spring-boot-project:spring-boot-tools:spring-boot-configuration-processor")));
|
||||
.getByName(JavaPlugin.ANNOTATION_PROCESSOR_CONFIGURATION_NAME);
|
||||
annotationProcessors.getDependencies()
|
||||
.add(project.getDependencies()
|
||||
.project(Collections.singletonMap("path",
|
||||
":spring-boot-project:spring-boot-tools:spring-boot-configuration-processor")));
|
||||
project.getPlugins().apply(ProcessedAnnotationsPlugin.class);
|
||||
}
|
||||
|
||||
private void disableIncrementalCompilation(Project project) {
|
||||
SourceSet mainSourceSet = project.getExtensions().getByType(JavaPluginExtension.class).getSourceSets()
|
||||
.getByName(SourceSet.MAIN_SOURCE_SET_NAME);
|
||||
project.getTasks().named(mainSourceSet.getCompileJavaTaskName(), JavaCompile.class)
|
||||
.configure((compileJava) -> compileJava.getOptions().setIncremental(false));
|
||||
SourceSet mainSourceSet = project.getExtensions()
|
||||
.getByType(JavaPluginExtension.class)
|
||||
.getSourceSets()
|
||||
.getByName(SourceSet.MAIN_SOURCE_SET_NAME);
|
||||
project.getTasks()
|
||||
.named(mainSourceSet.getCompileJavaTaskName(), JavaCompile.class)
|
||||
.configure((compileJava) -> compileJava.getOptions().setIncremental(false));
|
||||
}
|
||||
|
||||
private void addMetadataArtifact(Project project) {
|
||||
SourceSet mainSourceSet = project.getExtensions().getByType(JavaPluginExtension.class).getSourceSets()
|
||||
.getByName(SourceSet.MAIN_SOURCE_SET_NAME);
|
||||
SourceSet mainSourceSet = project.getExtensions()
|
||||
.getByType(JavaPluginExtension.class)
|
||||
.getSourceSets()
|
||||
.getByName(SourceSet.MAIN_SOURCE_SET_NAME);
|
||||
project.getConfigurations().maybeCreate(CONFIGURATION_PROPERTIES_METADATA_CONFIGURATION_NAME);
|
||||
project.afterEvaluate((evaluatedProject) -> evaluatedProject.getArtifacts().add(
|
||||
CONFIGURATION_PROPERTIES_METADATA_CONFIGURATION_NAME,
|
||||
mainSourceSet.getJava().getDestinationDirectory().dir("META-INF/spring-configuration-metadata.json"),
|
||||
(artifact) -> artifact
|
||||
project.afterEvaluate((evaluatedProject) -> evaluatedProject.getArtifacts()
|
||||
.add(CONFIGURATION_PROPERTIES_METADATA_CONFIGURATION_NAME,
|
||||
mainSourceSet.getJava()
|
||||
.getDestinationDirectory()
|
||||
.dir("META-INF/spring-configuration-metadata.json"),
|
||||
(artifact) -> artifact
|
||||
.builtBy(evaluatedProject.getTasks().getByName(mainSourceSet.getClassesTaskName()))));
|
||||
}
|
||||
|
||||
private void configureAdditionalMetadataLocationsCompilerArgument(Project project) {
|
||||
JavaCompile compileJava = project.getTasks().withType(JavaCompile.class)
|
||||
.getByName(JavaPlugin.COMPILE_JAVA_TASK_NAME);
|
||||
((Task) compileJava).getInputs().files(project.getTasks().getByName(JavaPlugin.PROCESS_RESOURCES_TASK_NAME))
|
||||
.withPathSensitivity(PathSensitivity.RELATIVE).withPropertyName("processed resources");
|
||||
SourceSet mainSourceSet = project.getExtensions().getByType(JavaPluginExtension.class).getSourceSets()
|
||||
.getByName(SourceSet.MAIN_SOURCE_SET_NAME);
|
||||
compileJava.getOptions().getCompilerArgs()
|
||||
.add("-Aorg.springframework.boot.configurationprocessor.additionalMetadataLocations=" + StringUtils
|
||||
.collectionToCommaDelimitedString(mainSourceSet.getResources().getSourceDirectories().getFiles()
|
||||
.stream().map(project.getRootProject()::relativePath).collect(Collectors.toSet())));
|
||||
JavaCompile compileJava = project.getTasks()
|
||||
.withType(JavaCompile.class)
|
||||
.getByName(JavaPlugin.COMPILE_JAVA_TASK_NAME);
|
||||
((Task) compileJava).getInputs()
|
||||
.files(project.getTasks().getByName(JavaPlugin.PROCESS_RESOURCES_TASK_NAME))
|
||||
.withPathSensitivity(PathSensitivity.RELATIVE)
|
||||
.withPropertyName("processed resources");
|
||||
SourceSet mainSourceSet = project.getExtensions()
|
||||
.getByType(JavaPluginExtension.class)
|
||||
.getSourceSets()
|
||||
.getByName(SourceSet.MAIN_SOURCE_SET_NAME);
|
||||
compileJava.getOptions()
|
||||
.getCompilerArgs()
|
||||
.add("-Aorg.springframework.boot.configurationprocessor.additionalMetadataLocations="
|
||||
+ StringUtils.collectionToCommaDelimitedString(mainSourceSet.getResources()
|
||||
.getSourceDirectories()
|
||||
.getFiles()
|
||||
.stream()
|
||||
.map(project.getRootProject()::relativePath)
|
||||
.collect(Collectors.toSet())));
|
||||
}
|
||||
|
||||
private void registerCheckAdditionalMetadataTask(Project project) {
|
||||
TaskProvider<CheckAdditionalSpringConfigurationMetadata> checkConfigurationMetadata = project.getTasks()
|
||||
.register(CHECK_ADDITIONAL_SPRING_CONFIGURATION_METADATA_TASK_NAME,
|
||||
CheckAdditionalSpringConfigurationMetadata.class);
|
||||
.register(CHECK_ADDITIONAL_SPRING_CONFIGURATION_METADATA_TASK_NAME,
|
||||
CheckAdditionalSpringConfigurationMetadata.class);
|
||||
checkConfigurationMetadata.configure((check) -> {
|
||||
SourceSet mainSourceSet = project.getExtensions().getByType(JavaPluginExtension.class).getSourceSets()
|
||||
.getByName(SourceSet.MAIN_SOURCE_SET_NAME);
|
||||
SourceSet mainSourceSet = project.getExtensions()
|
||||
.getByType(JavaPluginExtension.class)
|
||||
.getSourceSets()
|
||||
.getByName(SourceSet.MAIN_SOURCE_SET_NAME);
|
||||
check.setSource(mainSourceSet.getResources());
|
||||
check.include("META-INF/additional-spring-configuration-metadata.json");
|
||||
check.getReportLocation().set(project.getLayout().getBuildDirectory()
|
||||
check.getReportLocation()
|
||||
.set(project.getLayout()
|
||||
.getBuildDirectory()
|
||||
.file("reports/additional-spring-configuration-metadata/check.txt"));
|
||||
});
|
||||
project.getTasks().named(LifecycleBasePlugin.CHECK_TASK_NAME)
|
||||
.configure((check) -> check.dependsOn(checkConfigurationMetadata));
|
||||
project.getTasks()
|
||||
.named(LifecycleBasePlugin.CHECK_TASK_NAME)
|
||||
.configure((check) -> check.dependsOn(checkConfigurationMetadata));
|
||||
}
|
||||
|
||||
private void registerCheckMetadataTask(Project project) {
|
||||
TaskProvider<CheckSpringConfigurationMetadata> checkConfigurationMetadata = project.getTasks()
|
||||
.register(CHECK_SPRING_CONFIGURATION_METADATA_TASK_NAME, CheckSpringConfigurationMetadata.class);
|
||||
.register(CHECK_SPRING_CONFIGURATION_METADATA_TASK_NAME, CheckSpringConfigurationMetadata.class);
|
||||
checkConfigurationMetadata.configure((check) -> {
|
||||
SourceSet mainSourceSet = project.getExtensions().getByType(JavaPluginExtension.class).getSourceSets()
|
||||
.getByName(SourceSet.MAIN_SOURCE_SET_NAME);
|
||||
SourceSet mainSourceSet = project.getExtensions()
|
||||
.getByType(JavaPluginExtension.class)
|
||||
.getSourceSets()
|
||||
.getByName(SourceSet.MAIN_SOURCE_SET_NAME);
|
||||
Provider<RegularFile> metadataLocation = project.getTasks()
|
||||
.named(mainSourceSet.getCompileJavaTaskName(), JavaCompile.class)
|
||||
.flatMap((javaCompile) -> javaCompile.getDestinationDirectory()
|
||||
.file("META-INF/spring-configuration-metadata.json"));
|
||||
.named(mainSourceSet.getCompileJavaTaskName(), JavaCompile.class)
|
||||
.flatMap((javaCompile) -> javaCompile.getDestinationDirectory()
|
||||
.file("META-INF/spring-configuration-metadata.json"));
|
||||
check.getMetadataLocation().set(metadataLocation);
|
||||
check.getReportLocation().set(
|
||||
project.getLayout().getBuildDirectory().file("reports/spring-configuration-metadata/check.txt"));
|
||||
check.getReportLocation()
|
||||
.set(project.getLayout().getBuildDirectory().file("reports/spring-configuration-metadata/check.txt"));
|
||||
});
|
||||
project.getTasks().named(LifecycleBasePlugin.CHECK_TASK_NAME)
|
||||
.configure((check) -> check.dependsOn(checkConfigurationMetadata));
|
||||
project.getTasks()
|
||||
.named(LifecycleBasePlugin.CHECK_TASK_NAME)
|
||||
.configure((check) -> check.dependsOn(checkConfigurationMetadata));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2021 the original author or authors.
|
||||
* Copyright 2012-2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -45,8 +45,9 @@ class SingleRow extends Row {
|
||||
return null;
|
||||
}
|
||||
if (defaultValue.getClass().isArray()) {
|
||||
return Arrays.stream((Object[]) defaultValue).map(Object::toString)
|
||||
.collect(Collectors.joining("," + System.lineSeparator()));
|
||||
return Arrays.stream((Object[]) defaultValue)
|
||||
.map(Object::toString)
|
||||
.collect(Collectors.joining("," + System.lineSeparator()));
|
||||
}
|
||||
return defaultValue.toString();
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2022 the original author or authors.
|
||||
* Copyright 2012-2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -52,8 +52,10 @@ class Snippets {
|
||||
|
||||
void writeTo(Path outputDirectory) throws IOException {
|
||||
createDirectory(outputDirectory);
|
||||
Set<String> remaining = this.properties.stream().filter((property) -> !property.isDeprecated())
|
||||
.map(ConfigurationProperty::getName).collect(Collectors.toSet());
|
||||
Set<String> remaining = this.properties.stream()
|
||||
.filter((property) -> !property.isDeprecated())
|
||||
.map(ConfigurationProperty::getName)
|
||||
.collect(Collectors.toSet());
|
||||
for (Snippet snippet : this.snippets) {
|
||||
Set<String> written = writeSnippet(outputDirectory, snippet, remaining);
|
||||
remaining.removeAll(written);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2022 the original author or authors.
|
||||
* Copyright 2012-2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -48,8 +48,9 @@ public class DocumentDevtoolsPropertyDefaults extends DefaultTask {
|
||||
public DocumentDevtoolsPropertyDefaults() {
|
||||
this.devtools = getProject().getConfigurations().create("devtools");
|
||||
this.outputFile = getProject().getObjects().fileProperty();
|
||||
this.outputFile.convention(getProject().getLayout().getBuildDirectory()
|
||||
.file("docs/generated/using/devtools-property-defaults.adoc"));
|
||||
this.outputFile.convention(getProject().getLayout()
|
||||
.getBuildDirectory()
|
||||
.file("docs/generated/using/devtools-property-defaults.adoc"));
|
||||
Map<String, String> dependency = new HashMap<>();
|
||||
dependency.put("path", ":spring-boot-project:spring-boot-devtools");
|
||||
dependency.put("configuration", "propertyDefaults");
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2022 the original author or authors.
|
||||
* Copyright 2012-2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -57,8 +57,9 @@ public class ApplicationRunner extends DefaultTask {
|
||||
|
||||
private final Property<String> expectedLogging = getProject().getObjects().property(String.class);
|
||||
|
||||
private final Property<String> applicationJar = getProject().getObjects().property(String.class)
|
||||
.convention("/opt/apps/myapp.jar");
|
||||
private final Property<String> applicationJar = getProject().getObjects()
|
||||
.property(String.class)
|
||||
.convention("/opt/apps/myapp.jar");
|
||||
|
||||
private final Map<String, String> normalizations = new HashMap<>();
|
||||
|
||||
@@ -118,13 +119,17 @@ public class ApplicationRunner extends DefaultTask {
|
||||
File executable = Jvm.current().getExecutable("java");
|
||||
command.add(executable.getAbsolutePath());
|
||||
command.add("-cp");
|
||||
command.add(this.classpath.getFiles().stream().map(File::getAbsolutePath)
|
||||
.collect(Collectors.joining(File.pathSeparator)));
|
||||
command.add(this.classpath.getFiles()
|
||||
.stream()
|
||||
.map(File::getAbsolutePath)
|
||||
.collect(Collectors.joining(File.pathSeparator)));
|
||||
command.add(this.mainClass.get());
|
||||
command.addAll(this.args.get());
|
||||
File outputFile = this.output.getAsFile().get();
|
||||
Process process = new ProcessBuilder().redirectOutput(outputFile).redirectError(outputFile).command(command)
|
||||
.start();
|
||||
Process process = new ProcessBuilder().redirectOutput(outputFile)
|
||||
.redirectError(outputFile)
|
||||
.command(command)
|
||||
.start();
|
||||
awaitLogging(process);
|
||||
process.destroy();
|
||||
normalizeLogging();
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2022 the original author or authors.
|
||||
* Copyright 2012-2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -108,8 +108,9 @@ public class DocumentPluginGoals extends DefaultTask {
|
||||
writer.println("== Required parameters");
|
||||
writeParametersTable(writer, detailsSectionId, requiredParameters);
|
||||
}
|
||||
List<Parameter> optionalParameters = parameters.stream().filter((parameter) -> !parameter.isRequired())
|
||||
.toList();
|
||||
List<Parameter> optionalParameters = parameters.stream()
|
||||
.filter((parameter) -> !parameter.isRequired())
|
||||
.toList();
|
||||
if (!optionalParameters.isEmpty()) {
|
||||
writer.println();
|
||||
writer.println();
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2022 the original author or authors.
|
||||
* Copyright 2012-2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -51,8 +51,9 @@ public class MavenExec extends JavaExec {
|
||||
|
||||
public void setProjectDir(File projectDir) {
|
||||
this.projectDir = projectDir;
|
||||
getInputs().file(new File(projectDir, "pom.xml")).withPathSensitivity(PathSensitivity.RELATIVE)
|
||||
.withPropertyName("pom");
|
||||
getInputs().file(new File(projectDir, "pom.xml"))
|
||||
.withPathSensitivity(PathSensitivity.RELATIVE)
|
||||
.withPropertyName("pom");
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -88,10 +89,11 @@ public class MavenExec extends JavaExec {
|
||||
maven.getDependencies().add(project.getDependencies().create("org.apache.maven:maven-embedder:3.6.2"));
|
||||
maven.getDependencies().add(project.getDependencies().create("org.apache.maven:maven-compat:3.6.2"));
|
||||
maven.getDependencies().add(project.getDependencies().create("org.slf4j:slf4j-simple:1.7.5"));
|
||||
maven.getDependencies().add(
|
||||
project.getDependencies().create("org.apache.maven.resolver:maven-resolver-connector-basic:1.4.1"));
|
||||
maven.getDependencies().add(
|
||||
project.getDependencies().create("org.apache.maven.resolver:maven-resolver-transport-http:1.4.1"));
|
||||
maven.getDependencies()
|
||||
.add(project.getDependencies()
|
||||
.create("org.apache.maven.resolver:maven-resolver-connector-basic:1.4.1"));
|
||||
maven.getDependencies()
|
||||
.add(project.getDependencies().create("org.apache.maven.resolver:maven-resolver-transport-http:1.4.1"));
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2022 the original author or authors.
|
||||
* Copyright 2012-2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -128,15 +128,15 @@ public class MavenPluginPlugin implements Plugin<Project> {
|
||||
private void addPopulateIntTestMavenRepositoryTask(Project project) {
|
||||
Configuration runtimeClasspathWithMetadata = project.getConfigurations().create("runtimeClasspathWithMetadata");
|
||||
runtimeClasspathWithMetadata
|
||||
.extendsFrom(project.getConfigurations().getByName(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME));
|
||||
.extendsFrom(project.getConfigurations().getByName(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME));
|
||||
runtimeClasspathWithMetadata.attributes((attributes) -> attributes.attribute(DocsType.DOCS_TYPE_ATTRIBUTE,
|
||||
project.getObjects().named(DocsType.class, "maven-repository")));
|
||||
RuntimeClasspathMavenRepository runtimeClasspathMavenRepository = project.getTasks()
|
||||
.create("runtimeClasspathMavenRepository", RuntimeClasspathMavenRepository.class);
|
||||
.create("runtimeClasspathMavenRepository", RuntimeClasspathMavenRepository.class);
|
||||
runtimeClasspathMavenRepository.getOutputDirectory()
|
||||
.set(new File(project.getBuildDir(), "runtime-classpath-repository"));
|
||||
.set(new File(project.getBuildDir(), "runtime-classpath-repository"));
|
||||
project.getDependencies()
|
||||
.components((components) -> components.all(MavenRepositoryComponentMetadataRule.class));
|
||||
.components((components) -> components.all(MavenRepositoryComponentMetadataRule.class));
|
||||
Sync task = project.getTasks().create("populateIntTestMavenRepository", Sync.class);
|
||||
task.setDestinationDir(new File(project.getBuildDir(), "int-test-maven-repository"));
|
||||
task.with(copyIntTestMavenRepositoryFiles(project, runtimeClasspathMavenRepository));
|
||||
@@ -219,8 +219,8 @@ public class MavenPluginPlugin implements Plugin<Project> {
|
||||
|
||||
private FormatHelpMojoSource createFormatHelpMojoSource(Project project, MavenExec generateHelpMojoTask,
|
||||
File generatedHelpMojoDir) {
|
||||
FormatHelpMojoSource formatHelpMojoSource = project.getTasks().create("formatHelpMojoSource",
|
||||
FormatHelpMojoSource.class);
|
||||
FormatHelpMojoSource formatHelpMojoSource = project.getTasks()
|
||||
.create("formatHelpMojoSource", FormatHelpMojoSource.class);
|
||||
formatHelpMojoSource.setGenerator(generateHelpMojoTask);
|
||||
formatHelpMojoSource.setOutputDir(generatedHelpMojoDir);
|
||||
return formatHelpMojoSource;
|
||||
@@ -241,8 +241,10 @@ public class MavenPluginPlugin implements Plugin<Project> {
|
||||
MavenExec generatePluginDescriptor = project.getTasks().create("generatePluginDescriptor", MavenExec.class);
|
||||
generatePluginDescriptor.args("org.apache.maven.plugins:maven-plugin-plugin:3.6.1:descriptor");
|
||||
generatePluginDescriptor.getOutputs().dir(new File(mavenDir, "target/classes/META-INF/maven"));
|
||||
generatePluginDescriptor.getInputs().dir(new File(mavenDir, "target/classes/org"))
|
||||
.withPathSensitivity(PathSensitivity.RELATIVE).withPropertyName("plugin classes");
|
||||
generatePluginDescriptor.getInputs()
|
||||
.dir(new File(mavenDir, "target/classes/org"))
|
||||
.withPathSensitivity(PathSensitivity.RELATIVE)
|
||||
.withPropertyName("plugin classes");
|
||||
generatePluginDescriptor.setProjectDir(mavenDir);
|
||||
return generatePluginDescriptor;
|
||||
}
|
||||
@@ -267,10 +269,13 @@ public class MavenPluginPlugin implements Plugin<Project> {
|
||||
}
|
||||
|
||||
private void addExtractVersionPropertiesTask(Project project) {
|
||||
ExtractVersionProperties extractVersionProperties = project.getTasks().create("extractVersionProperties",
|
||||
ExtractVersionProperties.class);
|
||||
ExtractVersionProperties extractVersionProperties = project.getTasks()
|
||||
.create("extractVersionProperties", ExtractVersionProperties.class);
|
||||
extractVersionProperties.setEffectiveBoms(project.getConfigurations().create("versionProperties"));
|
||||
extractVersionProperties.getDestination().set(project.getLayout().getBuildDirectory().dir("generated-resources")
|
||||
extractVersionProperties.getDestination()
|
||||
.set(project.getLayout()
|
||||
.getBuildDirectory()
|
||||
.dir("generated-resources")
|
||||
.map((dir) -> dir.file("extracted-versions.properties")));
|
||||
}
|
||||
|
||||
@@ -282,8 +287,9 @@ public class MavenPluginPlugin implements Plugin<Project> {
|
||||
|
||||
void setGenerator(Task generator) {
|
||||
this.generator = generator;
|
||||
getInputs().files(this.generator).withPathSensitivity(PathSensitivity.RELATIVE)
|
||||
.withPropertyName("generated source");
|
||||
getInputs().files(this.generator)
|
||||
.withPathSensitivity(PathSensitivity.RELATIVE)
|
||||
.withPropertyName("generated source");
|
||||
}
|
||||
|
||||
@OutputDirectory
|
||||
@@ -300,7 +306,7 @@ public class MavenPluginPlugin implements Plugin<Project> {
|
||||
FileFormatter formatter = new FileFormatter();
|
||||
for (File output : this.generator.getOutputs().getFiles()) {
|
||||
formatter.formatFiles(getProject().fileTree(output), StandardCharsets.UTF_8)
|
||||
.forEach((edit) -> save(output, edit));
|
||||
.forEach((edit) -> save(output, edit));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -329,10 +335,11 @@ public class MavenPluginPlugin implements Plugin<Project> {
|
||||
|
||||
@Override
|
||||
public void execute(ComponentMetadataContext context) {
|
||||
context.getDetails().maybeAddVariant("compileWithMetadata", "compile",
|
||||
(variant) -> configureVariant(context, variant));
|
||||
context.getDetails().maybeAddVariant("apiElementsWithMetadata", "apiElements",
|
||||
(variant) -> configureVariant(context, variant));
|
||||
context.getDetails()
|
||||
.maybeAddVariant("compileWithMetadata", "compile", (variant) -> configureVariant(context, variant));
|
||||
context.getDetails()
|
||||
.maybeAddVariant("apiElementsWithMetadata", "apiElements",
|
||||
(variant) -> configureVariant(context, variant));
|
||||
}
|
||||
|
||||
private void configureVariant(ComponentMetadataContext context, VariantMetadata variant) {
|
||||
@@ -374,11 +381,14 @@ public class MavenPluginPlugin implements Plugin<Project> {
|
||||
public void createRepository() {
|
||||
for (ResolvedArtifactResult result : this.runtimeClasspath.getIncoming().getArtifacts()) {
|
||||
if (result.getId().getComponentIdentifier() instanceof ModuleComponentIdentifier identifier) {
|
||||
String fileName = result.getFile().getName()
|
||||
.replace(identifier.getVersion() + "-" + identifier.getVersion(), identifier.getVersion());
|
||||
File repositoryLocation = this.outputDirectory.dir(identifier.getGroup().replace('.', '/') + "/"
|
||||
+ identifier.getModule() + "/" + identifier.getVersion() + "/" + fileName).get()
|
||||
.getAsFile();
|
||||
String fileName = result.getFile()
|
||||
.getName()
|
||||
.replace(identifier.getVersion() + "-" + identifier.getVersion(), identifier.getVersion());
|
||||
File repositoryLocation = this.outputDirectory
|
||||
.dir(identifier.getGroup().replace('.', '/') + "/" + identifier.getModule() + "/"
|
||||
+ identifier.getVersion() + "/" + fileName)
|
||||
.get()
|
||||
.getAsFile();
|
||||
repositoryLocation.getParentFile().mkdirs();
|
||||
try {
|
||||
Files.copy(result.getFile().toPath(), repositoryLocation.toPath(),
|
||||
@@ -487,8 +497,8 @@ public class MavenPluginPlugin implements Plugin<Project> {
|
||||
|
||||
private String get(String expression) {
|
||||
try {
|
||||
Node node = (Node) this.xpath.compile("/project/" + expression).evaluate(this.document,
|
||||
XPathConstants.NODE);
|
||||
Node node = (Node) this.xpath.compile("/project/" + expression)
|
||||
.evaluate(this.document, XPathConstants.NODE);
|
||||
String text = (node != null) ? node.getTextContent() : null;
|
||||
Assert.hasLength(text, () -> "No result for expression " + expression);
|
||||
return text;
|
||||
|
||||
@@ -111,10 +111,17 @@ class PluginXmlParser {
|
||||
}
|
||||
|
||||
private String format(String input) {
|
||||
return input.replace("<code>", "`").replace("</code>", "`").replace("<", "<").replace(">", ">")
|
||||
.replace("<br>", " ").replace("\n", " ").replace(""", "\"").replaceAll("\\{@code (.*?)}", "`$1`")
|
||||
.replaceAll("\\{@link (.*?)}", "`$1`").replaceAll("\\{@literal (.*?)}", "`$1`")
|
||||
.replaceAll("<a href=.\"(.*?)\".>(.*?)</a>", "$1[$2]");
|
||||
return input.replace("<code>", "`")
|
||||
.replace("</code>", "`")
|
||||
.replace("<", "<")
|
||||
.replace(">", ">")
|
||||
.replace("<br>", " ")
|
||||
.replace("\n", " ")
|
||||
.replace(""", "\"")
|
||||
.replaceAll("\\{@code (.*?)}", "`$1`")
|
||||
.replaceAll("\\{@link (.*?)}", "`$1`")
|
||||
.replaceAll("\\{@literal (.*?)}", "`$1`")
|
||||
.replaceAll("<a href=.\"(.*?)\".>(.*?)</a>", "$1[$2]");
|
||||
}
|
||||
|
||||
private static final class IterableNodeList implements Iterable<Node> {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2022 the original author or authors.
|
||||
* Copyright 2012-2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -60,10 +60,11 @@ public class PrepareMavenBinaries extends DefaultTask {
|
||||
@TaskAction
|
||||
public void prepareBinaries() {
|
||||
for (String version : this.versions) {
|
||||
Configuration configuration = getProject().getConfigurations().detachedConfiguration(
|
||||
getProject().getDependencies().create("org.apache.maven:apache-maven:" + version + ":bin@zip"));
|
||||
getProject().copy(
|
||||
(copy) -> copy.into(this.outputDir).from(getProject().zipTree(configuration.getSingleFile())));
|
||||
Configuration configuration = getProject().getConfigurations()
|
||||
.detachedConfiguration(
|
||||
getProject().getDependencies().create("org.apache.maven:apache-maven:" + version + ":bin@zip"));
|
||||
getProject()
|
||||
.copy((copy) -> copy.into(this.outputDir).from(getProject().zipTree(configuration.getSingleFile())));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2022 the original author or authors.
|
||||
* Copyright 2012-2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -44,13 +44,16 @@ public class OptionalDependenciesPlugin implements Plugin<Project> {
|
||||
optional.setCanBeConsumed(false);
|
||||
optional.setCanBeResolved(false);
|
||||
project.getPlugins().withType(JavaPlugin.class, (javaPlugin) -> {
|
||||
SourceSetContainer sourceSets = project.getExtensions().getByType(JavaPluginExtension.class)
|
||||
.getSourceSets();
|
||||
SourceSetContainer sourceSets = project.getExtensions()
|
||||
.getByType(JavaPluginExtension.class)
|
||||
.getSourceSets();
|
||||
sourceSets.all((sourceSet) -> {
|
||||
project.getConfigurations().getByName(sourceSet.getCompileClasspathConfigurationName())
|
||||
.extendsFrom(optional);
|
||||
project.getConfigurations().getByName(sourceSet.getRuntimeClasspathConfigurationName())
|
||||
.extendsFrom(optional);
|
||||
project.getConfigurations()
|
||||
.getByName(sourceSet.getCompileClasspathConfigurationName())
|
||||
.extendsFrom(optional);
|
||||
project.getConfigurations()
|
||||
.getByName(sourceSet.getRuntimeClasspathConfigurationName())
|
||||
.extendsFrom(optional);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2022-2022 the original author or authors.
|
||||
* Copyright 2022-2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -31,8 +31,9 @@ public class ProcessedAnnotationsPlugin implements Plugin<Project> {
|
||||
@Override
|
||||
public void apply(Project project) {
|
||||
project.getPlugins().apply(AptEclipsePlugin.class);
|
||||
project.getExtensions().getByType(EclipseModel.class).synchronizationTasks("eclipseJdtApt", "eclipseJdt",
|
||||
"eclipseFactorypath");
|
||||
project.getExtensions()
|
||||
.getByType(EclipseModel.class)
|
||||
.synchronizationTasks("eclipseJdtApt", "eclipseJdt", "eclipseFactorypath");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2021 the original author or authors.
|
||||
* Copyright 2012-2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -84,8 +84,10 @@ public class DocumentStarters extends DefaultTask {
|
||||
|
||||
@TaskAction
|
||||
void documentStarters() {
|
||||
Set<Starter> starters = this.starters.getFiles().stream().map(this::loadStarter)
|
||||
.collect(Collectors.toCollection(TreeSet::new));
|
||||
Set<Starter> starters = this.starters.getFiles()
|
||||
.stream()
|
||||
.map(this::loadStarter)
|
||||
.collect(Collectors.toCollection(TreeSet::new));
|
||||
writeTable("application-starters", starters.stream().filter(Starter::isApplication));
|
||||
writeTable("production-starters", starters.stream().filter(Starter::isProduction));
|
||||
writeTable("technical-starters", starters.stream().filter(Starter::isTechnical));
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2020 the original author or authors.
|
||||
* Copyright 2012-2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -73,8 +73,13 @@ public class StarterMetadata extends DefaultTask {
|
||||
Properties properties = CollectionFactory.createSortedProperties(true);
|
||||
properties.setProperty("name", getProject().getName());
|
||||
properties.setProperty("description", getProject().getDescription());
|
||||
properties.setProperty("dependencies", String.join(",", this.dependencies.getResolvedConfiguration()
|
||||
.getResolvedArtifacts().stream().map(ResolvedArtifact::getName).collect(Collectors.toSet())));
|
||||
properties.setProperty("dependencies",
|
||||
String.join(",",
|
||||
this.dependencies.getResolvedConfiguration()
|
||||
.getResolvedArtifacts()
|
||||
.stream()
|
||||
.map(ResolvedArtifact::getName)
|
||||
.collect(Collectors.toSet())));
|
||||
this.destination.getParentFile().mkdirs();
|
||||
try (FileWriter writer = new FileWriter(this.destination)) {
|
||||
properties.store(writer, null);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2021 the original author or authors.
|
||||
* Copyright 2012-2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -58,25 +58,26 @@ public class StarterPlugin implements Plugin<Project> {
|
||||
File destination = new File(project.getBuildDir(), "starter-metadata.properties");
|
||||
starterMetadata.setDestination(destination);
|
||||
configurations.create("starterMetadata");
|
||||
project.getArtifacts().add("starterMetadata", project.provider(starterMetadata::getDestination),
|
||||
(artifact) -> artifact.builtBy(starterMetadata));
|
||||
project.getArtifacts()
|
||||
.add("starterMetadata", project.provider(starterMetadata::getDestination),
|
||||
(artifact) -> artifact.builtBy(starterMetadata));
|
||||
createClasspathConflictsCheck(runtimeClasspath, project);
|
||||
createUnnecessaryExclusionsCheck(runtimeClasspath, project);
|
||||
configureJarManifest(project);
|
||||
}
|
||||
|
||||
private void createClasspathConflictsCheck(Configuration classpath, Project project) {
|
||||
CheckClasspathForConflicts checkClasspathForConflicts = project.getTasks().create(
|
||||
"check" + StringUtils.capitalize(classpath.getName() + "ForConflicts"),
|
||||
CheckClasspathForConflicts.class);
|
||||
CheckClasspathForConflicts checkClasspathForConflicts = project.getTasks()
|
||||
.create("check" + StringUtils.capitalize(classpath.getName() + "ForConflicts"),
|
||||
CheckClasspathForConflicts.class);
|
||||
checkClasspathForConflicts.setClasspath(classpath);
|
||||
project.getTasks().getByName(JavaBasePlugin.CHECK_TASK_NAME).dependsOn(checkClasspathForConflicts);
|
||||
}
|
||||
|
||||
private void createUnnecessaryExclusionsCheck(Configuration classpath, Project project) {
|
||||
CheckClasspathForUnnecessaryExclusions checkClasspathForUnnecessaryExclusions = project.getTasks().create(
|
||||
"check" + StringUtils.capitalize(classpath.getName() + "ForUnnecessaryExclusions"),
|
||||
CheckClasspathForUnnecessaryExclusions.class);
|
||||
CheckClasspathForUnnecessaryExclusions checkClasspathForUnnecessaryExclusions = project.getTasks()
|
||||
.create("check" + StringUtils.capitalize(classpath.getName() + "ForUnnecessaryExclusions"),
|
||||
CheckClasspathForUnnecessaryExclusions.class);
|
||||
checkClasspathForUnnecessaryExclusions.setClasspath(classpath);
|
||||
project.getTasks().getByName(JavaBasePlugin.CHECK_TASK_NAME).dependsOn(checkClasspathForUnnecessaryExclusions);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2022 the original author or authors.
|
||||
* Copyright 2012-2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -55,8 +55,8 @@ public class IntegrationTestPlugin implements Plugin<Project> {
|
||||
project.getTasks().getByName(LifecycleBasePlugin.CHECK_TASK_NAME).dependsOn(intTest);
|
||||
project.getPlugins().withType(EclipsePlugin.class, (eclipsePlugin) -> {
|
||||
EclipseModel eclipse = project.getExtensions().getByType(EclipseModel.class);
|
||||
eclipse.classpath((classpath) -> classpath.getPlusConfigurations().add(
|
||||
project.getConfigurations().getByName(intTestSourceSet.getRuntimeClasspathConfigurationName())));
|
||||
eclipse.classpath((classpath) -> classpath.getPlusConfigurations()
|
||||
.add(project.getConfigurations().getByName(intTestSourceSet.getRuntimeClasspathConfigurationName())));
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2022 the original author or authors.
|
||||
* Copyright 2012-2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -59,8 +59,9 @@ public class SystemTestPlugin implements Plugin<Project> {
|
||||
createTestTask(project, systemTestSourceSet);
|
||||
project.getPlugins().withType(EclipsePlugin.class, (eclipsePlugin) -> {
|
||||
EclipseModel eclipse = project.getExtensions().getByType(EclipseModel.class);
|
||||
eclipse.classpath((classpath) -> classpath.getPlusConfigurations().add(
|
||||
project.getConfigurations().getByName(systemTestSourceSet.getRuntimeClasspathConfigurationName())));
|
||||
eclipse.classpath((classpath) -> classpath.getPlusConfigurations()
|
||||
.add(project.getConfigurations()
|
||||
.getByName(systemTestSourceSet.getRuntimeClasspathConfigurationName())));
|
||||
});
|
||||
}
|
||||
|
||||
@@ -69,9 +70,9 @@ public class SystemTestPlugin implements Plugin<Project> {
|
||||
SourceSet systemTestSourceSet = sourceSets.create(SYSTEM_TEST_SOURCE_SET_NAME);
|
||||
SourceSet mainSourceSet = sourceSets.getByName(SourceSet.MAIN_SOURCE_SET_NAME);
|
||||
systemTestSourceSet
|
||||
.setCompileClasspath(systemTestSourceSet.getCompileClasspath().plus(mainSourceSet.getOutput()));
|
||||
.setCompileClasspath(systemTestSourceSet.getCompileClasspath().plus(mainSourceSet.getOutput()));
|
||||
systemTestSourceSet
|
||||
.setRuntimeClasspath(systemTestSourceSet.getRuntimeClasspath().plus(mainSourceSet.getOutput()));
|
||||
.setRuntimeClasspath(systemTestSourceSet.getRuntimeClasspath().plus(mainSourceSet.getOutput()));
|
||||
return systemTestSourceSet;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2022 the original author or authors.
|
||||
* Copyright 2012-2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -67,9 +67,11 @@ public class TestSliceMetadata extends DefaultTask {
|
||||
|
||||
public TestSliceMetadata() {
|
||||
getInputs().dir((Callable<File>) () -> this.sourceSet.getOutput().getResourcesDir())
|
||||
.withPathSensitivity(PathSensitivity.RELATIVE).withPropertyName("resources");
|
||||
.withPathSensitivity(PathSensitivity.RELATIVE)
|
||||
.withPropertyName("resources");
|
||||
getInputs().files((Callable<FileCollection>) () -> this.sourceSet.getOutput().getClassesDirs())
|
||||
.withPathSensitivity(PathSensitivity.RELATIVE).withPropertyName("classes");
|
||||
.withPathSensitivity(PathSensitivity.RELATIVE)
|
||||
.withPropertyName("classes");
|
||||
}
|
||||
|
||||
public void setSourceSet(SourceSet sourceSet) {
|
||||
@@ -84,8 +86,9 @@ public class TestSliceMetadata extends DefaultTask {
|
||||
public void setOutputFile(File outputFile) {
|
||||
this.outputFile = outputFile;
|
||||
Configuration testSliceMetadata = getProject().getConfigurations().maybeCreate("testSliceMetadata");
|
||||
getProject().getArtifacts().add(testSliceMetadata.getName(),
|
||||
getProject().provider((Callable<File>) this::getOutputFile), (artifact) -> artifact.builtBy(this));
|
||||
getProject().getArtifacts()
|
||||
.add(testSliceMetadata.getName(), getProject().provider((Callable<File>) this::getOutputFile),
|
||||
(artifact) -> artifact.builtBy(this));
|
||||
}
|
||||
|
||||
@TaskAction
|
||||
@@ -100,8 +103,9 @@ public class TestSliceMetadata extends DefaultTask {
|
||||
private Properties readTestSlices() throws IOException {
|
||||
Properties testSlices = CollectionFactory.createSortedProperties(true);
|
||||
try (URLClassLoader classLoader = new URLClassLoader(
|
||||
StreamSupport.stream(this.sourceSet.getRuntimeClasspath().spliterator(), false).map(this::toURL)
|
||||
.toArray(URL[]::new))) {
|
||||
StreamSupport.stream(this.sourceSet.getRuntimeClasspath().spliterator(), false)
|
||||
.map(this::toURL)
|
||||
.toArray(URL[]::new))) {
|
||||
MetadataReaderFactory metadataReaderFactory = new SimpleMetadataReaderFactory(classLoader);
|
||||
Properties springFactories = readSpringFactories(
|
||||
new File(this.sourceSet.getOutput().getResourcesDir(), "META-INF/spring.factories"));
|
||||
@@ -129,8 +133,8 @@ public class TestSliceMetadata extends DefaultTask {
|
||||
for (File file : files) {
|
||||
try {
|
||||
List<String> lines = removeComments(Files.readAllLines(file.toPath()));
|
||||
String fileNameWithoutExtension = file.getName().substring(0,
|
||||
file.getName().length() - ".imports".length());
|
||||
String fileNameWithoutExtension = file.getName()
|
||||
.substring(0, file.getName().length() - ".imports".length());
|
||||
springFactories.setProperty(fileNameWithoutExtension,
|
||||
StringUtils.collectionToCommaDelimitedString(lines));
|
||||
}
|
||||
@@ -176,9 +180,9 @@ public class TestSliceMetadata extends DefaultTask {
|
||||
Properties springFactories) throws IOException {
|
||||
try (Stream<Path> classes = Files.walk(classesDir.toPath())) {
|
||||
classes.filter((path) -> path.toString().endsWith("Test.class"))
|
||||
.map((path) -> getMetadataReader(path, metadataReaderFactory))
|
||||
.filter((metadataReader) -> metadataReader.getClassMetadata().isAnnotation())
|
||||
.forEach((metadataReader) -> addTestSlice(testSlices, springFactories, metadataReader));
|
||||
.map((path) -> getMetadataReader(path, metadataReaderFactory))
|
||||
.filter((metadataReader) -> metadataReader.getClassMetadata().isAnnotation())
|
||||
.forEach((metadataReader) -> addTestSlice(testSlices, springFactories, metadataReader));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -204,19 +208,20 @@ public class TestSliceMetadata extends DefaultTask {
|
||||
if (annotationMetadata.isAnnotated("org.springframework.boot.autoconfigure.ImportAutoConfiguration")) {
|
||||
importers = Stream.concat(importers, Stream.of(annotationMetadata.getClassName()));
|
||||
}
|
||||
return importers.flatMap(
|
||||
(importer) -> StringUtils.commaDelimitedListToSet(springFactories.getProperty(importer)).stream())
|
||||
.collect(Collectors.toCollection(TreeSet::new));
|
||||
return importers
|
||||
.flatMap((importer) -> StringUtils.commaDelimitedListToSet(springFactories.getProperty(importer)).stream())
|
||||
.collect(Collectors.toCollection(TreeSet::new));
|
||||
}
|
||||
|
||||
private Stream<String> findMetaImporters(AnnotationMetadata annotationMetadata) {
|
||||
return annotationMetadata.getAnnotationTypes().stream()
|
||||
.filter((annotationType) -> isAutoConfigurationImporter(annotationType, annotationMetadata));
|
||||
return annotationMetadata.getAnnotationTypes()
|
||||
.stream()
|
||||
.filter((annotationType) -> isAutoConfigurationImporter(annotationType, annotationMetadata));
|
||||
}
|
||||
|
||||
private boolean isAutoConfigurationImporter(String annotationType, AnnotationMetadata metadata) {
|
||||
return metadata.getMetaAnnotationTypes(annotationType)
|
||||
.contains("org.springframework.boot.autoconfigure.ImportAutoConfiguration");
|
||||
.contains("org.springframework.boot.autoconfigure.ImportAutoConfiguration");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2021 the original author or authors.
|
||||
* Copyright 2012-2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -36,11 +36,13 @@ public class TestFailuresPlugin implements Plugin<Project> {
|
||||
|
||||
@Override
|
||||
public void apply(Project project) {
|
||||
Provider<TestResultsOverview> testResultsOverview = project.getGradle().getSharedServices()
|
||||
.registerIfAbsent("testResultsOverview", TestResultsOverview.class, (spec) -> {
|
||||
});
|
||||
project.getTasks().withType(Test.class,
|
||||
(test) -> test.addTestListener(new FailureRecordingTestListener(testResultsOverview, test)));
|
||||
Provider<TestResultsOverview> testResultsOverview = project.getGradle()
|
||||
.getSharedServices()
|
||||
.registerIfAbsent("testResultsOverview", TestResultsOverview.class, (spec) -> {
|
||||
});
|
||||
project.getTasks()
|
||||
.withType(Test.class,
|
||||
(test) -> test.addTestListener(new FailureRecordingTestListener(testResultsOverview, test)));
|
||||
}
|
||||
|
||||
private final class FailureRecordingTestListener implements TestListener {
|
||||
|
||||
@@ -66,7 +66,7 @@ public abstract class TestResultsOverview
|
||||
System.err.println();
|
||||
System.err.println(task.getPath());
|
||||
failures.forEach((failure) -> System.err
|
||||
.println(" " + failure.descriptor.getClassName() + " > " + failure.descriptor.getName()));
|
||||
.println(" " + failure.descriptor.getClassName() + " > " + failure.descriptor.getName()));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2022 the original author or authors.
|
||||
* Copyright 2012-2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -52,16 +52,18 @@ public class ToolchainPlugin implements Plugin<Project> {
|
||||
disableToolchainTasks(project);
|
||||
}
|
||||
else {
|
||||
JavaToolchainSpec toolchainSpec = project.getExtensions().getByType(JavaPluginExtension.class)
|
||||
.getToolchain();
|
||||
JavaToolchainSpec toolchainSpec = project.getExtensions()
|
||||
.getByType(JavaPluginExtension.class)
|
||||
.getToolchain();
|
||||
toolchainSpec.getLanguageVersion().set(toolchain.getJavaVersion());
|
||||
configureTestToolchain(project, toolchain);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isJavaVersionSupported(ToolchainExtension toolchain, JavaLanguageVersion toolchainVersion) {
|
||||
return toolchain.getMaximumCompatibleJavaVersion().map((version) -> version.canCompileOrRun(toolchainVersion))
|
||||
.getOrElse(true);
|
||||
return toolchain.getMaximumCompatibleJavaVersion()
|
||||
.map((version) -> version.canCompileOrRun(toolchainVersion))
|
||||
.getOrElse(true);
|
||||
}
|
||||
|
||||
private void disableToolchainTasks(Project project) {
|
||||
|
||||
@@ -88,9 +88,9 @@ class ConventionsPluginTests {
|
||||
assertThatNoticeIsPresent(jar);
|
||||
Attributes mainAttributes = jar.getManifest().getMainAttributes();
|
||||
assertThat(mainAttributes.getValue("Implementation-Title"))
|
||||
.isEqualTo("Test project for manifest customization");
|
||||
.isEqualTo("Test project for manifest customization");
|
||||
assertThat(mainAttributes.getValue("Automatic-Module-Name"))
|
||||
.isEqualTo(this.projectDir.getName().replace("-", "."));
|
||||
.isEqualTo(this.projectDir.getName().replace("-", "."));
|
||||
assertThat(mainAttributes.getValue("Implementation-Version")).isEqualTo("1.2.3");
|
||||
assertThat(mainAttributes.getValue("Built-By")).isEqualTo("Spring");
|
||||
assertThat(mainAttributes.getValue("Build-Jdk-Spec")).isEqualTo("17");
|
||||
@@ -117,9 +117,9 @@ class ConventionsPluginTests {
|
||||
assertThatNoticeIsPresent(jar);
|
||||
Attributes mainAttributes = jar.getManifest().getMainAttributes();
|
||||
assertThat(mainAttributes.getValue("Implementation-Title"))
|
||||
.isEqualTo("Source for " + this.projectDir.getName());
|
||||
.isEqualTo("Source for " + this.projectDir.getName());
|
||||
assertThat(mainAttributes.getValue("Automatic-Module-Name"))
|
||||
.isEqualTo(this.projectDir.getName().replace("-", "."));
|
||||
.isEqualTo(this.projectDir.getName().replace("-", "."));
|
||||
assertThat(mainAttributes.getValue("Implementation-Version")).isEqualTo("1.2.3");
|
||||
assertThat(mainAttributes.getValue("Built-By")).isEqualTo("Spring");
|
||||
assertThat(mainAttributes.getValue("Build-Jdk-Spec")).isEqualTo("17");
|
||||
@@ -146,9 +146,9 @@ class ConventionsPluginTests {
|
||||
assertThatNoticeIsPresent(jar);
|
||||
Attributes mainAttributes = jar.getManifest().getMainAttributes();
|
||||
assertThat(mainAttributes.getValue("Implementation-Title"))
|
||||
.isEqualTo("Javadoc for " + this.projectDir.getName());
|
||||
.isEqualTo("Javadoc for " + this.projectDir.getName());
|
||||
assertThat(mainAttributes.getValue("Automatic-Module-Name"))
|
||||
.isEqualTo(this.projectDir.getName().replace("-", "."));
|
||||
.isEqualTo(this.projectDir.getName().replace("-", "."));
|
||||
assertThat(mainAttributes.getValue("Implementation-Version")).isEqualTo("1.2.3");
|
||||
assertThat(mainAttributes.getValue("Built-By")).isEqualTo("Spring");
|
||||
assertThat(mainAttributes.getValue("Build-Jdk-Spec")).isEqualTo("17");
|
||||
@@ -186,7 +186,8 @@ class ConventionsPluginTests {
|
||||
out.println("}");
|
||||
}
|
||||
assertThat(runGradle(Collections.singletonMap("CI", "true"), "retryConfig", "--stacktrace").getOutput())
|
||||
.contains("maxRetries: 3").contains("failOnPassedAfterRetry: true");
|
||||
.contains("maxRetries: 3")
|
||||
.contains("failOnPassedAfterRetry: true");
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -207,7 +208,8 @@ class ConventionsPluginTests {
|
||||
out.println("}");
|
||||
}
|
||||
assertThat(runGradle(Collections.singletonMap("CI", "local"), "retryConfig", "--stacktrace").getOutput())
|
||||
.contains("maxRetries: 0").contains("failOnPassedAfterRetry: true");
|
||||
.contains("maxRetries: 0")
|
||||
.contains("failOnPassedAfterRetry: true");
|
||||
}
|
||||
|
||||
private BuildResult runGradle(String... args) {
|
||||
@@ -215,8 +217,12 @@ class ConventionsPluginTests {
|
||||
}
|
||||
|
||||
private BuildResult runGradle(Map<String, String> environment, String... args) {
|
||||
return GradleRunner.create().withProjectDir(this.projectDir).withEnvironment(environment).withArguments(args)
|
||||
.withPluginClasspath().build();
|
||||
return GradleRunner.create()
|
||||
.withProjectDir(this.projectDir)
|
||||
.withEnvironment(environment)
|
||||
.withArguments(args)
|
||||
.withPluginClasspath()
|
||||
.build();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -48,7 +48,8 @@ class PackageTangleCheckTests {
|
||||
assertThatExceptionOfType(GradleException.class).isThrownBy(packageTangleCheck::checkForPackageTangles);
|
||||
assertThat(
|
||||
new File(packageTangleCheck.getProject().getBuildDir(), "checkForPackageTangles/failure-report.txt")
|
||||
.length()).isGreaterThan(0);
|
||||
.length())
|
||||
.isGreaterThan(0);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -58,7 +59,8 @@ class PackageTangleCheckTests {
|
||||
packageTangleCheck.checkForPackageTangles();
|
||||
assertThat(
|
||||
new File(packageTangleCheck.getProject().getBuildDir(), "checkForPackageTangles/failure-report.txt")
|
||||
.length()).isEqualTo(0);
|
||||
.length())
|
||||
.isEqualTo(0);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -67,8 +69,9 @@ class PackageTangleCheckTests {
|
||||
projectDir.mkdirs();
|
||||
copyClasses(classes, projectDir);
|
||||
Project project = ProjectBuilder.builder().withProjectDir(projectDir).build();
|
||||
PackageTangleCheck packageTangleCheck = project.getTasks().create("checkForPackageTangles",
|
||||
PackageTangleCheck.class, (task) -> task.setClasses(project.files("classes")));
|
||||
PackageTangleCheck packageTangleCheck = project.getTasks()
|
||||
.create("checkForPackageTangles", PackageTangleCheck.class,
|
||||
(task) -> task.setClasses(project.files("classes")));
|
||||
callback.accept(packageTangleCheck);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2021 the original author or authors.
|
||||
* Copyright 2012-2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -84,7 +84,7 @@ class ArtifactReleaseTests {
|
||||
Project project = ProjectBuilder.builder().build();
|
||||
project.setVersion("1.2.3");
|
||||
assertThat(ArtifactRelease.forProject(project).getDownloadRepo())
|
||||
.contains("https://repo.maven.apache.org/maven2");
|
||||
.contains("https://repo.maven.apache.org/maven2");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2022 the original author or authors.
|
||||
* Copyright 2012-2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -319,8 +319,12 @@ class BomPluginIntegrationTests {
|
||||
// }
|
||||
|
||||
private BuildResult runGradle(String... args) {
|
||||
return GradleRunner.create().withDebug(true).withProjectDir(this.projectDir).withArguments(args)
|
||||
.withPluginClasspath().build();
|
||||
return GradleRunner.create()
|
||||
.withDebug(true)
|
||||
.withProjectDir(this.projectDir)
|
||||
.withArguments(args)
|
||||
.withPluginClasspath()
|
||||
.build();
|
||||
}
|
||||
|
||||
private void generatePom(Consumer<NodeAssert> consumer) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2021 the original author or authors.
|
||||
* Copyright 2012-2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -33,7 +33,7 @@ class ConfigurationPropertiesTests {
|
||||
@Test
|
||||
void whenJsonHasAnIntegerDefaultValueThenItRemainsAnIntegerWhenRead() {
|
||||
ConfigurationProperties properties = ConfigurationProperties
|
||||
.fromFiles(Arrays.asList(new File("src/test/resources/spring-configuration-metadata.json")));
|
||||
.fromFiles(Arrays.asList(new File("src/test/resources/spring-configuration-metadata.json")));
|
||||
assertThat(properties.get("example.counter").getDefaultValue()).isEqualTo(0);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2022 the original author or authors.
|
||||
* Copyright 2012-2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -50,7 +50,8 @@ class PluginXmlParserTests {
|
||||
@Test
|
||||
void parseNonExistingFileThrowException() {
|
||||
assertThatThrownBy(() -> this.parser.parse(new File("src/test/resources/nonexistent.xml")))
|
||||
.isInstanceOf(RuntimeException.class).hasCauseInstanceOf(FileNotFoundException.class);
|
||||
.isInstanceOf(RuntimeException.class)
|
||||
.hasCauseInstanceOf(FileNotFoundException.class);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2022 the original author or authors.
|
||||
* Copyright 2012-2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -50,8 +50,12 @@ class TestFailuresPluginIntegrationTests {
|
||||
@Test
|
||||
void singleProject() {
|
||||
createProject(this.projectDir);
|
||||
BuildResult result = GradleRunner.create().withDebug(true).withProjectDir(this.projectDir)
|
||||
.withArguments("build").withPluginClasspath().buildAndFail();
|
||||
BuildResult result = GradleRunner.create()
|
||||
.withDebug(true)
|
||||
.withProjectDir(this.projectDir)
|
||||
.withArguments("build")
|
||||
.withPluginClasspath()
|
||||
.buildAndFail();
|
||||
assertThat(readLines(result.getOutput())).containsSequence("Found test failures in 1 test task:", "", ":test",
|
||||
" example.ExampleTests > bad()", " example.ExampleTests > fail()",
|
||||
" example.MoreTests > bad()", " example.MoreTests > fail()", "");
|
||||
@@ -60,8 +64,12 @@ class TestFailuresPluginIntegrationTests {
|
||||
@Test
|
||||
void multiProject() {
|
||||
createMultiProjectBuild();
|
||||
BuildResult result = GradleRunner.create().withDebug(true).withProjectDir(this.projectDir)
|
||||
.withArguments("build").withPluginClasspath().buildAndFail();
|
||||
BuildResult result = GradleRunner.create()
|
||||
.withDebug(true)
|
||||
.withProjectDir(this.projectDir)
|
||||
.withArguments("build")
|
||||
.withPluginClasspath()
|
||||
.buildAndFail();
|
||||
assertThat(readLines(result.getOutput())).containsSequence("Found test failures in 1 test task:", "",
|
||||
":project-one:test", " example.ExampleTests > bad()", " example.ExampleTests > fail()",
|
||||
" example.MoreTests > bad()", " example.MoreTests > fail()", "");
|
||||
@@ -70,8 +78,12 @@ class TestFailuresPluginIntegrationTests {
|
||||
@Test
|
||||
void multiProjectContinue() {
|
||||
createMultiProjectBuild();
|
||||
BuildResult result = GradleRunner.create().withDebug(true).withProjectDir(this.projectDir)
|
||||
.withArguments("build", "--continue").withPluginClasspath().buildAndFail();
|
||||
BuildResult result = GradleRunner.create()
|
||||
.withDebug(true)
|
||||
.withProjectDir(this.projectDir)
|
||||
.withArguments("build", "--continue")
|
||||
.withPluginClasspath()
|
||||
.buildAndFail();
|
||||
assertThat(readLines(result.getOutput())).containsSequence("Found test failures in 2 test tasks:", "",
|
||||
":project-one:test", " example.ExampleTests > bad()", " example.ExampleTests > fail()",
|
||||
" example.MoreTests > bad()", " example.MoreTests > fail()", "", ":project-two:test",
|
||||
@@ -82,8 +94,12 @@ class TestFailuresPluginIntegrationTests {
|
||||
@Test
|
||||
void multiProjectParallel() {
|
||||
createMultiProjectBuild();
|
||||
BuildResult result = GradleRunner.create().withDebug(true).withProjectDir(this.projectDir)
|
||||
.withArguments("build", "--parallel", "--stacktrace").withPluginClasspath().buildAndFail();
|
||||
BuildResult result = GradleRunner.create()
|
||||
.withDebug(true)
|
||||
.withProjectDir(this.projectDir)
|
||||
.withArguments("build", "--parallel", "--stacktrace")
|
||||
.withPluginClasspath()
|
||||
.buildAndFail();
|
||||
assertThat(readLines(result.getOutput())).containsSequence("Found test failures in 2 test tasks:", "",
|
||||
":project-one:test", " example.ExampleTests > bad()", " example.ExampleTests > fail()",
|
||||
" example.MoreTests > bad()", " example.MoreTests > fail()", "", ":project-two:test",
|
||||
|
||||
Reference in New Issue
Block a user