From cb18eb095b77ece4a454d2b20410b3611703b148 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Wed, 3 Aug 2022 13:54:50 +0100 Subject: [PATCH] Make transitive runtime dependencies available to AOT processing Closes gh-31970 --- .../gradle/plugin/SpringBootAotPlugin.java | 18 +++++++++++++----- .../SpringBootAotPluginIntegrationTests.java | 6 ++++++ ...veRuntimeDependenciesOnItsClasspath.gradle | 19 +++++++++++++++++++ 3 files changed, 38 insertions(+), 5 deletions(-) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/SpringBootAotPluginIntegrationTests-generateAotSourcesHasTransitiveRuntimeDependenciesOnItsClasspath.gradle diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/SpringBootAotPlugin.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/SpringBootAotPlugin.java index f2cfc95658..4dee832f9d 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/SpringBootAotPlugin.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/SpringBootAotPlugin.java @@ -24,6 +24,7 @@ import org.gradle.api.artifacts.Configuration; import org.gradle.api.artifacts.ConfigurationContainer; import org.gradle.api.attributes.AttributeContainer; import org.gradle.api.attributes.LibraryElements; +import org.gradle.api.attributes.Usage; import org.gradle.api.file.Directory; import org.gradle.api.plugins.JavaPlugin; import org.gradle.api.plugins.JavaPluginExtension; @@ -77,16 +78,23 @@ public class SpringBootAotPlugin implements Plugin { Configuration aotImplementation = configurations.getByName(aot.getImplementationConfigurationName()); aotImplementation.extendsFrom(configurations.getByName(main.getImplementationConfigurationName())); aotImplementation.extendsFrom(configurations.getByName(main.getRuntimeOnlyConfigurationName())); - configurations.getByName(aot.getCompileClasspathConfigurationName()) - .attributes((attributes) -> addLibraryElementsAttribute(project, attributes)); + configurations.getByName(aot.getCompileClasspathConfigurationName()).attributes((attributes) -> { + configureClassesAndResourcesLibraryElementsAttribute(project, attributes); + configureJavaRuntimeUsageAttribute(project, attributes); + }); }); return aotSourceSet; } - private AttributeContainer addLibraryElementsAttribute(Project project, AttributeContainer attributes) { - LibraryElements libraryElements = project.getObjects().named(LibraryElements.class, + private void configureClassesAndResourcesLibraryElementsAttribute(Project project, AttributeContainer attributes) { + LibraryElements classesAndResources = project.getObjects().named(LibraryElements.class, LibraryElements.CLASSES_AND_RESOURCES); - return attributes.attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, libraryElements); + attributes.attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, classesAndResources); + } + + private void configureJavaRuntimeUsageAttribute(Project project, AttributeContainer attributes) { + Usage javaRuntime = project.getObjects().named(Usage.class, Usage.JAVA_RUNTIME); + attributes.attribute(Usage.USAGE_ATTRIBUTE, javaRuntime); } private void registerGenerateAotSourcesTask(Project project, SourceSet aotSourceSet) { diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/SpringBootAotPluginIntegrationTests.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/SpringBootAotPluginIntegrationTests.java index d80486c438..6b97432c54 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/SpringBootAotPluginIntegrationTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/SpringBootAotPluginIntegrationTests.java @@ -60,4 +60,10 @@ class SpringBootAotPluginIntegrationTests { assertThat(this.gradleBuild.build("generateAotSourcesClasspath").getOutput()).contains("library.jar"); } + @TestTemplate + void generateAotSourcesHasTransitiveRuntimeDependenciesOnItsClasspath() { + String output = this.gradleBuild.build("generateAotSourcesClasspath").getOutput(); + assertThat(output).contains("org.jboss.logging/jboss-logging"); + } + } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/SpringBootAotPluginIntegrationTests-generateAotSourcesHasTransitiveRuntimeDependenciesOnItsClasspath.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/SpringBootAotPluginIntegrationTests-generateAotSourcesHasTransitiveRuntimeDependenciesOnItsClasspath.gradle new file mode 100644 index 0000000000..c2bd2bb340 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/SpringBootAotPluginIntegrationTests-generateAotSourcesHasTransitiveRuntimeDependenciesOnItsClasspath.gradle @@ -0,0 +1,19 @@ +plugins { + id 'org.springframework.boot' + id 'org.springframework.boot.aot' + id 'java' +} + +repositories { + mavenCentral() +} + +dependencies { + implementation "org.hibernate.orm:hibernate-core:6.1.1.Final" +} + +task('generateAotSourcesClasspath') { + doFirst { + tasks.findByName('generateAotSources').classpath.files.each { println it } + } +}