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
pull/10355/head
Andy Wilkinson 7 years ago
parent 0f2d91c7e0
commit 975c005dfb

@ -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);
}
}

Loading…
Cancel
Save