4747import org .gradle .jvm .toolchain .JvmVendorSpec ;
4848import org .gradle .jvm .toolchain .internal .InstallationLocation ;
4949import org .gradle .util .GradleVersion ;
50- import org .jetbrains .annotations .NotNull ;
5150
5251import java .io .BufferedReader ;
5352import java .io .File ;
7271
7372import static org .elasticsearch .gradle .internal .conventions .GUtils .elvis ;
7473import static org .elasticsearch .gradle .internal .conventions .VersionPropertiesPlugin .VERSIONS_EXT ;
75- import static org .elasticsearch .gradle .internal .toolchain .EarlyAccessCatalogJdkToolchainResolver .findLatestEABuildNumber ;
74+ import static org .elasticsearch .gradle .internal .toolchain .EarlyAccessCatalogJdkToolchainResolver .findLatestPreReleaseBuild ;
75+ import static org .elasticsearch .gradle .internal .toolchain .EarlyAccessCatalogJdkToolchainResolver .findPreReleaseBuild ;
7676
7777public class GlobalBuildInfoPlugin implements Plugin <Project > {
7878 private static final Logger LOGGER = Logging .getLogger (GlobalBuildInfoPlugin .class );
@@ -107,7 +107,6 @@ public GlobalBuildInfoPlugin(
107107
108108 @ Override
109109 public void apply (Project project ) {
110-
111110 if (project != project .getRootProject ()) {
112111 throw new IllegalStateException (this .getClass ().getName () + " can only be applied to the root project." );
113112 }
@@ -127,40 +126,22 @@ public void apply(Project project) {
127126 JavaVersion minimumCompilerVersion = JavaVersion .toVersion (versionProperties .get ("minimumCompilerJava" ));
128127 JavaVersion minimumRuntimeVersion = JavaVersion .toVersion (versionProperties .get ("minimumRuntimeJava" ));
129128
130- String bundledJdkVersion = versionProperties .getProperty ("bundled_jdk" );
131- String bundledJdkMajorVersion = bundledJdkVersion .split ("[.+]" )[0 ];
132129 Version elasticsearchVersionProperty = Version .fromString (versionProperties .getProperty ("elasticsearch" ));
133130
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 ();
143132 AtomicReference <BwcVersions > cache = new AtomicReference <>();
144133 Provider <BwcVersions > bwcVersionsProvider = providers .provider (
145134 () -> cache .updateAndGet (val -> val == null ? resolveBwcVersions (elasticsearchVersionProperty ) : val )
146135 );
136+
147137 BuildParameterExtension buildParams = project .getExtensions ()
148138 .create (
149139 BuildParameterExtension .class ,
150140 BuildParameterExtension .EXTENSION_NAME ,
151141 DefaultBuildParameterExtension .class ,
152142 providers ,
153- actualRuntimeJavaHome ,
143+ runtimeJavaHome ,
154144 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 )),
164145 getAvailableJavaVersions (),
165146 minimumCompilerVersion ,
166147 minimumRuntimeVersion ,
@@ -267,7 +248,7 @@ private void logGlobalBuildInfo(BuildParameterExtension buildParams) {
267248 LOGGER .quiet ("Elasticsearch Build Hamster says Hello!" );
268249 LOGGER .quiet (" Gradle Version : " + GradleVersion .current ().getVersion ());
269250 LOGGER .quiet (" OS Info : " + osName + " " + osVersion + " (" + osArch + ")" );
270- if (buildParams .getIsRuntimeJavaHomeSet ()) {
251+ if (buildParams .getRuntimeJava (). isExplicitlySet ()) {
271252 JvmInstallationMetadata runtimeJvm = metadataDetector .getMetadata (getJavaInstallation (buildParams .getRuntimeJavaHome ().get ()));
272253 final String runtimeJvmVendorDetails = runtimeJvm .getVendor ().getDisplayName ();
273254 final String runtimeJvmImplementationVersion = runtimeJvm .getJvmVersion ();
@@ -374,50 +355,80 @@ private static void assertMinimumCompilerVersion(JavaVersion minimumCompilerVers
374355 }
375356 }
376357
377- private Provider <File > findRuntimeJavaHome () {
378- String runtimeJavaProperty = System .getProperty ("runtime.java" );
358+ private RuntimeJava findRuntimeJavaHome () {
359+ Properties versionProperties = (Properties ) project .getExtensions ().getByName (VERSIONS_EXT );
360+ String bundledJdkVersion = versionProperties .getProperty ("bundled_jdk" );
361+ String bundledJdkMajorVersion = bundledJdkVersion .split ("[.+]" )[0 ];
379362
363+ String runtimeJavaProperty = System .getProperty ("runtime.java" );
380364 if (runtimeJavaProperty != null ) {
381- if (runtimeJavaProperty .toLowerCase ().endsWith ("-ea " )) {
382- // handle EA builds differently due to lack of support in Gradle toolchain service
365+ if (runtimeJavaProperty .toLowerCase ().endsWith ("-pre " )) {
366+ // handle pre-release builds differently due to lack of support in Gradle toolchain service
383367 // we resolve them using JdkDownloadPlugin for now.
384- Integer major = Integer .parseInt (runtimeJavaProperty .substring (0 , runtimeJavaProperty .length () - 3 ));
385- return resolveEarlyAccessJavaHome (major );
368+ return resolvePreReleaseRuntimeJavaHome (runtimeJavaProperty , bundledJdkMajorVersion );
386369 } else {
387- return resolveJavaHomeFromToolChainService (runtimeJavaProperty );
370+ return runtimeJavaHome ( resolveJavaHomeFromToolChainService (runtimeJavaProperty ), true , bundledJdkMajorVersion );
388371 }
389372 }
390373 if (System .getenv ("RUNTIME_JAVA_HOME" ) != null ) {
391- return providers .provider (() -> new File (System .getenv ("RUNTIME_JAVA_HOME" )));
374+ return runtimeJavaHome ( providers .provider (() -> new File (System .getenv ("RUNTIME_JAVA_HOME" ))), true , bundledJdkVersion );
392375 }
393376 // fall back to tool chain if set.
394377 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- });
378+ boolean explicitlySet = env != null ;
379+ Provider <File > javaHome = explicitlySet
380+ ? providers .provider (() -> new File (env ))
381+ : resolveJavaHomeFromToolChainService (bundledJdkMajorVersion );
382+ return runtimeJavaHome (javaHome , explicitlySet , bundledJdkMajorVersion );
401383 }
402384
403- private Provider <File > resolveEarlyAccessJavaHome (Integer runtimeJavaProperty ) {
404- NamedDomainObjectContainer <Jdk > container = (NamedDomainObjectContainer <Jdk >) project .getExtensions ().getByName ("jdks" );
385+ private RuntimeJava runtimeJavaHome (Provider <File > fileProvider , boolean explicitlySet , String bundledJdkMajorVersion ) {
386+ return runtimeJavaHome (fileProvider , explicitlySet , null , null , bundledJdkMajorVersion );
387+ }
388+
389+ private RuntimeJava runtimeJavaHome (
390+ Provider <File > fileProvider ,
391+ boolean explicitlySet ,
392+ String preReleasePostfix ,
393+ Integer buildNumber ,
394+ String bundledJdkMajorVersion
395+ ) {
396+ Provider <JavaVersion > javaVersion = fileProvider .map (
397+ javaHome -> determineJavaVersion (
398+ "runtime java.home" ,
399+ javaHome ,
400+ fileProvider .isPresent ()
401+ ? JavaVersion .toVersion (getResourceContents ("/minimumRuntimeVersion" ))
402+ : JavaVersion .toVersion (bundledJdkMajorVersion )
403+ )
404+ );
405+
406+ Provider <String > vendorDetails = fileProvider .map (j -> metadataDetector .getMetadata (getJavaInstallation (j )))
407+ .map (m -> formatJavaVendorDetails (m ));
408+
409+ return new RuntimeJava (fileProvider , javaVersion , vendorDetails , explicitlySet , preReleasePostfix , buildNumber );
410+ }
411+
412+ private RuntimeJava resolvePreReleaseRuntimeJavaHome (String runtimeJavaProperty , String bundledJdkMajorVersion ) {
413+ var major = JavaLanguageVersion .of (Integer .parseInt (runtimeJavaProperty .substring (0 , runtimeJavaProperty .length () - 4 )));
405414 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 );
415+ var jdkbuild = buildNumber == null ? findLatestPreReleaseBuild ( major ) : findPreReleaseBuild ( major , buildNumber );
416+ String preReleaseType = jdkbuild . type ( );
417+ String prVersionString = String . format ( "%d-%s+%d" , major . asInt (), preReleaseType , jdkbuild . buildNumber ());
418+ NamedDomainObjectContainer < Jdk > container = ( NamedDomainObjectContainer < Jdk >) project . getExtensions (). getByName ( "jdks" );
419+ Jdk jdk = container .create (preReleaseType + "_ " + major . asInt () , j -> {
420+ j .setVersion (prVersionString );
412421 j .setVendor ("openjdk" );
413422 j .setPlatform (OS .current ().javaOsReference );
414423 j .setArchitecture (Architecture .current ().javaClassifier );
415- j .setDistributionVersion ("ea" );
424+ j .setDistributionVersion (preReleaseType );
416425 });
417- return providers .provider (() -> new File (jdk .getJavaHomePath ().toString ()));
426+ // We on purpose resolve this here eagerly to ensure we resolve the jdk configuration in the context of the root project.
427+ // If we keep this lazy we can not guarantee in which project context this is resolved which will fail the build.
428+ File file = new File (jdk .getJavaHomePath ().toString ());
429+ return runtimeJavaHome (providers .provider (() -> file ), true , preReleaseType , jdkbuild .buildNumber (), bundledJdkMajorVersion );
418430 }
419431
420- @ NotNull
421432 private Provider <File > resolveJavaHomeFromToolChainService (String version ) {
422433 Property <JavaLanguageVersion > value = objectFactory .property (JavaLanguageVersion .class ).value (JavaLanguageVersion .of (version ));
423434 return toolChainService .launcherFor (javaToolchainSpec -> javaToolchainSpec .getLanguageVersion ().value (value ))
@@ -474,4 +485,5 @@ public void execute(JavaToolchainSpec spec) {
474485 spec .getLanguageVersion ().set (expectedJavaLanguageVersion );
475486 }
476487 }
488+
477489}
0 commit comments