|
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,38 +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 | | - Provider<File> explicitRuntimeJavaHome = findRuntimeJavaHome(); |
120 | | - boolean isRuntimeJavaHomeExplicitlySet = explicitRuntimeJavaHome.isPresent(); |
121 | | - Provider<File> actualRuntimeJavaHome = isRuntimeJavaHomeExplicitlySet |
122 | | - ? explicitRuntimeJavaHome |
123 | | - : resolveJavaHomeFromToolChainService(VersionProperties.getBundledJdkMajorVersion()); |
124 | | - |
125 | | - Provider<JvmInstallationMetadata> runtimeJdkMetaData = actualRuntimeJavaHome.map( |
126 | | - runtimeJavaHome -> metadataDetector.getMetadata(getJavaInstallation(runtimeJavaHome)) |
127 | | - ); |
| 119 | + RuntimeJava runtimeJavaHome = findRuntimeJavaHome(); |
128 | 120 | AtomicReference<BwcVersions> cache = new AtomicReference<>(); |
129 | 121 | Provider<BwcVersions> bwcVersionsProvider = providers.provider( |
130 | 122 | () -> cache.updateAndGet(val -> val == null ? resolveBwcVersions() : val) |
131 | 123 | ); |
| 124 | + |
132 | 125 | BuildParameterExtension buildParams = project.getExtensions() |
133 | 126 | .create( |
134 | 127 | BuildParameterExtension.class, |
135 | 128 | BuildParameterExtension.EXTENSION_NAME, |
136 | 129 | DefaultBuildParameterExtension.class, |
137 | 130 | providers, |
138 | | - actualRuntimeJavaHome, |
| 131 | + runtimeJavaHome, |
139 | 132 | resolveToolchainSpecFromEnv(), |
140 | | - actualRuntimeJavaHome.map( |
141 | | - javaHome -> determineJavaVersion( |
142 | | - "runtime java.home", |
143 | | - javaHome, |
144 | | - isRuntimeJavaHomeExplicitlySet |
145 | | - ? minimumRuntimeVersion |
146 | | - : JavaVersion.toVersion(VersionProperties.getBundledJdkMajorVersion()) |
147 | | - ) |
148 | | - ), |
149 | | - isRuntimeJavaHomeExplicitlySet, |
150 | | - runtimeJdkMetaData.map(m -> formatJavaVendorDetails(m)), |
151 | 133 | getAvailableJavaVersions(), |
152 | 134 | minimumCompilerVersion, |
153 | 135 | minimumRuntimeVersion, |
@@ -237,7 +219,7 @@ private void logGlobalBuildInfo(BuildParameterExtension buildParams) { |
237 | 219 | LOGGER.quiet("Elasticsearch Build Hamster says Hello!"); |
238 | 220 | LOGGER.quiet(" Gradle Version : " + GradleVersion.current().getVersion()); |
239 | 221 | LOGGER.quiet(" OS Info : " + osName + " " + osVersion + " (" + osArch + ")"); |
240 | | - if (buildParams.getIsRuntimeJavaHomeSet()) { |
| 222 | + if (buildParams.getRuntimeJava().isExplicitlySet()) { |
241 | 223 | JvmInstallationMetadata runtimeJvm = metadataDetector.getMetadata(getJavaInstallation(buildParams.getRuntimeJavaHome().get())); |
242 | 224 | final String runtimeJvmVendorDetails = runtimeJvm.getVendor().getDisplayName(); |
243 | 225 | final String runtimeJvmImplementationVersion = runtimeJvm.getJvmVersion(); |
@@ -344,50 +326,74 @@ private static void assertMinimumCompilerVersion(JavaVersion minimumCompilerVers |
344 | 326 | } |
345 | 327 | } |
346 | 328 |
|
347 | | - private Provider<File> findRuntimeJavaHome() { |
| 329 | + private RuntimeJava findRuntimeJavaHome() { |
348 | 330 | String runtimeJavaProperty = System.getProperty("runtime.java"); |
349 | | - |
350 | 331 | if (runtimeJavaProperty != null) { |
351 | | - if (runtimeJavaProperty.toLowerCase().endsWith("-ea")) { |
352 | | - // 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 |
353 | 334 | // we resolve them using JdkDownloadPlugin for now. |
354 | | - Integer major = Integer.parseInt(runtimeJavaProperty.substring(0, runtimeJavaProperty.length() - 3)); |
355 | | - return resolveEarlyAccessJavaHome(major); |
| 335 | + return resolvePreReleaseRuntimeJavaHome(runtimeJavaProperty); |
356 | 336 | } else { |
357 | | - return resolveJavaHomeFromToolChainService(runtimeJavaProperty); |
| 337 | + return runtimeJavaHome(resolveJavaHomeFromToolChainService(runtimeJavaProperty), true); |
358 | 338 | } |
359 | 339 | } |
360 | 340 | if (System.getenv("RUNTIME_JAVA_HOME") != null) { |
361 | | - return providers.provider(() -> new File(System.getenv("RUNTIME_JAVA_HOME"))); |
| 341 | + return runtimeJavaHome(providers.provider(() -> new File(System.getenv("RUNTIME_JAVA_HOME"))), true); |
362 | 342 | } |
363 | 343 | // fall back to tool chain if set. |
364 | 344 | String env = System.getenv("JAVA_TOOLCHAIN_HOME"); |
365 | | - return providers.provider(() -> { |
366 | | - if (env == null) { |
367 | | - return null; |
368 | | - } |
369 | | - return new File(env); |
370 | | - }); |
| 345 | + boolean explicitlySet = env != null; |
| 346 | + Provider<File> javaHome = explicitlySet |
| 347 | + ? providers.provider(() -> new File(env)) |
| 348 | + : resolveJavaHomeFromToolChainService(VersionProperties.getBundledJdkMajorVersion()); |
| 349 | + return runtimeJavaHome(javaHome, explicitlySet); |
371 | 350 | } |
372 | 351 |
|
373 | | - private Provider<File> resolveEarlyAccessJavaHome(Integer runtimeJavaProperty) { |
374 | | - NamedDomainObjectContainer<Jdk> container = (NamedDomainObjectContainer<Jdk>) project.getExtensions().getByName("jdks"); |
| 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", |
| 360 | + javaHome, |
| 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); |
| 371 | + } |
| 372 | + |
| 373 | + private RuntimeJava resolvePreReleaseRuntimeJavaHome(String runtimeJavaProperty) { |
| 374 | + var major = JavaLanguageVersion.of(Integer.parseInt(runtimeJavaProperty.substring(0, runtimeJavaProperty.length() - 4))); |
375 | 375 | Integer buildNumber = Integer.getInteger("runtime.java.build"); |
376 | | - if (buildNumber == null) { |
377 | | - buildNumber = findLatestEABuildNumber(runtimeJavaProperty); |
378 | | - } |
379 | | - String eaVersionString = String.format("%d-ea+%d", runtimeJavaProperty, buildNumber); |
380 | | - Jdk jdk = container.create("ea_jdk_" + runtimeJavaProperty, j -> { |
381 | | - 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); |
382 | 386 | j.setVendor("openjdk"); |
383 | 387 | j.setPlatform(OS.current().javaOsReference); |
384 | 388 | j.setArchitecture(Architecture.current().javaClassifier); |
385 | | - j.setDistributionVersion("ea"); |
| 389 | + j.setDistributionVersion(preReleaseType); |
386 | 390 | }); |
387 | | - 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); |
388 | 395 | } |
389 | 396 |
|
390 | | - @NotNull |
391 | 397 | private Provider<File> resolveJavaHomeFromToolChainService(String version) { |
392 | 398 | Property<JavaLanguageVersion> value = objectFactory.property(JavaLanguageVersion.class).value(JavaLanguageVersion.of(version)); |
393 | 399 | return toolChainService.launcherFor(javaToolchainSpec -> javaToolchainSpec.getLanguageVersion().value(value)) |
@@ -444,4 +450,5 @@ public void execute(JavaToolchainSpec spec) { |
444 | 450 | spec.getLanguageVersion().set(expectedJavaLanguageVersion); |
445 | 451 | } |
446 | 452 | } |
| 453 | + |
447 | 454 | } |
0 commit comments