diff --git a/buildSrc/src/main/java/org/springframework/build/hint/RuntimeHintsAgentArgumentProvider.java b/buildSrc/src/main/java/org/springframework/build/hint/RuntimeHintsAgentArgumentProvider.java new file mode 100644 index 00000000000..1ad9405e1ae --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/build/hint/RuntimeHintsAgentArgumentProvider.java @@ -0,0 +1,48 @@ +/* + * Copyright 2002-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. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.build.hint; + +import org.gradle.api.file.ConfigurableFileCollection; +import org.gradle.api.provider.SetProperty; +import org.gradle.api.tasks.Classpath; +import org.gradle.api.tasks.Input; +import org.gradle.process.CommandLineArgumentProvider; + +import java.util.Collections; + +/** + * Argument provider for registering the runtime hints agent with a Java process. + */ +public interface RuntimeHintsAgentArgumentProvider extends CommandLineArgumentProvider { + + @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); + } +} \ No newline at end of file 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 45d7aad32c2..47995fcb70c 100644 --- a/buildSrc/src/main/java/org/springframework/build/hint/RuntimeHintsAgentExtension.java +++ b/buildSrc/src/main/java/org/springframework/build/hint/RuntimeHintsAgentExtension.java @@ -16,38 +16,15 @@ package org.springframework.build.hint; -import java.util.Collections; - -import org.gradle.api.model.ObjectFactory; import org.gradle.api.provider.SetProperty; /** * Entry point to the DSL extension for the {@link RuntimeHintsAgentPlugin} Gradle plugin. * @author Brian Clozel */ -public class RuntimeHintsAgentExtension { - - private final SetProperty includedPackages; - - private final SetProperty excludedPackages; - - public RuntimeHintsAgentExtension(ObjectFactory objectFactory) { - this.includedPackages = objectFactory.setProperty(String.class).convention(Collections.singleton("org.springframework")); - this.excludedPackages = objectFactory.setProperty(String.class).convention(Collections.emptySet()); - } - - public SetProperty getIncludedPackages() { - return this.includedPackages; - } +public interface RuntimeHintsAgentExtension { - public SetProperty getExcludedPackages() { - return this.excludedPackages; - } + SetProperty getIncludedPackages(); - String asJavaAgentArgument() { - StringBuilder builder = new StringBuilder(); - this.includedPackages.get().forEach(packageName -> builder.append('+').append(packageName).append(',')); - this.excludedPackages.get().forEach(packageName -> builder.append('-').append(packageName).append(',')); - return builder.toString(); - } + 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 c9df0b5b738..f4564530069 100644 --- a/buildSrc/src/main/java/org/springframework/build/hint/RuntimeHintsAgentPlugin.java +++ b/buildSrc/src/main/java/org/springframework/build/hint/RuntimeHintsAgentPlugin.java @@ -18,14 +18,10 @@ package org.springframework.build.hint; import org.gradle.api.Plugin; import org.gradle.api.Project; -import org.gradle.api.file.ConfigurableFileCollection; import org.gradle.api.plugins.JavaPlugin; -import org.gradle.api.provider.Property; -import org.gradle.api.tasks.Classpath; -import org.gradle.api.tasks.Input; +import org.gradle.api.tasks.TaskProvider; import org.gradle.api.tasks.bundling.Jar; import org.gradle.api.tasks.testing.Test; -import org.gradle.process.CommandLineArgumentProvider; import java.util.Collections; @@ -45,8 +41,7 @@ public class RuntimeHintsAgentPlugin implements Plugin { public void apply(Project project) { project.getPlugins().withType(JavaPlugin.class, javaPlugin -> { - RuntimeHintsAgentExtension agentExtension = project.getExtensions().create(EXTENSION_NAME, - RuntimeHintsAgentExtension.class, project.getObjects()); + RuntimeHintsAgentExtension agentExtension = createRuntimeHintsAgentExtension(project); Test agentTest = project.getTasks().create(RUNTIMEHINTS_TEST_TASK, Test.class, test -> { test.useJUnitPlatform(options -> { options.includeTags("RuntimeHintsTests"); @@ -54,33 +49,26 @@ public class RuntimeHintsAgentPlugin implements Plugin { test.include("**/*Tests.class", "**/*Test.class"); test.systemProperty("java.awt.headless", "true"); test.systemProperty("org.graalvm.nativeimage.imagecode", "runtime"); - }); - project.afterEvaluate(p -> { - agentTest.getJvmArgumentProviders().add(createRuntimeHintsAgentArgumentProvider(project, agentExtension)); + test.getJvmArgumentProviders().add(createRuntimeHintsAgentArgumentProvider(project, agentExtension)); }); project.getTasks().getByName("check", task -> task.dependsOn(agentTest)); }); } - private static RuntimeHintsAgentArgumentProvider createRuntimeHintsAgentArgumentProvider(Project project, RuntimeHintsAgentExtension agentExtension) { - Jar jar = project.getRootProject().project("spring-core-test").getTasks().withType(Jar.class).named("jar").get(); - RuntimeHintsAgentArgumentProvider agentArgumentProvider = project.getObjects().newInstance(RuntimeHintsAgentArgumentProvider.class); - agentArgumentProvider.getAgentJar().from(jar.getArchiveFile()); - agentArgumentProvider.getJavaAgentArgument().set(agentExtension.asJavaAgentArgument()); - return agentArgumentProvider; + private static RuntimeHintsAgentExtension createRuntimeHintsAgentExtension(Project project) { + RuntimeHintsAgentExtension agentExtension = project.getExtensions().create(EXTENSION_NAME, RuntimeHintsAgentExtension.class); + agentExtension.getIncludedPackages().convention(Collections.singleton("org.springframework")); + agentExtension.getExcludedPackages().convention(Collections.emptySet()); + return agentExtension; } - interface RuntimeHintsAgentArgumentProvider extends CommandLineArgumentProvider { - - @Classpath - ConfigurableFileCollection getAgentJar(); - - @Input - Property getJavaAgentArgument(); - - @Override - default Iterable asArguments() { - return Collections.singleton("-javaagent:" + getAgentJar().getSingleFile() + "=" + getJavaAgentArgument().get()); - } + private static RuntimeHintsAgentArgumentProvider createRuntimeHintsAgentArgumentProvider( + Project project, RuntimeHintsAgentExtension agentExtension) { + TaskProvider jar = project.getRootProject().project("spring-core-test").getTasks().named("jar", Jar.class); + RuntimeHintsAgentArgumentProvider agentArgumentProvider = project.getObjects().newInstance(RuntimeHintsAgentArgumentProvider.class); + agentArgumentProvider.getAgentJar().from(jar); + agentArgumentProvider.getIncludedPackages().set(agentExtension.getIncludedPackages()); + agentArgumentProvider.getExcludedPackages().set(agentExtension.getExcludedPackages()); + return agentArgumentProvider; } }