Skip to content

Commit c6a8913

Browse files
committed
Fix java home validation usage by tasks (#49204)
Tasks intending to use a particular java home provided by JAVA<N>_HOME use the getJavaHome method, which verifies the given java home is available, or will be if the task will run. However, the verification logic was broken, in addition to unnecessarily delaying retrieving the java home until runtime. This commit fixes the verification logic to run at either config time, delaying verification, or at runtime which immediately checks if java home is available. closes #49153
1 parent 14d2e79 commit c6a8913

File tree

2 files changed

+38
-24
lines changed

2 files changed

+38
-24
lines changed

buildSrc/src/main/groovy/org/elasticsearch/gradle/BuildPlugin.groovy

Lines changed: 37 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -216,41 +216,55 @@ class BuildPlugin implements Plugin<Project> {
216216
static void requireJavaHome(Task task, int version) {
217217
// use root project for global accounting
218218
Project rootProject = task.project.rootProject
219-
ExtraPropertiesExtension ext = rootProject.extensions.getByType(ExtraPropertiesExtension)
219+
ExtraPropertiesExtension extraProperties = rootProject.extensions.extraProperties
220220

221-
if (rootProject.hasProperty('requiredJavaVersions') == false) {
222-
ext.set('requiredJavaVersions', [:])
223-
rootProject.gradle.taskGraph.whenReady({ TaskExecutionGraph taskGraph ->
224-
List<String> messages = []
225-
Map<Integer, List<Task>> requiredJavaVersions = (Map<Integer, List<Task>>) ext.get('requiredJavaVersions')
226-
for (Map.Entry<Integer, List<Task>> entry : requiredJavaVersions) {
227-
if (BuildParams.javaVersions.find { it.version == entry.key } != null) {
228-
continue
229-
}
230-
List<String> tasks = entry.value.findAll { taskGraph.hasTask(it) }.collect { " ${it.path}".toString() }
231-
if (tasks.isEmpty() == false) {
232-
messages.add("JAVA${entry.key}_HOME required to run tasks:\n${tasks.join('\n')}".toString())
233-
}
234-
}
235-
if (messages.isEmpty() == false) {
236-
throw new GradleException(messages.join('\n'))
237-
}
238-
ext.set('requiredJavaVersions', null) // reset to null to indicate the pre-execution checks have executed
239-
})
240-
} else if (ext.has('requiredJavaVersions') == false || ext.get('requiredJavaVersions') == null) {
221+
// hacky way (but the only way) to find if the task graph has already been populated
222+
boolean taskGraphReady
223+
try {
224+
rootProject.gradle.taskGraph.getAllTasks()
225+
taskGraphReady = true
226+
} catch (IllegalStateException) {
227+
taskGraphReady = false
228+
}
229+
230+
if (taskGraphReady) {
241231
// check directly if the version is present since we are already executing
242232
if (BuildParams.javaVersions.find { it.version == version } == null) {
243233
throw new GradleException("JAVA${version}_HOME required to run task:\n${task}")
244234
}
245235
} else {
246-
(ext.get('requiredJavaVersions') as Map<Integer, List<Task>>).getOrDefault(version, []).add(task)
236+
// setup list of java versions we will check at the end of configuration time
237+
if (extraProperties.has('requiredJavaVersions') == false) {
238+
extraProperties.set('requiredJavaVersions', [:])
239+
rootProject.gradle.taskGraph.whenReady { TaskExecutionGraph taskGraph ->
240+
List<String> messages = []
241+
Map<Integer, List<Task>> requiredJavaVersions = (Map<Integer, List<Task>>) extraProperties.get('requiredJavaVersions')
242+
task.logger.warn(requiredJavaVersions.toString())
243+
for (Map.Entry<Integer, List<Task>> entry : requiredJavaVersions) {
244+
if (BuildParams.javaVersions.any { it.version == entry.key }) {
245+
continue
246+
}
247+
List<String> tasks = entry.value.findAll { taskGraph.hasTask(it) }.collect { " ${it.path}".toString() }
248+
if (tasks.isEmpty() == false) {
249+
messages.add("JAVA${entry.key}_HOME required to run tasks:\n${tasks.join('\n')}".toString())
250+
}
251+
}
252+
if (messages.isEmpty() == false) {
253+
throw new GradleException(messages.join('\n'))
254+
}
255+
}
256+
}
257+
Map<Integer, List<Task>> requiredJavaVersions = (Map<Integer, List<Task>>) extraProperties.get('requiredJavaVersions')
258+
requiredJavaVersions.putIfAbsent(version, [])
259+
requiredJavaVersions.get(version).add(task)
247260
}
248261
}
249262

250263
/** A convenience method for getting java home for a version of java and requiring that version for the given task to execute */
251264
static String getJavaHome(final Task task, final int version) {
252265
requireJavaHome(task, version)
253-
return BuildParams.javaVersions.find { it.version == version }.javaHome.absolutePath
266+
JavaHome java = BuildParams.javaVersions.find { it.version == version }
267+
return java == null ? null : java.javaHome.absolutePath
254268
}
255269

256270
/**

modules/reindex/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ if (Os.isFamily(Os.FAMILY_WINDOWS)) {
118118
dependsOn unzip
119119
executable = "${BuildParams.runtimeJavaHome}/bin/java"
120120
env 'CLASSPATH', "${-> project.configurations.oldesFixture.asPath}"
121-
env 'JAVA_HOME', "${-> getJavaHome(it, 8)}"
121+
env 'JAVA_HOME', getJavaHome(it, 8)
122122
args 'oldes.OldElasticsearch',
123123
baseDir,
124124
unzip.temporaryDir,

0 commit comments

Comments
 (0)