@@ -216,41 +216,55 @@ class BuildPlugin implements Plugin<Project> {
216
216
static void requireJavaHome (Task task , int version ) {
217
217
// use root project for global accounting
218
218
Project rootProject = task. project. rootProject
219
- ExtraPropertiesExtension ext = rootProject. extensions. getByType( ExtraPropertiesExtension )
219
+ ExtraPropertiesExtension extraProperties = rootProject. extensions. extraProperties
220
220
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) {
241
231
// check directly if the version is present since we are already executing
242
232
if (BuildParams . javaVersions. find { it. version == version } == null ) {
243
233
throw new GradleException (" JAVA${ version} _HOME required to run task:\n ${ task} " )
244
234
}
245
235
} 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)
247
260
}
248
261
}
249
262
250
263
/* * A convenience method for getting java home for a version of java and requiring that version for the given task to execute */
251
264
static String getJavaHome (final Task task , final int version ) {
252
265
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
254
268
}
255
269
256
270
/**
0 commit comments