diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle index 7d0027111ba2..65414c8b14a6 100644 --- a/buildSrc/build.gradle +++ b/buildSrc/build.gradle @@ -1,6 +1,7 @@ plugins { id 'java-gradle-plugin' id 'checkstyle' + id 'io.spring.javaformat' version "${javaFormatVersion}" } repositories { @@ -8,6 +9,11 @@ repositories { gradlePluginPortal() } +tasks.named('compileJava') { + dependsOn 'format' + mustRunAfter 'format' +} + ext { def propertiesFile = new File(new File("$projectDir").parentFile, "gradle.properties") propertiesFile.withInputStream { @@ -64,4 +70,4 @@ test { useJUnitPlatform() } -jar.dependsOn check +jar.dependsOn check \ No newline at end of file diff --git a/buildSrc/gradle.properties b/buildSrc/gradle.properties index 361684dbe054..cac3a26374dc 100644 --- a/buildSrc/gradle.properties +++ b/buildSrc/gradle.properties @@ -1,4 +1,4 @@ org.gradle.caching=true assertjVersion=3.27.3 -javaFormatVersion=0.0.43 +javaFormatVersion=0.0.47 junitVersion=5.12.2 diff --git a/buildSrc/src/main/java/org/springframework/build/CheckstyleConventions.java b/buildSrc/src/main/java/org/springframework/build/CheckstyleConventions.java index e2098feb7b0a..d9c306c69631 100644 --- a/buildSrc/src/main/java/org/springframework/build/CheckstyleConventions.java +++ b/buildSrc/src/main/java/org/springframework/build/CheckstyleConventions.java @@ -53,9 +53,11 @@ public void apply(Project project) { checkstyle.setToolVersion("10.25.0"); checkstyle.getConfigDirectory().set(project.getRootProject().file("src/checkstyle")); 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)); + DependencySet checkstyleDependencies = project.getConfigurations() + .getByName("checkstyle") + .getDependencies(); + checkstyleDependencies + .add(project.getDependencies().create("io.spring.javaformat:spring-javaformat-checkstyle:" + version)); }); } @@ -63,8 +65,9 @@ private static void configureNoHttpPlugin(Project project) { project.getPlugins().apply(NoHttpPlugin.class); NoHttpExtension noHttp = project.getExtensions().getByType(NoHttpExtension.class); noHttp.setAllowlistFile(project.file("src/nohttp/allowlist.lines")); - noHttp.getSource().exclude("**/test-output/**", "**/.settings/**", "**/.classpath", - "**/.project", "**/.gradle/**", "**/node_modules/**", "**/spring-jcl/**", "buildSrc/build/**"); + noHttp.getSource() + .exclude("**/test-output/**", "**/.settings/**", "**/.classpath", "**/.project", "**/.gradle/**", + "**/node_modules/**", "**/spring-jcl/**", "buildSrc/build/**"); List buildFolders = List.of("bin", "build", "out"); project.allprojects(subproject -> { Path rootPath = project.getRootDir().toPath(); diff --git a/buildSrc/src/main/java/org/springframework/build/ConventionsPlugin.java b/buildSrc/src/main/java/org/springframework/build/ConventionsPlugin.java index 6dd95742465b..b2e11b56a6dd 100644 --- a/buildSrc/src/main/java/org/springframework/build/ConventionsPlugin.java +++ b/buildSrc/src/main/java/org/springframework/build/ConventionsPlugin.java @@ -27,11 +27,12 @@ * Plugin to apply conventions to projects that are part of Spring Framework's build. * Conventions are applied in response to various plugins being applied. * - *

When the {@link JavaBasePlugin} is applied, the conventions in {@link CheckstyleConventions}, - * {@link TestConventions} and {@link JavaConventions} are applied. - * The {@link ArchitecturePlugin} plugin is also applied. - * When the {@link KotlinBasePlugin} is applied, the conventions in {@link KotlinConventions} - * are applied. + *

+ * When the {@link JavaBasePlugin} is applied, the conventions in + * {@link CheckstyleConventions}, {@link TestConventions} and {@link JavaConventions} are + * applied. The {@link ArchitecturePlugin} plugin is also applied. When the + * {@link KotlinBasePlugin} is applied, the conventions in {@link KotlinConventions} are + * applied. * * @author Brian Clozel */ diff --git a/buildSrc/src/main/java/org/springframework/build/JavaConventions.java b/buildSrc/src/main/java/org/springframework/build/JavaConventions.java index 52add8eb7804..48dbc658f229 100644 --- a/buildSrc/src/main/java/org/springframework/build/JavaConventions.java +++ b/buildSrc/src/main/java/org/springframework/build/JavaConventions.java @@ -42,30 +42,26 @@ public class JavaConventions { /** * The Java version we should use as the JVM baseline for building the project. - *

NOTE: If you update this value, you should also update the value used in - * the {@code javadoc} task in {@code framework-api.gradle}. + *

+ * NOTE: If you update this value, you should also update the value used in the + * {@code javadoc} task in {@code framework-api.gradle}. */ private static final JavaLanguageVersion DEFAULT_LANGUAGE_VERSION = JavaLanguageVersion.of(24); /** - * The Java version we should use as the baseline for the compiled bytecode - * (the "-release" compiler argument). + * The Java version we should use as the baseline for the compiled bytecode (the + * "-release" compiler argument). */ private static final JavaLanguageVersion DEFAULT_RELEASE_VERSION = JavaLanguageVersion.of(17); static { - List commonCompilerArgs = List.of( - "-Xlint:serial", "-Xlint:cast", "-Xlint:classfile", "-Xlint:dep-ann", - "-Xlint:divzero", "-Xlint:empty", "-Xlint:finally", "-Xlint:overrides", - "-Xlint:path", "-Xlint:processing", "-Xlint:static", "-Xlint:try", "-Xlint:-options", - "-parameters" - ); + List commonCompilerArgs = List.of("-Xlint:serial", "-Xlint:cast", "-Xlint:classfile", "-Xlint:dep-ann", + "-Xlint:divzero", "-Xlint:empty", "-Xlint:finally", "-Xlint:overrides", "-Xlint:path", + "-Xlint:processing", "-Xlint:static", "-Xlint:try", "-Xlint:-options", "-parameters"); COMPILER_ARGS = new ArrayList<>(); COMPILER_ARGS.addAll(commonCompilerArgs); - COMPILER_ARGS.addAll(List.of( - "-Xlint:varargs", "-Xlint:fallthrough", "-Xlint:rawtypes", "-Xlint:deprecation", - "-Xlint:unchecked", "-Werror" - )); + COMPILER_ARGS.addAll(List.of("-Xlint:varargs", "-Xlint:fallthrough", "-Xlint:rawtypes", "-Xlint:deprecation", + "-Xlint:unchecked", "-Werror")); TEST_COMPILER_ARGS = new ArrayList<>(); TEST_COMPILER_ARGS.addAll(commonCompilerArgs); TEST_COMPILER_ARGS.addAll(List.of("-Xlint:-varargs", "-Xlint:-fallthrough", "-Xlint:-rawtypes", @@ -96,21 +92,23 @@ private static void applyToolchainConventions(Project project) { */ private void applyJavaCompileConventions(Project project) { project.afterEvaluate(p -> { - p.getTasks().withType(JavaCompile.class) - .matching(compileTask -> compileTask.getName().startsWith(JavaPlugin.COMPILE_JAVA_TASK_NAME)) - .forEach(compileTask -> { - compileTask.getOptions().setCompilerArgs(COMPILER_ARGS); - compileTask.getOptions().setEncoding("UTF-8"); - setJavaRelease(compileTask); - }); - p.getTasks().withType(JavaCompile.class) - .matching(compileTask -> compileTask.getName().startsWith(JavaPlugin.COMPILE_TEST_JAVA_TASK_NAME) - || compileTask.getName().equals("compileTestFixturesJava")) - .forEach(compileTask -> { - compileTask.getOptions().setCompilerArgs(TEST_COMPILER_ARGS); - compileTask.getOptions().setEncoding("UTF-8"); - setJavaRelease(compileTask); - }); + p.getTasks() + .withType(JavaCompile.class) + .matching(compileTask -> compileTask.getName().startsWith(JavaPlugin.COMPILE_JAVA_TASK_NAME)) + .forEach(compileTask -> { + compileTask.getOptions().setCompilerArgs(COMPILER_ARGS); + compileTask.getOptions().setEncoding("UTF-8"); + setJavaRelease(compileTask); + }); + p.getTasks() + .withType(JavaCompile.class) + .matching(compileTask -> compileTask.getName().startsWith(JavaPlugin.COMPILE_TEST_JAVA_TASK_NAME) + || compileTask.getName().equals("compileTestFixturesJava")) + .forEach(compileTask -> { + compileTask.getOptions().setCompilerArgs(TEST_COMPILER_ARGS); + compileTask.getOptions().setEncoding("UTF-8"); + setJavaRelease(compileTask); + }); }); } @@ -123,7 +121,7 @@ private void setJavaRelease(JavaCompile task) { int defaultVersion = DEFAULT_RELEASE_VERSION.asInt(); int releaseVersion = defaultVersion; int compilerVersion = task.getJavaCompiler().get().getMetadata().getLanguageVersion().asInt(); - for (int version = defaultVersion ; version <= compilerVersion ; version++) { + for (int version = defaultVersion; version <= compilerVersion; version++) { if (task.getName().contains("Java" + version)) { releaseVersion = version; break; diff --git a/buildSrc/src/main/java/org/springframework/build/KotlinConventions.java b/buildSrc/src/main/java/org/springframework/build/KotlinConventions.java index b3c742a834c7..2c6b05c61b5c 100644 --- a/buildSrc/src/main/java/org/springframework/build/KotlinConventions.java +++ b/buildSrc/src/main/java/org/springframework/build/KotlinConventions.java @@ -28,8 +28,9 @@ public 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) { @@ -39,11 +40,14 @@ private void configure(KotlinCompile compile) { options.getJvmTarget().set(JvmTarget.JVM_17); options.getJavaParameters().set(true); options.getAllWarningsAsErrors().set(true); - options.getFreeCompilerArgs().addAll( - "-Xsuppress-version-warnings", - "-Xjsr305=strict", // For dependencies using JSR 305 - "-opt-in=kotlin.RequiresOptIn", - "-Xjdk-release=17" // Needed due to https://youtrack.jetbrains.com/issue/KT-49746 + options.getFreeCompilerArgs() + .addAll("-Xsuppress-version-warnings", "-Xjsr305=strict", // For + // dependencies + // using JSR + // 305 + "-opt-in=kotlin.RequiresOptIn", "-Xjdk-release=17" // Needed due + // to + // https://youtrack.jetbrains.com/issue/KT-49746 ); }); } diff --git a/buildSrc/src/main/java/org/springframework/build/SpringFrameworkExtension.java b/buildSrc/src/main/java/org/springframework/build/SpringFrameworkExtension.java index 0d66aee84abd..b349a1d2bb0a 100644 --- a/buildSrc/src/main/java/org/springframework/build/SpringFrameworkExtension.java +++ b/buildSrc/src/main/java/org/springframework/build/SpringFrameworkExtension.java @@ -31,10 +31,13 @@ public class SpringFrameworkExtension { public SpringFrameworkExtension(Project project) { this.enableJavaPreviewFeatures = project.getObjects().property(Boolean.class); - project.getTasks().withType(JavaCompile.class).configureEach(javaCompile -> - javaCompile.getOptions().getCompilerArgumentProviders().add(asArgumentProvider())); - project.getTasks().withType(Test.class).configureEach(test -> - test.getJvmArgumentProviders().add(asArgumentProvider())); + project.getTasks() + .withType(JavaCompile.class) + .configureEach( + javaCompile -> javaCompile.getOptions().getCompilerArgumentProviders().add(asArgumentProvider())); + project.getTasks() + .withType(Test.class) + .configureEach(test -> test.getJvmArgumentProviders().add(asArgumentProvider())); } @@ -50,4 +53,5 @@ private CommandLineArgumentProvider asArgumentProvider() { return Collections.emptyList(); }; } + } diff --git a/buildSrc/src/main/java/org/springframework/build/TestConventions.java b/buildSrc/src/main/java/org/springframework/build/TestConventions.java index b9994988fa3c..52650fe9b723 100644 --- a/buildSrc/src/main/java/org/springframework/build/TestConventions.java +++ b/buildSrc/src/main/java/org/springframework/build/TestConventions.java @@ -30,8 +30,8 @@ * Conventions that are applied in the presence of the {@link JavaBasePlugin}. When the * plugin is applied: *

* * @author Brian Clozel @@ -45,11 +45,10 @@ void apply(Project project) { } private void configureTestConventions(Project project) { - project.getTasks().withType(Test.class, - test -> { - configureTests(project, test); - configureTestRetryPlugin(project, test); - }); + project.getTasks().withType(Test.class, test -> { + configureTests(project, test); + configureTestRetryPlugin(project, test); + }); } private void configureTests(Project project, Test test) { @@ -60,18 +59,12 @@ private void configureTests(Project project, Test test) { } }); test.include("**/*Tests.class", "**/*Test.class"); - test.setSystemProperties(Map.of( - "java.awt.headless", "true", - "io.netty.leakDetection.level", "paranoid" - )); + test.setSystemProperties(Map.of("java.awt.headless", "true", "io.netty.leakDetection.level", "paranoid")); if (project.hasProperty("testGroups")) { test.systemProperty("testGroups", project.getProperties().get("testGroups")); } - test.jvmArgs( - "--add-opens=java.base/java.lang=ALL-UNNAMED", - "--add-opens=java.base/java.util=ALL-UNNAMED", - "-Xshare:off" - ); + test.jvmArgs("--add-opens=java.base/java.lang=ALL-UNNAMED", "--add-opens=java.base/java.util=ALL-UNNAMED", + "-Xshare:off"); } private void configureTestRetryPlugin(Project project, Test test) { diff --git a/buildSrc/src/main/java/org/springframework/build/architecture/ArchitectureCheck.java b/buildSrc/src/main/java/org/springframework/build/architecture/ArchitectureCheck.java index 0ee329acdfba..8114a75f4fc6 100644 --- a/buildSrc/src/main/java/org/springframework/build/architecture/ArchitectureCheck.java +++ b/buildSrc/src/main/java/org/springframework/build/architecture/ArchitectureCheck.java @@ -64,10 +64,8 @@ public abstract class ArchitectureCheck extends DefaultTask { public ArchitectureCheck() { getOutputDirectory().convention(getProject().getLayout().getBuildDirectory().dir(getName())); getProhibitObjectsRequireNonNull().convention(true); - getRules().addAll(packageInfoShouldBeNullMarked(), - classesShouldNotImportForbiddenTypes(), - javaClassesShouldNotImportKotlinAnnotations(), - allPackagesShouldBeFreeOfTangles(), + getRules().addAll(packageInfoShouldBeNullMarked(), classesShouldNotImportForbiddenTypes(), + javaClassesShouldNotImportKotlinAnnotations(), allPackagesShouldBeFreeOfTangles(), noClassesShouldCallStringToLowerCaseWithoutLocale(), noClassesShouldCallStringToUpperCaseWithoutLocale()); getRuleDescriptions().set(getRules().map((rules) -> rules.stream().map(ArchRule::getDescription).toList())); @@ -76,12 +74,12 @@ public ArchitectureCheck() { @TaskAction void checkArchitecture() throws IOException { JavaClasses javaClasses = new ClassFileImporter() - .importPaths(this.classes.getFiles().stream().map(File::toPath).toList()); + .importPaths(this.classes.getFiles().stream().map(File::toPath).toList()); List violations = getRules().get() - .stream() - .map((rule) -> rule.evaluate(javaClasses)) - .filter(EvaluationResult::hasViolation) - .toList(); + .stream() + .map((rule) -> rule.evaluate(javaClasses)) + .filter(EvaluationResult::hasViolation) + .toList(); File outputFile = getOutputDirectory().file("failure-report.txt").get().getAsFile(); outputFile.getParentFile().mkdirs(); if (!violations.isEmpty()) { @@ -134,4 +132,5 @@ final FileTree getInputClasses() { // The rules themselves can't be an input as they aren't serializable so we use // their descriptions instead abstract ListProperty getRuleDescriptions(); + } diff --git a/buildSrc/src/main/java/org/springframework/build/architecture/ArchitecturePlugin.java b/buildSrc/src/main/java/org/springframework/build/architecture/ArchitecturePlugin.java index 7fbc8632742a..39c48ca69653 100644 --- a/buildSrc/src/main/java/org/springframework/build/architecture/ArchitecturePlugin.java +++ b/buildSrc/src/main/java/org/springframework/build/architecture/ArchitecturePlugin.java @@ -48,15 +48,14 @@ private void registerTasks(Project project) { continue; } TaskProvider checkArchitecture = project.getTasks() - .register(taskName(sourceSet), ArchitectureCheck.class, - (task) -> { - task.setClasses(sourceSet.getOutput().getClassesDirs()); - task.getResourcesDirectory().set(sourceSet.getOutput().getResourcesDir()); - task.dependsOn(sourceSet.getProcessResourcesTaskName()); - task.setDescription("Checks the architecture of the classes of the " + sourceSet.getName() - + " source set."); - task.setGroup(LifecycleBasePlugin.VERIFICATION_GROUP); - }); + .register(taskName(sourceSet), ArchitectureCheck.class, (task) -> { + task.setClasses(sourceSet.getOutput().getClassesDirs()); + task.getResourcesDirectory().set(sourceSet.getOutput().getResourcesDir()); + task.dependsOn(sourceSet.getProcessResourcesTaskName()); + task.setDescription( + "Checks the architecture of the classes of the " + sourceSet.getName() + " source set."); + task.setGroup(LifecycleBasePlugin.VERIFICATION_GROUP); + }); architectureChecks.add(checkArchitecture); } if (!architectureChecks.isEmpty()) { @@ -66,8 +65,7 @@ private void registerTasks(Project project) { } private static String taskName(SourceSet sourceSet) { - return "checkArchitecture" - + sourceSet.getName().substring(0, 1).toUpperCase() + return "checkArchitecture" + sourceSet.getName().substring(0, 1).toUpperCase() + sourceSet.getName().substring(1); } diff --git a/buildSrc/src/main/java/org/springframework/build/architecture/ArchitectureRules.java b/buildSrc/src/main/java/org/springframework/build/architecture/ArchitectureRules.java index b179a0a34f8b..162dcf9e1a48 100644 --- a/buildSrc/src/main/java/org/springframework/build/architecture/ArchitectureRules.java +++ b/buildSrc/src/main/java/org/springframework/build/architecture/ArchitectureRules.java @@ -28,64 +28,61 @@ abstract class ArchitectureRules { static ArchRule allPackagesShouldBeFreeOfTangles() { - return SlicesRuleDefinition.slices() - .assignedFrom(new SpringSlices()).should().beFreeOfCycles(); + return SlicesRuleDefinition.slices().assignedFrom(new SpringSlices()).should().beFreeOfCycles(); } static ArchRule noClassesShouldCallStringToLowerCaseWithoutLocale() { return ArchRuleDefinition.noClasses() - .should() - .callMethod(String.class, "toLowerCase") - .because("String.toLowerCase(Locale.ROOT) should be used instead"); + .should() + .callMethod(String.class, "toLowerCase") + .because("String.toLowerCase(Locale.ROOT) should be used instead"); } static ArchRule noClassesShouldCallStringToUpperCaseWithoutLocale() { return ArchRuleDefinition.noClasses() - .should() - .callMethod(String.class, "toUpperCase") - .because("String.toUpperCase(Locale.ROOT) should be used instead"); + .should() + .callMethod(String.class, "toUpperCase") + .because("String.toUpperCase(Locale.ROOT) should be used instead"); } static ArchRule packageInfoShouldBeNullMarked() { return ArchRuleDefinition.classes() - .that().haveSimpleName("package-info") - .should().beAnnotatedWith("org.jspecify.annotations.NullMarked") - .allowEmptyShould(true); + .that() + .haveSimpleName("package-info") + .should() + .beAnnotatedWith("org.jspecify.annotations.NullMarked") + .allowEmptyShould(true); } static ArchRule classesShouldNotImportForbiddenTypes() { return ArchRuleDefinition.noClasses() - .should().dependOnClassesThat() - .haveFullyQualifiedName("reactor.core.support.Assert") - .orShould().dependOnClassesThat() - .haveFullyQualifiedName("org.slf4j.LoggerFactory") - .orShould().dependOnClassesThat() - .haveFullyQualifiedName("org.springframework.lang.NonNull") - .orShould().dependOnClassesThat() - .haveFullyQualifiedName("org.springframework.lang.Nullable"); + .should() + .dependOnClassesThat() + .haveFullyQualifiedName("reactor.core.support.Assert") + .orShould() + .dependOnClassesThat() + .haveFullyQualifiedName("org.slf4j.LoggerFactory") + .orShould() + .dependOnClassesThat() + .haveFullyQualifiedName("org.springframework.lang.NonNull") + .orShould() + .dependOnClassesThat() + .haveFullyQualifiedName("org.springframework.lang.Nullable"); } static ArchRule javaClassesShouldNotImportKotlinAnnotations() { - return ArchRuleDefinition.noClasses() - .that(new DescribedPredicate("is not a Kotlin class") { - @Override - public boolean test(JavaClass javaClass) { - return javaClass.getSourceCodeLocation() - .getSourceFileName().endsWith(".java"); - } - } - ) - .should().dependOnClassesThat() - .resideInAnyPackage("org.jetbrains.annotations..") - .allowEmptyShould(true); + return ArchRuleDefinition.noClasses().that(new DescribedPredicate("is not a Kotlin class") { + @Override + public boolean test(JavaClass javaClass) { + return javaClass.getSourceCodeLocation().getSourceFileName().endsWith(".java"); + } + }).should().dependOnClassesThat().resideInAnyPackage("org.jetbrains.annotations..").allowEmptyShould(true); } static class SpringSlices implements SliceAssignment { - private final List ignoredPackages = List.of("org.springframework.asm", - "org.springframework.cglib", - "org.springframework.javapoet", - "org.springframework.objenesis"); + private final List ignoredPackages = List.of("org.springframework.asm", "org.springframework.cglib", + "org.springframework.javapoet", "org.springframework.objenesis"); @Override public SliceIdentifier getIdentifierOf(JavaClass javaClass) { @@ -103,5 +100,7 @@ public SliceIdentifier getIdentifierOf(JavaClass javaClass) { public String getDescription() { return "Spring Framework Slices"; } + } + } diff --git a/buildSrc/src/main/java/org/springframework/build/dev/LocalDevelopmentPlugin.java b/buildSrc/src/main/java/org/springframework/build/dev/LocalDevelopmentPlugin.java index c9c74933d6f7..60281f40d2b5 100644 --- a/buildSrc/src/main/java/org/springframework/build/dev/LocalDevelopmentPlugin.java +++ b/buildSrc/src/main/java/org/springframework/build/dev/LocalDevelopmentPlugin.java @@ -21,7 +21,8 @@ import org.gradle.api.plugins.JavaBasePlugin; /** - * {@link Plugin} that skips documentation tasks when the {@code "-PskipDocs"} property is defined. + * {@link Plugin} that skips documentation tasks when the {@code "-PskipDocs"} property is + * defined. * * @author Brian Clozel */ @@ -40,10 +41,10 @@ public void apply(Project target) { private void skipDocumentationTasks(Project project) { project.afterEvaluate(p -> { p.getTasks().matching(task -> { - return JavaBasePlugin.DOCUMENTATION_GROUP.equals(task.getGroup()) - || "distribution".equals(task.getGroup()); - }) - .forEach(task -> task.setEnabled(false)); + return JavaBasePlugin.DOCUMENTATION_GROUP.equals(task.getGroup()) + || "distribution".equals(task.getGroup()); + }).forEach(task -> task.setEnabled(false)); }); } + } diff --git a/buildSrc/src/main/java/org/springframework/build/hint/RuntimeHintsAgentArgumentProvider.java b/buildSrc/src/main/java/org/springframework/build/hint/RuntimeHintsAgentArgumentProvider.java index 823bf7cb7fb2..b5cb0e63ab8c 100644 --- a/buildSrc/src/main/java/org/springframework/build/hint/RuntimeHintsAgentArgumentProvider.java +++ b/buildSrc/src/main/java/org/springframework/build/hint/RuntimeHintsAgentArgumentProvider.java @@ -32,17 +32,18 @@ public interface RuntimeHintsAgentArgumentProvider extends CommandLineArgumentPr @Classpath ConfigurableFileCollection getAgentJar(); - @Input - SetProperty getIncludedPackages(); - - @Input - SetProperty getExcludedPackages(); - - @Override - default Iterable asArguments() { - StringBuilder packages = new StringBuilder(); - getIncludedPackages().get().forEach(packageName -> packages.append('+').append(packageName).append(',')); - getExcludedPackages().get().forEach(packageName -> packages.append('-').append(packageName).append(',')); - return Collections.singleton("-javaagent:" + getAgentJar().getSingleFile() + "=" + packages); - } + @Input + SetProperty getIncludedPackages(); + + @Input + SetProperty getExcludedPackages(); + + @Override + default Iterable asArguments() { + StringBuilder packages = new StringBuilder(); + getIncludedPackages().get().forEach(packageName -> packages.append('+').append(packageName).append(',')); + getExcludedPackages().get().forEach(packageName -> packages.append('-').append(packageName).append(',')); + return Collections.singleton("-javaagent:" + getAgentJar().getSingleFile() + "=" + packages); + } + } diff --git a/buildSrc/src/main/java/org/springframework/build/hint/RuntimeHintsAgentExtension.java b/buildSrc/src/main/java/org/springframework/build/hint/RuntimeHintsAgentExtension.java index 816ed59ba652..3f7f418ffcfd 100644 --- a/buildSrc/src/main/java/org/springframework/build/hint/RuntimeHintsAgentExtension.java +++ b/buildSrc/src/main/java/org/springframework/build/hint/RuntimeHintsAgentExtension.java @@ -20,6 +20,7 @@ /** * Entry point to the DSL extension for the {@link RuntimeHintsAgentPlugin} Gradle plugin. + * * @author Brian Clozel */ public interface RuntimeHintsAgentExtension { @@ -27,4 +28,5 @@ public interface RuntimeHintsAgentExtension { SetProperty getIncludedPackages(); SetProperty getExcludedPackages(); + } diff --git a/buildSrc/src/main/java/org/springframework/build/hint/RuntimeHintsAgentPlugin.java b/buildSrc/src/main/java/org/springframework/build/hint/RuntimeHintsAgentPlugin.java index 04e63532b506..87e6b9e4516a 100644 --- a/buildSrc/src/main/java/org/springframework/build/hint/RuntimeHintsAgentPlugin.java +++ b/buildSrc/src/main/java/org/springframework/build/hint/RuntimeHintsAgentPlugin.java @@ -42,9 +42,10 @@ public class RuntimeHintsAgentPlugin implements Plugin { public static final String RUNTIMEHINTS_TEST_TASK = "runtimeHintsTest"; + private static final String EXTENSION_NAME = "runtimeHintsAgent"; - private static final String CONFIGURATION_NAME = "testRuntimeHintsAgentJar"; + private static final String CONFIGURATION_NAME = "testRuntimeHintsAgentJar"; @Override public void apply(Project project) { @@ -70,15 +71,17 @@ public void apply(Project project) { } private static RuntimeHintsAgentExtension createRuntimeHintsAgentExtension(Project project) { - RuntimeHintsAgentExtension agentExtension = project.getExtensions().create(EXTENSION_NAME, RuntimeHintsAgentExtension.class); + RuntimeHintsAgentExtension agentExtension = project.getExtensions() + .create(EXTENSION_NAME, RuntimeHintsAgentExtension.class); agentExtension.getIncludedPackages().convention(Collections.singleton("org.springframework")); agentExtension.getExcludedPackages().convention(Collections.emptySet()); return agentExtension; } - private static RuntimeHintsAgentArgumentProvider createRuntimeHintsAgentArgumentProvider( - Project project, RuntimeHintsAgentExtension agentExtension) { - RuntimeHintsAgentArgumentProvider agentArgumentProvider = project.getObjects().newInstance(RuntimeHintsAgentArgumentProvider.class); + private static RuntimeHintsAgentArgumentProvider createRuntimeHintsAgentArgumentProvider(Project project, + RuntimeHintsAgentExtension agentExtension) { + RuntimeHintsAgentArgumentProvider agentArgumentProvider = project.getObjects() + .newInstance(RuntimeHintsAgentArgumentProvider.class); agentArgumentProvider.getAgentJar().from(createRuntimeHintsAgentConfiguration(project)); agentArgumentProvider.getIncludedPackages().set(agentExtension.getIncludedPackages()); agentArgumentProvider.getExcludedPackages().set(agentExtension.getExcludedPackages()); @@ -90,12 +93,18 @@ private static Configuration createRuntimeHintsAgentConfiguration(Project projec configuration.setCanBeConsumed(false); configuration.setTransitive(false); // Only the built artifact is required configuration.attributes(attributes -> { - attributes.attribute(Bundling.BUNDLING_ATTRIBUTE, project.getObjects().named(Bundling.class, Bundling.EXTERNAL)); - attributes.attribute(Category.CATEGORY_ATTRIBUTE, project.getObjects().named(Category.class, Category.LIBRARY)); - attributes.attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, project.getObjects().named(LibraryElements.class, LibraryElements.JAR)); - attributes.attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, Integer.valueOf(JavaVersion.current().getMajorVersion())); - attributes.attribute(Usage.USAGE_ATTRIBUTE, project.getObjects().named(Usage.class, Usage.JAVA_RUNTIME)); + attributes.attribute(Bundling.BUNDLING_ATTRIBUTE, + project.getObjects().named(Bundling.class, Bundling.EXTERNAL)); + attributes.attribute(Category.CATEGORY_ATTRIBUTE, + project.getObjects().named(Category.class, Category.LIBRARY)); + attributes.attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, + project.getObjects().named(LibraryElements.class, LibraryElements.JAR)); + attributes.attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, + Integer.valueOf(JavaVersion.current().getMajorVersion())); + attributes.attribute(Usage.USAGE_ATTRIBUTE, + project.getObjects().named(Usage.class, Usage.JAVA_RUNTIME)); }); }); } + } diff --git a/buildSrc/src/main/java/org/springframework/build/multirelease/MultiReleaseExtension.java b/buildSrc/src/main/java/org/springframework/build/multirelease/MultiReleaseExtension.java index cd506f9c2938..c7a2ef870171 100644 --- a/buildSrc/src/main/java/org/springframework/build/multirelease/MultiReleaseExtension.java +++ b/buildSrc/src/main/java/org/springframework/build/multirelease/MultiReleaseExtension.java @@ -40,18 +40,20 @@ * @author Brian Clozel */ public abstract class MultiReleaseExtension { + private final TaskContainer tasks; + private final SourceSetContainer sourceSets; + private final DependencyHandler dependencies; + private final ObjectFactory objects; + private final ConfigurationContainer configurations; @Inject - public MultiReleaseExtension(SourceSetContainer sourceSets, - ConfigurationContainer configurations, - TaskContainer tasks, - DependencyHandler dependencies, - ObjectFactory objectFactory) { + public MultiReleaseExtension(SourceSetContainer sourceSets, ConfigurationContainer configurations, + TaskContainer tasks, DependencyHandler dependencies, ObjectFactory objectFactory) { this.sourceSets = sourceSets; this.configurations = configurations; this.tasks = tasks; @@ -72,40 +74,46 @@ private void releaseVersions(String mainSourceDirectory, String testSourceDirect private void addLanguageVersion(int javaVersion, String mainSourceDirectory, String testSourceDirectory) { String javaN = "java" + javaVersion; - SourceSet langSourceSet = sourceSets.create(javaN, srcSet -> srcSet.getJava().srcDir(mainSourceDirectory + javaN)); - SourceSet testSourceSet = sourceSets.create(javaN + "Test", srcSet -> srcSet.getJava().srcDir(testSourceDirectory + javaN)); + SourceSet langSourceSet = sourceSets.create(javaN, + srcSet -> srcSet.getJava().srcDir(mainSourceDirectory + javaN)); + SourceSet testSourceSet = sourceSets.create(javaN + "Test", + srcSet -> srcSet.getJava().srcDir(testSourceDirectory + javaN)); SourceSet sharedSourceSet = sourceSets.findByName(SourceSet.MAIN_SOURCE_SET_NAME); SourceSet sharedTestSourceSet = sourceSets.findByName(SourceSet.TEST_SOURCE_SET_NAME); - FileCollection mainClasses = objects.fileCollection().from(sourceSets.getByName(SourceSet.MAIN_SOURCE_SET_NAME).getOutput().getClassesDirs()); + FileCollection mainClasses = objects.fileCollection() + .from(sourceSets.getByName(SourceSet.MAIN_SOURCE_SET_NAME).getOutput().getClassesDirs()); dependencies.add(javaN + "Implementation", mainClasses); - tasks.named(langSourceSet.getCompileJavaTaskName(), JavaCompile.class, task -> - task.getOptions().getRelease().set(javaVersion) - ); - tasks.named(testSourceSet.getCompileJavaTaskName(), JavaCompile.class, task -> - task.getOptions().getRelease().set(javaVersion) - ); + tasks.named(langSourceSet.getCompileJavaTaskName(), JavaCompile.class, + task -> task.getOptions().getRelease().set(javaVersion)); + tasks.named(testSourceSet.getCompileJavaTaskName(), JavaCompile.class, + task -> task.getOptions().getRelease().set(javaVersion)); - TaskProvider testTask = createTestTask(javaVersion, testSourceSet, sharedTestSourceSet, langSourceSet, sharedSourceSet); + TaskProvider testTask = createTestTask(javaVersion, testSourceSet, sharedTestSourceSet, langSourceSet, + sharedSourceSet); tasks.named("check", task -> task.dependsOn(testTask)); configureMultiReleaseJar(javaVersion, langSourceSet); } - private TaskProvider createTestTask(int javaVersion, SourceSet testSourceSet, SourceSet sharedTestSourceSet, SourceSet langSourceSet, SourceSet sharedSourceSet) { + private TaskProvider createTestTask(int javaVersion, SourceSet testSourceSet, SourceSet sharedTestSourceSet, + SourceSet langSourceSet, SourceSet sharedSourceSet) { Configuration testImplementation = configurations.getByName(testSourceSet.getImplementationConfigurationName()); - testImplementation.extendsFrom(configurations.getByName(sharedTestSourceSet.getImplementationConfigurationName())); + testImplementation + .extendsFrom(configurations.getByName(sharedTestSourceSet.getImplementationConfigurationName())); Configuration testCompileOnly = configurations.getByName(testSourceSet.getCompileOnlyConfigurationName()); testCompileOnly.extendsFrom(configurations.getByName(sharedTestSourceSet.getCompileOnlyConfigurationName())); testCompileOnly.getDependencies().add(dependencies.create(langSourceSet.getOutput().getClassesDirs())); testCompileOnly.getDependencies().add(dependencies.create(sharedSourceSet.getOutput().getClassesDirs())); - Configuration testRuntimeClasspath = configurations.getByName(testSourceSet.getRuntimeClasspathConfigurationName()); + Configuration testRuntimeClasspath = configurations + .getByName(testSourceSet.getRuntimeClasspathConfigurationName()); // so here's the deal. MRjars are JARs! Which means that to execute tests, we need // the JAR on classpath, not just classes + resources as Gradle usually does testRuntimeClasspath.getAttributes() - .attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objects.named(LibraryElements.class, LibraryElements.JAR)); + .attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, + objects.named(LibraryElements.class, LibraryElements.JAR)); TaskProvider testTask = tasks.register("java" + javaVersion + "Test", Test.class, test -> { test.setGroup(LifecycleBasePlugin.VERIFICATION_GROUP); diff --git a/buildSrc/src/main/java/org/springframework/build/multirelease/MultiReleaseJarPlugin.java b/buildSrc/src/main/java/org/springframework/build/multirelease/MultiReleaseJarPlugin.java index 9e9c871d05cf..d6af5f8a1edc 100644 --- a/buildSrc/src/main/java/org/springframework/build/multirelease/MultiReleaseJarPlugin.java +++ b/buildSrc/src/main/java/org/springframework/build/multirelease/MultiReleaseJarPlugin.java @@ -30,8 +30,8 @@ import org.gradle.jvm.toolchain.JavaToolchainService; /** - * A plugin which adds support for building multi-release jars - * with Gradle. + * A plugin which adds support for building multi-release jars with Gradle. + * * @author Cedric Champeau * @author Brian Clozel * @see original project @@ -51,11 +51,8 @@ public void apply(Project project) { TaskContainer tasks = project.getTasks(); DependencyHandler dependencies = project.getDependencies(); ObjectFactory objects = project.getObjects(); - extensions.create("multiRelease", MultiReleaseExtension.class, - javaPluginExtension.getSourceSets(), - configurations, - tasks, - dependencies, - objects); + extensions.create("multiRelease", MultiReleaseExtension.class, javaPluginExtension.getSourceSets(), + configurations, tasks, dependencies, objects); } + } diff --git a/buildSrc/src/main/java/org/springframework/build/optional/OptionalDependenciesPlugin.java b/buildSrc/src/main/java/org/springframework/build/optional/OptionalDependenciesPlugin.java index a6549fb176e2..9f25269bad4f 100644 --- a/buildSrc/src/main/java/org/springframework/build/optional/OptionalDependenciesPlugin.java +++ b/buildSrc/src/main/java/org/springframework/build/optional/OptionalDependenciesPlugin.java @@ -26,8 +26,8 @@ /** * A {@code Plugin} that adds support for Maven-style optional dependencies. Creates a new * {@code optional} configuration. The {@code optional} configuration is part of the - * project's compile and runtime classpaths but does not affect the classpath of - * dependent projects. + * project's compile and runtime classpaths but does not affect the classpath of dependent + * projects. * * @author Andy Wilkinson */ @@ -44,11 +44,16 @@ public void apply(Project project) { optional.setCanBeConsumed(false); optional.setCanBeResolved(false); project.getPlugins().withType(JavaBasePlugin.class, (javaBasePlugin) -> { - 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); }); }); } diff --git a/buildSrc/src/main/java/org/springframework/build/shadow/ShadowSource.java b/buildSrc/src/main/java/org/springframework/build/shadow/ShadowSource.java index 7fb7e1b2d9a3..81f6a3a177b7 100644 --- a/buildSrc/src/main/java/org/springframework/build/shadow/ShadowSource.java +++ b/buildSrc/src/main/java/org/springframework/build/shadow/ShadowSource.java @@ -57,7 +57,6 @@ public class ShadowSource extends DefaultTask { private final List relocations = new ArrayList<>(); - @Classpath @Optional public List getConfigurations() { @@ -105,8 +104,9 @@ private List getSourceJarFiles() { private Set resolveSourceArtifacts(DependencyResult dependency) { ModuleComponentSelector componentSelector = (ModuleComponentSelector) dependency.getRequested(); - ArtifactResolutionQuery query = getProject().getDependencies().createArtifactResolutionQuery() - .forModule(componentSelector.getGroup(), componentSelector.getModule(), componentSelector.getVersion()); + ArtifactResolutionQuery query = getProject().getDependencies() + .createArtifactResolutionQuery() + .forModule(componentSelector.getGroup(), componentSelector.getModule(), componentSelector.getVersion()); return executeQuery(query).getResolvedComponents(); } @@ -145,7 +145,6 @@ private FileTree zipTree(File sourceJar) { return getProject().zipTree(sourceJar); } - /** * A single relocation. */ @@ -159,7 +158,6 @@ static class Relocation { private final String pathDestination; - Relocation(String pattern, String destination) { this.pattern = pattern; this.pathPattern = pattern.replace('.', '/'); @@ -167,7 +165,6 @@ static class Relocation { this.pathDestination = destination.replace('.', '/'); } - @Input public String getPattern() { return this.pattern; diff --git a/buildSrc/src/test/java/org/springframework/build/multirelease/MultiReleaseJarPluginTests.java b/buildSrc/src/test/java/org/springframework/build/multirelease/MultiReleaseJarPluginTests.java index a678d4506d45..62bdb7dd0aae 100644 --- a/buildSrc/src/test/java/org/springframework/build/multirelease/MultiReleaseJarPluginTests.java +++ b/buildSrc/src/test/java/org/springframework/build/multirelease/MultiReleaseJarPluginTests.java @@ -88,7 +88,7 @@ void configureToolchainReleaseVersion() throws IOException { BuildResult buildResult = runGradle("printReleaseVersion"); assertThat(buildResult.getOutput()).contains("compileJava21Java releaseVersion: 21") - .contains("compileJava21TestJava releaseVersion: 21"); + .contains("compileJava21TestJava releaseVersion: 21"); } @Test @@ -112,7 +112,7 @@ public class Main {} assertThat(mainAttributes.getValue("Multi-Release")).isEqualTo("true"); assertThat(jar.entries().asIterator()).toIterable() - .anyMatch(entry -> entry.getName().equals("META-INF/versions/17/Main.class")); + .anyMatch(entry -> entry.getName().equals("META-INF/versions/17/Main.class")); } } diff --git a/spring-context/src/main/java/org/springframework/scripting/config/ScriptBeanDefinitionParser.java b/spring-context/src/main/java/org/springframework/scripting/config/ScriptBeanDefinitionParser.java index 74b490e21e42..6968a550688e 100644 --- a/spring-context/src/main/java/org/springframework/scripting/config/ScriptBeanDefinitionParser.java +++ b/spring-context/src/main/java/org/springframework/scripting/config/ScriptBeanDefinitionParser.java @@ -184,7 +184,7 @@ else if (beanDefinitionDefaults.getDestroyMethodName() != null) { ConstructorArgumentValues cav = bd.getConstructorArgumentValues(); int constructorArgNum = 0; if (StringUtils.hasLength(engine)) { - cav.addIndexedArgumentValue(constructorArgNum++, engine); + cav.addIndexedArgumentValue(constructorArgNum++ , engine); } cav.addIndexedArgumentValue(constructorArgNum++, value); if (element.hasAttribute(SCRIPT_INTERFACES_ATTRIBUTE)) {