Fix build issue if no specific Java version are set (#41379)

If no Java versions are set then when we size the executor thread pool
we end up with zero threads, which is illegal. This commit avoids that
problem by only starting the executor when needed.
This commit is contained in:
Jason Tedor 2019-04-19 14:08:22 -04:00
parent bcd0939b61
commit 154d40494f
No known key found for this signature in database
GPG Key ID: FA89F05560F16BC5
1 changed files with 40 additions and 37 deletions

View File

@ -130,13 +130,6 @@ class BuildPlugin implements Plugin<Project> {
String runtimeJavaHome = findRuntimeJavaHome(compilerJavaHome)
File gradleJavaHome = Jvm.current().javaHome
final Map<Integer, String> javaVersions = [:]
for (int version = 8; version <= Integer.parseInt(minimumCompilerVersion.majorVersion); version++) {
if(System.getenv(getJavaHomeEnvVarName(version.toString())) != null) {
javaVersions.put(version, findJavaHome(version.toString()));
}
}
String javaVendor = System.getProperty('java.vendor')
String gradleJavaVersion = System.getProperty('java.version')
String gradleJavaVersionDetails = "${javaVendor} ${gradleJavaVersion}" +
@ -197,38 +190,48 @@ class BuildPlugin implements Plugin<Project> {
throw new GradleException(message)
}
ExecutorService exec = Executors.newFixedThreadPool(javaVersions.size())
Set<Future<Void>> results = new HashSet<>()
javaVersions.entrySet().stream()
.filter { it.getValue() != null }
.forEach { javaVersionEntry ->
results.add(exec.submit {
final String javaHome = javaVersionEntry.getValue()
final int version = javaVersionEntry.getKey()
if (project.file(javaHome).exists() == false) {
throw new GradleException("Invalid JAVA${version}_HOME=${javaHome} location does not exist")
}
JavaVersion javaVersionEnum = JavaVersion.toVersion(findJavaSpecificationVersion(project, javaHome))
final JavaVersion expectedJavaVersionEnum = version < 9 ?
JavaVersion.toVersion("1." + version) :
JavaVersion.toVersion(Integer.toString(version))
if (javaVersionEnum != expectedJavaVersionEnum) {
final String message =
"the environment variable JAVA" + version + "_HOME must be set to a JDK installation directory for Java" +
" ${expectedJavaVersionEnum} but is [${javaHome}] corresponding to [${javaVersionEnum}]"
throw new GradleException(message)
}
})
final Map<Integer, String> javaVersions = [:]
for (int version = 8; version <= Integer.parseInt(minimumCompilerVersion.majorVersion); version++) {
if(System.getenv(getJavaHomeEnvVarName(version.toString())) != null) {
javaVersions.put(version, findJavaHome(version.toString()));
}
}
project.gradle.taskGraph.whenReady {
try {
results.forEach { it.get() }
} finally {
exec.shutdown();
if (javaVersions.isEmpty() == false) {
ExecutorService exec = Executors.newFixedThreadPool(javaVersions.size())
Set<Future<Void>> results = new HashSet<>()
javaVersions.entrySet().stream()
.filter { it.getValue() != null }
.forEach { javaVersionEntry ->
results.add(exec.submit {
final String javaHome = javaVersionEntry.getValue()
final int version = javaVersionEntry.getKey()
if (project.file(javaHome).exists() == false) {
throw new GradleException("Invalid JAVA${version}_HOME=${javaHome} location does not exist")
}
JavaVersion javaVersionEnum = JavaVersion.toVersion(findJavaSpecificationVersion(project, javaHome))
final JavaVersion expectedJavaVersionEnum = version < 9 ?
JavaVersion.toVersion("1." + version) :
JavaVersion.toVersion(Integer.toString(version))
if (javaVersionEnum != expectedJavaVersionEnum) {
final String message =
"the environment variable JAVA" + version + "_HOME must be set to a JDK installation directory for Java" +
" ${expectedJavaVersionEnum} but is [${javaHome}] corresponding to [${javaVersionEnum}]"
throw new GradleException(message)
}
})
}
project.gradle.taskGraph.whenReady {
try {
results.forEach { it.get() }
} finally {
exec.shutdown();
}
}
}