Work around Gradle 3.3's overzealous deprecation warning

In Gradle 3.3, when an API that will be removed in 4.0 is called, a
deprecation warning is output as part of the build. Users have noticed
his warning and, quite reasonably, complained about it. Unfortunately,
avoiding the warning requires the use of an API that was introduced in
Gradle 3.x which we can't use directly as we want to remain compatible
with Gradle 2.x.

This commit introduces the use of reflection to call
ProjectDependency.getTargetConfiguration() via reflection when it's
available (Gradle 3) and ProjectDependency.getProjectConfiguration()
when it's not (Gradle 2).

Closes gh-8154
This commit is contained in:
Andy Wilkinson 2017-02-08 21:51:01 +00:00
parent ab192d01cc
commit b931f564e6

View File

@ -18,6 +18,7 @@ package org.springframework.boot.gradle.repackage;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;
@ -50,6 +51,8 @@ class ProjectLibraries implements Libraries {
private final boolean excludeDevtools;
private final TargetConfigurationResolver targetConfigurationResolver;
private String providedConfigurationName = "providedRuntime";
private String customConfigurationName = null;
@ -65,6 +68,17 @@ class ProjectLibraries implements Libraries {
this.project = project;
this.extension = extension;
this.excludeDevtools = excludeDevTools;
this.targetConfigurationResolver = createTargetConfigurationResolver();
}
private static TargetConfigurationResolver createTargetConfigurationResolver() {
try {
return new Gradle3TargetConfigurationResolver(
ProjectDependency.class.getMethod("getTargetConfiguration"));
}
catch (Exception ex) {
return new Gradle2TargetConfigurationResolver();
}
}
/**
@ -127,11 +141,11 @@ class ProjectLibraries implements Libraries {
}
else if (dependency instanceof ProjectDependency) {
ProjectDependency projectDependency = (ProjectDependency) dependency;
Configuration dependencyConfiguration = projectDependency
.getDependencyProject().getConfigurations()
.getByName(projectDependency.getConfiguration());
libraries.addAll(
getLibrariesForFileDependencies(dependencyConfiguration, scope));
libraries
.addAll(getLibrariesForFileDependencies(
this.targetConfigurationResolver
.resolveTargetConfiguration(projectDependency),
scope));
}
}
return libraries;
@ -264,4 +278,47 @@ class ProjectLibraries implements Libraries {
}
private interface TargetConfigurationResolver {
Configuration resolveTargetConfiguration(ProjectDependency projectDependency);
}
private static final class Gradle2TargetConfigurationResolver
implements TargetConfigurationResolver {
@Override
public Configuration resolveTargetConfiguration(
ProjectDependency projectDependency) {
return projectDependency.getProjectConfiguration();
}
}
private static final class Gradle3TargetConfigurationResolver
implements TargetConfigurationResolver {
private final Method getTargetConfiguration;
private Gradle3TargetConfigurationResolver(Method getTargetConfiguration) {
this.getTargetConfiguration = getTargetConfiguration;
}
@Override
public Configuration resolveTargetConfiguration(
ProjectDependency projectDependency) {
try {
String configurationName = (String) this.getTargetConfiguration
.invoke(projectDependency);
return projectDependency.getDependencyProject().getConfigurations()
.getByName(configurationName == null
? Dependency.DEFAULT_CONFIGURATION : configurationName);
}
catch (Exception ex) {
throw new RuntimeException("Failed to get target configuration", ex);
}
}
}
}