From 975c005dfbe85fa37dcee6c3577feb965fc6fccf Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Tue, 19 Sep 2017 20:35:49 +0100 Subject: [PATCH] Determine Spring Boot version for bom import correctly when using Java 9 In Java 9, a package may return null for its implementation version even when the manifest attribute specifying the version is present in the jar from which the package was loaded. This commit updates DependencyManagementPluginAction to fall back to accessing the jar and its manifest attributes directly when the implementation version of its package is null. Closes gh-10049 --- .../DependencyManagementPluginAction.java | 39 ++++++++++++++++++- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/DependencyManagementPluginAction.java b/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/DependencyManagementPluginAction.java index 0bf4cc22f8..2e73595d8e 100644 --- a/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/DependencyManagementPluginAction.java +++ b/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/DependencyManagementPluginAction.java @@ -16,6 +16,14 @@ package org.springframework.boot.gradle.plugin; +import java.io.File; +import java.io.IOException; +import java.net.JarURLConnection; +import java.net.URL; +import java.net.URLConnection; +import java.util.jar.Attributes; +import java.util.jar.JarFile; + import io.spring.gradle.dependencymanagement.DependencyManagementPlugin; import io.spring.gradle.dependencymanagement.dsl.DependencyManagementExtension; import org.gradle.api.Action; @@ -30,8 +38,7 @@ import org.gradle.api.Project; */ final class DependencyManagementPluginAction implements PluginApplicationAction { - private static final String SPRING_BOOT_VERSION = DependencyManagementPluginAction.class - .getPackage().getImplementationVersion(); + private static final String SPRING_BOOT_VERSION = determineSpringBootVersion(); private static final String SPRING_BOOT_BOM = "org.springframework.boot:spring-boot-dependencies:" + SPRING_BOOT_VERSION; @@ -47,4 +54,32 @@ final class DependencyManagementPluginAction implements PluginApplicationAction return DependencyManagementPlugin.class; } + private static String determineSpringBootVersion() { + String implementationVersion = DependencyManagementPluginAction.class.getPackage() + .getImplementationVersion(); + if (implementationVersion != null) { + return implementationVersion; + } + URL codeSourceLocation = DependencyManagementPluginAction.class + .getProtectionDomain().getCodeSource().getLocation(); + try { + URLConnection connection = codeSourceLocation.openConnection(); + if (connection instanceof JarURLConnection) { + return getImplementationVersion( + ((JarURLConnection) connection).getJarFile()); + } + try (JarFile jarFile = new JarFile(new File(codeSourceLocation.toURI()))) { + return getImplementationVersion(jarFile); + } + } + catch (Exception ex) { + return null; + } + } + + private static String getImplementationVersion(JarFile jarFile) throws IOException { + return jarFile.getManifest().getMainAttributes() + .getValue(Attributes.Name.IMPLEMENTATION_VERSION); + } + }