|
14 | 14 | import org.elasticsearch.gradle.Architecture; |
15 | 15 | import org.elasticsearch.gradle.OS; |
16 | 16 | import org.elasticsearch.gradle.Version; |
| 17 | +import org.elasticsearch.gradle.VersionProperties; |
17 | 18 | import org.elasticsearch.gradle.internal.BwcVersions; |
18 | 19 | import org.elasticsearch.gradle.internal.Jdk; |
19 | 20 | import org.elasticsearch.gradle.internal.JdkDownloadPlugin; |
|
47 | 48 | import org.gradle.jvm.toolchain.JvmVendorSpec; |
48 | 49 | import org.gradle.jvm.toolchain.internal.InstallationLocation; |
49 | 50 | import org.gradle.util.GradleVersion; |
50 | | -import org.jetbrains.annotations.NotNull; |
51 | 51 |
|
52 | 52 | import java.io.BufferedReader; |
53 | 53 | import java.io.File; |
|
72 | 72 |
|
73 | 73 | import static org.elasticsearch.gradle.internal.conventions.GUtils.elvis; |
74 | 74 | import static org.elasticsearch.gradle.internal.conventions.VersionPropertiesPlugin.VERSIONS_EXT; |
75 | | -import static org.elasticsearch.gradle.internal.toolchain.EarlyAccessCatalogJdkToolchainResolver.findLatestEABuildNumber; |
| 75 | +import static org.elasticsearch.gradle.internal.toolchain.EarlyAccessCatalogJdkToolchainResolver.findLatestPreReleaseBuild; |
| 76 | +import static org.elasticsearch.gradle.internal.toolchain.EarlyAccessCatalogJdkToolchainResolver.findPreReleaseBuild; |
76 | 77 |
|
77 | 78 | public class GlobalBuildInfoPlugin implements Plugin<Project> { |
78 | 79 | private static final Logger LOGGER = Logging.getLogger(GlobalBuildInfoPlugin.class); |
@@ -127,40 +128,20 @@ public void apply(Project project) { |
127 | 128 | JavaVersion minimumCompilerVersion = JavaVersion.toVersion(versionProperties.get("minimumCompilerJava")); |
128 | 129 | JavaVersion minimumRuntimeVersion = JavaVersion.toVersion(versionProperties.get("minimumRuntimeJava")); |
129 | 130 |
|
130 | | - String bundledJdkVersion = versionProperties.getProperty("bundled_jdk"); |
131 | | - String bundledJdkMajorVersion = bundledJdkVersion.split("[.+]")[0]; |
132 | | - Version elasticsearchVersionProperty = Version.fromString(versionProperties.getProperty("elasticsearch")); |
133 | | - |
134 | | - Provider<File> explicitRuntimeJavaHome = findRuntimeJavaHome(); |
135 | | - boolean isRuntimeJavaHomeExplicitlySet = explicitRuntimeJavaHome.isPresent(); |
136 | | - Provider<File> actualRuntimeJavaHome = isRuntimeJavaHomeExplicitlySet |
137 | | - ? explicitRuntimeJavaHome |
138 | | - : resolveJavaHomeFromToolChainService(bundledJdkMajorVersion); |
139 | | - |
140 | | - Provider<JvmInstallationMetadata> runtimeJdkMetaData = actualRuntimeJavaHome.map( |
141 | | - runtimeJavaHome -> metadataDetector.getMetadata(getJavaInstallation(runtimeJavaHome)) |
142 | | - ); |
| 131 | + RuntimeJava runtimeJavaHome = findRuntimeJavaHome(); |
143 | 132 | AtomicReference<BwcVersions> cache = new AtomicReference<>(); |
144 | 133 | Provider<BwcVersions> bwcVersionsProvider = providers.provider( |
145 | 134 | () -> cache.updateAndGet(val -> val == null ? resolveBwcVersions(elasticsearchVersionProperty) : val) |
146 | 135 | ); |
| 136 | + |
147 | 137 | BuildParameterExtension buildParams = project.getExtensions() |
148 | 138 | .create( |
149 | 139 | BuildParameterExtension.class, |
150 | 140 | BuildParameterExtension.EXTENSION_NAME, |
151 | 141 | DefaultBuildParameterExtension.class, |
152 | 142 | providers, |
153 | | - actualRuntimeJavaHome, |
| 143 | + runtimeJavaHome, |
154 | 144 | resolveToolchainSpecFromEnv(), |
155 | | - actualRuntimeJavaHome.map( |
156 | | - javaHome -> determineJavaVersion( |
157 | | - "runtime java.home", |
158 | | - javaHome, |
159 | | - isRuntimeJavaHomeExplicitlySet ? minimumRuntimeVersion : JavaVersion.toVersion(bundledJdkMajorVersion) |
160 | | - ) |
161 | | - ), |
162 | | - isRuntimeJavaHomeExplicitlySet, |
163 | | - runtimeJdkMetaData.map(m -> formatJavaVendorDetails(m)), |
164 | 145 | getAvailableJavaVersions(), |
165 | 146 | minimumCompilerVersion, |
166 | 147 | minimumRuntimeVersion, |
@@ -267,7 +248,7 @@ private void logGlobalBuildInfo(BuildParameterExtension buildParams) { |
267 | 248 | LOGGER.quiet("Elasticsearch Build Hamster says Hello!"); |
268 | 249 | LOGGER.quiet(" Gradle Version : " + GradleVersion.current().getVersion()); |
269 | 250 | LOGGER.quiet(" OS Info : " + osName + " " + osVersion + " (" + osArch + ")"); |
270 | | - if (buildParams.getIsRuntimeJavaHomeSet()) { |
| 251 | + if (buildParams.getRuntimeJava().isExplicitlySet()) { |
271 | 252 | JvmInstallationMetadata runtimeJvm = metadataDetector.getMetadata(getJavaInstallation(buildParams.getRuntimeJavaHome().get())); |
272 | 253 | final String runtimeJvmVendorDetails = runtimeJvm.getVendor().getDisplayName(); |
273 | 254 | final String runtimeJvmImplementationVersion = runtimeJvm.getJvmVersion(); |
@@ -374,50 +355,74 @@ private static void assertMinimumCompilerVersion(JavaVersion minimumCompilerVers |
374 | 355 | } |
375 | 356 | } |
376 | 357 |
|
377 | | - private Provider<File> findRuntimeJavaHome() { |
| 358 | + private RuntimeJava findRuntimeJavaHome() { |
378 | 359 | String runtimeJavaProperty = System.getProperty("runtime.java"); |
379 | | - |
380 | 360 | if (runtimeJavaProperty != null) { |
381 | | - if (runtimeJavaProperty.toLowerCase().endsWith("-ea")) { |
382 | | - // handle EA builds differently due to lack of support in Gradle toolchain service |
| 361 | + if (runtimeJavaProperty.toLowerCase().endsWith("-pre")) { |
| 362 | + // handle pre-release builds differently due to lack of support in Gradle toolchain service |
383 | 363 | // we resolve them using JdkDownloadPlugin for now. |
384 | | - Integer major = Integer.parseInt(runtimeJavaProperty.substring(0, runtimeJavaProperty.length() - 3)); |
385 | | - return resolveEarlyAccessJavaHome(major); |
| 364 | + return resolvePreReleaseRuntimeJavaHome(runtimeJavaProperty); |
386 | 365 | } else { |
387 | | - return resolveJavaHomeFromToolChainService(runtimeJavaProperty); |
| 366 | + return runtimeJavaHome(resolveJavaHomeFromToolChainService(runtimeJavaProperty), true); |
388 | 367 | } |
389 | 368 | } |
390 | 369 | if (System.getenv("RUNTIME_JAVA_HOME") != null) { |
391 | | - return providers.provider(() -> new File(System.getenv("RUNTIME_JAVA_HOME"))); |
| 370 | + return runtimeJavaHome(providers.provider(() -> new File(System.getenv("RUNTIME_JAVA_HOME"))), true); |
392 | 371 | } |
393 | 372 | // fall back to tool chain if set. |
394 | 373 | String env = System.getenv("JAVA_TOOLCHAIN_HOME"); |
395 | | - return providers.provider(() -> { |
396 | | - if (env == null) { |
397 | | - return null; |
398 | | - } |
399 | | - return new File(env); |
400 | | - }); |
| 374 | + boolean explicitlySet = env != null; |
| 375 | + Provider<File> javaHome = explicitlySet |
| 376 | + ? providers.provider(() -> new File(env)) |
| 377 | + : resolveJavaHomeFromToolChainService(VersionProperties.getBundledJdkMajorVersion()); |
| 378 | + return runtimeJavaHome(javaHome, explicitlySet); |
401 | 379 | } |
402 | 380 |
|
403 | | - private Provider<File> resolveEarlyAccessJavaHome(Integer runtimeJavaProperty) { |
404 | | - NamedDomainObjectContainer<Jdk> container = (NamedDomainObjectContainer<Jdk>) project.getExtensions().getByName("jdks"); |
| 381 | + private RuntimeJava runtimeJavaHome(Provider<File> fileProvider, boolean explicitlySet) { |
| 382 | + return runtimeJavaHome(fileProvider, explicitlySet, null); |
| 383 | + } |
| 384 | + |
| 385 | + private RuntimeJava runtimeJavaHome(Provider<File> fileProvider, boolean explicitlySet, String preReleasePostfix) { |
| 386 | + Provider<JavaVersion> javaVersion = fileProvider.map( |
| 387 | + javaHome -> determineJavaVersion( |
| 388 | + "runtime java.home", |
| 389 | + javaHome, |
| 390 | + fileProvider.isPresent() |
| 391 | + ? JavaVersion.toVersion(getResourceContents("/minimumRuntimeVersion")) |
| 392 | + : JavaVersion.toVersion(VersionProperties.getBundledJdkMajorVersion()) |
| 393 | + ) |
| 394 | + ); |
| 395 | + |
| 396 | + Provider<String> vendorDetails = fileProvider.map(j -> metadataDetector.getMetadata(getJavaInstallation(j))) |
| 397 | + .map(m -> formatJavaVendorDetails(m)); |
| 398 | + |
| 399 | + return new RuntimeJava(fileProvider, javaVersion, vendorDetails, explicitlySet, preReleasePostfix); |
| 400 | + } |
| 401 | + |
| 402 | + private RuntimeJava resolvePreReleaseRuntimeJavaHome(String runtimeJavaProperty) { |
| 403 | + var major = JavaLanguageVersion.of(Integer.parseInt(runtimeJavaProperty.substring(0, runtimeJavaProperty.length() - 4))); |
405 | 404 | Integer buildNumber = Integer.getInteger("runtime.java.build"); |
406 | | - if (buildNumber == null) { |
407 | | - buildNumber = findLatestEABuildNumber(runtimeJavaProperty); |
408 | | - } |
409 | | - String eaVersionString = String.format("%d-ea+%d", runtimeJavaProperty, buildNumber); |
410 | | - Jdk jdk = container.create("ea_jdk_" + runtimeJavaProperty, j -> { |
411 | | - j.setVersion(eaVersionString); |
| 405 | + var jdkbuild = buildNumber == null ? findLatestPreReleaseBuild(major) : findPreReleaseBuild(major, buildNumber); |
| 406 | + String prVersionString = String.format("%d-%s+%d", major.asInt(), jdkbuild.type(), jdkbuild.buildNumber()); |
| 407 | + return resolveJavaHomeFromJdkDownloadPlugin(jdkbuild.type(), major, prVersionString); |
| 408 | + |
| 409 | + } |
| 410 | + |
| 411 | + private RuntimeJava resolveJavaHomeFromJdkDownloadPlugin(String preReleaseType, JavaLanguageVersion major, String prVersionString) { |
| 412 | + NamedDomainObjectContainer<Jdk> container = (NamedDomainObjectContainer<Jdk>) project.getExtensions().getByName("jdks"); |
| 413 | + Jdk jdk = container.create(preReleaseType + "_" + major.asInt(), j -> { |
| 414 | + j.setVersion(prVersionString); |
412 | 415 | j.setVendor("openjdk"); |
413 | 416 | j.setPlatform(OS.current().javaOsReference); |
414 | 417 | j.setArchitecture(Architecture.current().javaClassifier); |
415 | | - j.setDistributionVersion("ea"); |
| 418 | + j.setDistributionVersion(preReleaseType); |
416 | 419 | }); |
417 | | - return providers.provider(() -> new File(jdk.getJavaHomePath().toString())); |
| 420 | + // We on purpose resolve this here eagerly to ensure we resolve the jdk configuration in the context of the root project. |
| 421 | + // If we keep this lazy we can not guarantee in which project context this is resolved which will fail the build. |
| 422 | + File file = new File(jdk.getJavaHomePath().toString()); |
| 423 | + return runtimeJavaHome(providers.provider(() -> file), true, preReleaseType); |
418 | 424 | } |
419 | 425 |
|
420 | | - @NotNull |
421 | 426 | private Provider<File> resolveJavaHomeFromToolChainService(String version) { |
422 | 427 | Property<JavaLanguageVersion> value = objectFactory.property(JavaLanguageVersion.class).value(JavaLanguageVersion.of(version)); |
423 | 428 | return toolChainService.launcherFor(javaToolchainSpec -> javaToolchainSpec.getLanguageVersion().value(value)) |
@@ -474,4 +479,5 @@ public void execute(JavaToolchainSpec spec) { |
474 | 479 | spec.getLanguageVersion().set(expectedJavaLanguageVersion); |
475 | 480 | } |
476 | 481 | } |
| 482 | + |
477 | 483 | } |
0 commit comments