|
47 | 47 | import org.gradle.jvm.toolchain.JvmVendorSpec; |
48 | 48 | import org.gradle.jvm.toolchain.internal.InstallationLocation; |
49 | 49 | import org.gradle.util.GradleVersion; |
50 | | -import org.jetbrains.annotations.NotNull; |
51 | 50 |
|
52 | 51 | import java.io.BufferedReader; |
53 | 52 | import java.io.File; |
|
68 | 67 | import javax.inject.Inject; |
69 | 68 |
|
70 | 69 | import static org.elasticsearch.gradle.internal.conventions.GUtils.elvis; |
71 | | -import static org.elasticsearch.gradle.internal.toolchain.EarlyAccessCatalogJdkToolchainResolver.findLatestEABuildNumber; |
| 70 | +import static org.elasticsearch.gradle.internal.toolchain.EarlyAccessCatalogJdkToolchainResolver.findLatestPreReleaseBuild; |
| 71 | +import static org.elasticsearch.gradle.internal.toolchain.EarlyAccessCatalogJdkToolchainResolver.findPreReleaseBuild; |
72 | 72 |
|
73 | 73 | public class GlobalBuildInfoPlugin implements Plugin<Project> { |
74 | 74 | private static final Logger LOGGER = Logging.getLogger(GlobalBuildInfoPlugin.class); |
@@ -116,37 +116,20 @@ public void apply(Project project) { |
116 | 116 | JavaVersion minimumCompilerVersion = JavaVersion.toVersion(getResourceContents("/minimumCompilerVersion")); |
117 | 117 | JavaVersion minimumRuntimeVersion = JavaVersion.toVersion(getResourceContents("/minimumRuntimeVersion")); |
118 | 118 |
|
119 | | - RuntimeJavaHome runtimeJavaHome = findRuntimeJavaHome(); |
120 | | - |
121 | | - Provider<JvmInstallationMetadata> runtimeJdkMetaData = runtimeJavaHome.getJavahome().map( |
122 | | - j -> metadataDetector.getMetadata(getJavaInstallation(j)) |
123 | | - ); |
| 119 | + RuntimeJava runtimeJavaHome = findRuntimeJavaHome(); |
124 | 120 | AtomicReference<BwcVersions> cache = new AtomicReference<>(); |
125 | 121 | Provider<BwcVersions> bwcVersionsProvider = providers.provider( |
126 | 122 | () -> cache.updateAndGet(val -> val == null ? resolveBwcVersions() : val) |
127 | 123 | ); |
128 | 124 |
|
129 | | - |
130 | 125 | BuildParameterExtension buildParams = project.getExtensions() |
131 | 126 | .create( |
132 | 127 | BuildParameterExtension.class, |
133 | 128 | BuildParameterExtension.EXTENSION_NAME, |
134 | 129 | DefaultBuildParameterExtension.class, |
135 | 130 | providers, |
136 | | - runtimeJavaHome.getJavahome(), |
| 131 | + runtimeJavaHome, |
137 | 132 | resolveToolchainSpecFromEnv(), |
138 | | - runtimeJavaHome.javahome.map( |
139 | | - javaHome -> determineJavaVersion( |
140 | | - "runtime java.home", |
141 | | - javaHome, |
142 | | - runtimeJavaHome.javahome.isPresent() |
143 | | - ? minimumRuntimeVersion |
144 | | - : JavaVersion.toVersion(VersionProperties.getBundledJdkMajorVersion()) |
145 | | - ) |
146 | | - ), |
147 | | - runtimeJavaHome.expclicitlySet, |
148 | | - runtimeJavaHome.earlyAccess, |
149 | | - runtimeJdkMetaData.map(m -> formatJavaVendorDetails(m)), |
150 | 133 | getAvailableJavaVersions(), |
151 | 134 | minimumCompilerVersion, |
152 | 135 | minimumRuntimeVersion, |
@@ -236,7 +219,7 @@ private void logGlobalBuildInfo(BuildParameterExtension buildParams) { |
236 | 219 | LOGGER.quiet("Elasticsearch Build Hamster says Hello!"); |
237 | 220 | LOGGER.quiet(" Gradle Version : " + GradleVersion.current().getVersion()); |
238 | 221 | LOGGER.quiet(" OS Info : " + osName + " " + osVersion + " (" + osArch + ")"); |
239 | | - if (buildParams.getIsRuntimeJavaHomeSet()) { |
| 222 | + if (buildParams.getRuntimeJava().isExplicitlySet()) { |
240 | 223 | JvmInstallationMetadata runtimeJvm = metadataDetector.getMetadata(getJavaInstallation(buildParams.getRuntimeJavaHome().get())); |
241 | 224 | final String runtimeJvmVendorDetails = runtimeJvm.getVendor().getDisplayName(); |
242 | 225 | final String runtimeJvmImplementationVersion = runtimeJvm.getJvmVersion(); |
@@ -343,53 +326,74 @@ private static void assertMinimumCompilerVersion(JavaVersion minimumCompilerVers |
343 | 326 | } |
344 | 327 | } |
345 | 328 |
|
346 | | - private RuntimeJavaHome findRuntimeJavaHome() { |
| 329 | + private RuntimeJava findRuntimeJavaHome() { |
347 | 330 | String runtimeJavaProperty = System.getProperty("runtime.java"); |
348 | | - |
349 | 331 | if (runtimeJavaProperty != null) { |
350 | | - if (runtimeJavaProperty.toLowerCase().endsWith("-ea")) { |
351 | | - // handle EA builds differently due to lack of support in Gradle toolchain service |
| 332 | + if (runtimeJavaProperty.toLowerCase().endsWith("-pre")) { |
| 333 | + // handle pre-release builds differently due to lack of support in Gradle toolchain service |
352 | 334 | // we resolve them using JdkDownloadPlugin for now. |
353 | | - Integer major = Integer.parseInt(runtimeJavaProperty.substring(0, runtimeJavaProperty.length() - 3)); |
354 | | - return new RuntimeJavaHome(resolveEarlyAccessJavaHome(major), true, true); |
| 335 | + return resolvePreReleaseRuntimeJavaHome(runtimeJavaProperty); |
355 | 336 | } else { |
356 | | - return new RuntimeJavaHome(resolveJavaHomeFromToolChainService(runtimeJavaProperty), true, false); |
| 337 | + return runtimeJavaHome(resolveJavaHomeFromToolChainService(runtimeJavaProperty), true); |
357 | 338 | } |
358 | 339 | } |
359 | 340 | if (System.getenv("RUNTIME_JAVA_HOME") != null) { |
360 | | - return new RuntimeJavaHome(providers.provider(() -> new File(System.getenv("RUNTIME_JAVA_HOME"))), true, false); |
| 341 | + return runtimeJavaHome(providers.provider(() -> new File(System.getenv("RUNTIME_JAVA_HOME"))), true); |
361 | 342 | } |
362 | 343 | // fall back to tool chain if set. |
363 | 344 | String env = System.getenv("JAVA_TOOLCHAIN_HOME"); |
364 | 345 | boolean explicitlySet = env != null; |
365 | | - Provider<File> javaHome = explicitlySet ? |
366 | | - providers.provider(() -> new File(env)) : |
367 | | - resolveJavaHomeFromToolChainService(VersionProperties.getBundledJdkMajorVersion()); |
368 | | - return |
369 | | - new RuntimeJavaHome( |
| 346 | + Provider<File> javaHome = explicitlySet |
| 347 | + ? providers.provider(() -> new File(env)) |
| 348 | + : resolveJavaHomeFromToolChainService(VersionProperties.getBundledJdkMajorVersion()); |
| 349 | + return runtimeJavaHome(javaHome, explicitlySet); |
| 350 | + } |
| 351 | + |
| 352 | + private RuntimeJava runtimeJavaHome(Provider<File> fileProvider, boolean explicitlySet) { |
| 353 | + return runtimeJavaHome(fileProvider, explicitlySet, null); |
| 354 | + } |
| 355 | + |
| 356 | + private RuntimeJava runtimeJavaHome(Provider<File> fileProvider, boolean explicitlySet, String preReleasePostfix) { |
| 357 | + Provider<JavaVersion> javaVersion = fileProvider.map( |
| 358 | + javaHome -> determineJavaVersion( |
| 359 | + "runtime java.home", |
370 | 360 | javaHome, |
371 | | - explicitlySet, |
372 | | - false); |
| 361 | + fileProvider.isPresent() |
| 362 | + ? JavaVersion.toVersion(getResourceContents("/minimumRuntimeVersion")) |
| 363 | + : JavaVersion.toVersion(VersionProperties.getBundledJdkMajorVersion()) |
| 364 | + ) |
| 365 | + ); |
| 366 | + |
| 367 | + Provider<String> vendorDetails = fileProvider.map(j -> metadataDetector.getMetadata(getJavaInstallation(j))) |
| 368 | + .map(m -> formatJavaVendorDetails(m)); |
| 369 | + |
| 370 | + return new RuntimeJava(fileProvider, javaVersion, vendorDetails, explicitlySet, preReleasePostfix); |
373 | 371 | } |
374 | 372 |
|
375 | | - private Provider<File> resolveEarlyAccessJavaHome(Integer runtimeJavaProperty) { |
376 | | - NamedDomainObjectContainer<Jdk> container = (NamedDomainObjectContainer<Jdk>) project.getExtensions().getByName("jdks"); |
| 373 | + private RuntimeJava resolvePreReleaseRuntimeJavaHome(String runtimeJavaProperty) { |
| 374 | + var major = JavaLanguageVersion.of(Integer.parseInt(runtimeJavaProperty.substring(0, runtimeJavaProperty.length() - 4))); |
377 | 375 | Integer buildNumber = Integer.getInteger("runtime.java.build"); |
378 | | - if (buildNumber == null) { |
379 | | - buildNumber = findLatestEABuildNumber(runtimeJavaProperty); |
380 | | - } |
381 | | - String eaVersionString = String.format("%d-ea+%d", runtimeJavaProperty, buildNumber); |
382 | | - Jdk jdk = container.create("ea_jdk_" + runtimeJavaProperty, j -> { |
383 | | - j.setVersion(eaVersionString); |
| 376 | + var jdkbuild = buildNumber == null ? findLatestPreReleaseBuild(major) : findPreReleaseBuild(major, buildNumber); |
| 377 | + String prVersionString = String.format("%d-%s+%d", major.asInt(), jdkbuild.type(), jdkbuild.buildNumber()); |
| 378 | + return resolveJavaHomeFromJdkDownloadPlugin(jdkbuild.type(), major, prVersionString); |
| 379 | + |
| 380 | + } |
| 381 | + |
| 382 | + private RuntimeJava resolveJavaHomeFromJdkDownloadPlugin(String preReleaseType, JavaLanguageVersion major, String prVersionString) { |
| 383 | + NamedDomainObjectContainer<Jdk> container = (NamedDomainObjectContainer<Jdk>) project.getExtensions().getByName("jdks"); |
| 384 | + Jdk jdk = container.create(preReleaseType + "_" + major.asInt(), j -> { |
| 385 | + j.setVersion(prVersionString); |
384 | 386 | j.setVendor("openjdk"); |
385 | 387 | j.setPlatform(OS.current().javaOsReference); |
386 | 388 | j.setArchitecture(Architecture.current().javaClassifier); |
387 | | - j.setDistributionVersion("ea"); |
| 389 | + j.setDistributionVersion(preReleaseType); |
388 | 390 | }); |
389 | | - return providers.provider(() -> new File(jdk.getJavaHomePath().toString())); |
| 391 | + // We on purpose resolve this here eagerly to ensure we resolve the jdk configuration in the context of the root project. |
| 392 | + // If we keep this lazy we can not guarantee in which project context this is resolved which will fail the build. |
| 393 | + File file = new File(jdk.getJavaHomePath().toString()); |
| 394 | + return runtimeJavaHome(providers.provider(() -> file), true, preReleaseType); |
390 | 395 | } |
391 | 396 |
|
392 | | - @NotNull |
393 | 397 | private Provider<File> resolveJavaHomeFromToolChainService(String version) { |
394 | 398 | Property<JavaLanguageVersion> value = objectFactory.property(JavaLanguageVersion.class).value(JavaLanguageVersion.of(version)); |
395 | 399 | return toolChainService.launcherFor(javaToolchainSpec -> javaToolchainSpec.getLanguageVersion().value(value)) |
@@ -447,24 +451,4 @@ public void execute(JavaToolchainSpec spec) { |
447 | 451 | } |
448 | 452 | } |
449 | 453 |
|
450 | | - private static class RuntimeJavaHome { |
451 | | - |
452 | | - private final boolean earlyAccess; |
453 | | - private final Provider<File> javahome; |
454 | | - private final boolean expclicitlySet; |
455 | | - |
456 | | - // RuntimeJavaHome(Provider<File> javahome) { |
457 | | - // this(javahome, false); |
458 | | - // } |
459 | | - // |
460 | | - RuntimeJavaHome(Provider<File> javahome, boolean explicitlySet, boolean earlyAccess) { |
461 | | - this.javahome = javahome; |
462 | | - this.expclicitlySet = explicitlySet; |
463 | | - this.earlyAccess = earlyAccess; |
464 | | - } |
465 | | - |
466 | | - public Provider<File> getJavahome() { |
467 | | - return javahome; |
468 | | - } |
469 | | - } |
470 | 454 | } |
0 commit comments