Commit 975c005d authored by Andy Wilkinson's avatar Andy Wilkinson

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
parent 0f2d91c7
......@@ -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);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment