From 980b83c0d8b4b3de39dae532d1bbec0776bd9941 Mon Sep 17 00:00:00 2001 From: Misagh Moayyed Date: Thu, 13 Jul 2017 19:52:49 -0700 Subject: [PATCH] Locate additional metadata when using Gradle 4 Closes gh-9758 --- .../configurationprocessor/MetadataStore.java | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/MetadataStore.java b/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/MetadataStore.java index f26ca1b6d0..3f5a3cae14 100644 --- a/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/MetadataStore.java +++ b/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/MetadataStore.java @@ -110,18 +110,34 @@ public class MetadataStore { private InputStream getAdditionalMetadataStream() throws IOException { // Most build systems will have copied the file to the class output location - FileObject fileObject = this.environment.getFiler() - .getResource(StandardLocation.CLASS_OUTPUT, "", ADDITIONAL_METADATA_PATH); + FileObject fileObject = this.environment.getFiler().getResource(StandardLocation.CLASS_OUTPUT, "", ADDITIONAL_METADATA_PATH); + File file = new File(fileObject.toUri()); + if (!file.exists()) { // Gradle keeps things separate String path = file.getPath(); + int index = path.lastIndexOf(CLASSES_FOLDER); if (index >= 0) { - path = path.substring(0, index) + RESOURCES_FOLDER - + path.substring(index + CLASSES_FOLDER.length()); - file = new File(path); + /* + Gradle 4 introduces a new 'java' directory which causes issues for one-to-one path mapping + of class locations and resources. Ensure resources can be found under '/build/resources/main' + rather than '/build/resources/java/main'. + */ + final String pathBeforeClassFolder = path.substring(0, index); + /* + In order to retrieve the the class output resource, we MUST pass in a relative path. + An empty path causes a InvalidArgumentException as it must be resolvable. In reality, + this means nothing since we are going to traverse upstream to its parent to locate + the 'main' directory. + */ + FileObject classOutputLocation = this.environment.getFiler().getResource(StandardLocation.CLASS_OUTPUT, "", "dummy"); + File classesFolder = new File(classOutputLocation.toUri()); + File resourcesFolder = new File(pathBeforeClassFolder + RESOURCES_FOLDER + '/' + classesFolder.getParentFile().getName()); + file = new File(resourcesFolder, ADDITIONAL_METADATA_PATH); } + } return (file.exists() ? new FileInputStream(file) : fileObject.toUri().toURL().openStream());