88import  java .util .Set ;
99
1010import  org .gradle .StartParameter ;
11+ import  org .gradle .api .GradleException ;
1112import  org .gradle .api .Project ;
1213import  org .gradle .api .initialization .Settings ;
1314import  org .gradle .jvm .toolchain .JavaLanguageVersion ;
@@ -32,13 +33,15 @@ public class JdkVersionConfig {
3233
3334	private  final  boolean  explicit ;
3435	private  final  JavaLanguageVersion  baseline ;
36+ 	private  final  JavaLanguageVersion  min ;
3537	private  final  JavaLanguageVersion  max ;
3638	private  final  MainJdks  main ;
3739	private  final  TestJdks  test ;
3840
3941	public  JdkVersionConfig (
4042			boolean  explicit ,
4143			JavaLanguageVersion  baseline ,
44+ 			JavaLanguageVersion  min ,
4245			JavaLanguageVersion  max ,
4346			JavaLanguageVersion  mainCompilerVersion ,
4447			JavaLanguageVersion  mainReleaseVersion ,
@@ -47,6 +50,7 @@ public JdkVersionConfig(
4750			JavaLanguageVersion  testLauncherVersion ) {
4851		this .explicit  = explicit ;
4952		this .baseline  = baseline ;
53+ 		this .min  = min ;
5054		this .max  = max ;
5155		this .main  = new  MainJdks ( mainCompilerVersion , mainReleaseVersion  );
5256		this .test  = new  TestJdks ( testCompileVersion , testReleaseVersion , testLauncherVersion  );
@@ -72,6 +76,18 @@ public JavaLanguageVersion getBaselineVersion() {
7276		return  getBaseline ();
7377	}
7478
79+ 	public  JavaLanguageVersion  getMin () {
80+ 		return  min ;
81+ 	}
82+ 
83+ 	public  String  getMinStr () {
84+ 		return  getMin ().toString ();
85+ 	}
86+ 
87+ 	public  JavaLanguageVersion  getMinVersion () {
88+ 		return  getMin ();
89+ 	}
90+ 
7591	public  JavaLanguageVersion  getMax () {
7692		return  max ;
7793	}
@@ -128,36 +144,36 @@ public static JdkVersionConfig createVersionConfig(
128144			JavaLanguageVersion  explicitTestVersion ,
129145			JavaLanguageVersion  gradleJdkVersion ,
130146			JavaLanguageVersion  baselineJdkVersion ,
147+ 			JavaLanguageVersion  minSupportedJdkVersion ,
131148			JavaLanguageVersion  maxSupportedJdkVersion ) {
132149		final  boolean  explicitlyConfigured  = explicitMainVersion  != null  || explicitTestVersion  != null ;
133150
134151		final  JavaLanguageVersion  mainCompilerVersion ;
135152		final  JavaLanguageVersion  mainReleaseVersion ;
136153		final  JavaLanguageVersion  testCompilerVersion ;
137- 		final   JavaLanguageVersion  testReleaseVersion ;
154+ 		JavaLanguageVersion  testReleaseVersion ;
138155		final  JavaLanguageVersion  testLauncherVersion ;
139156
140157		if  ( explicitlyConfigured  ) {
141- 			mainCompilerVersion  = requireNonNullElse ( explicitMainVersion , baselineJdkVersion  );
142- 			testCompilerVersion  = requireNonNullElse ( explicitTestVersion , baselineJdkVersion  );
158+ 			mainCompilerVersion  = requireNonNullElse ( explicitMainVersion , minSupportedJdkVersion  );
159+ 			testCompilerVersion  = requireNonNullElse ( explicitTestVersion , minSupportedJdkVersion  );
143160			mainReleaseVersion  = baselineJdkVersion ;
144161
145- 			if  ( testCompilerVersion .asInt () > maxSupportedJdkVersion .asInt () ) {
162+ 			testReleaseVersion  = requireNonNullElse ( explicitTestVersion , mainReleaseVersion  );
163+ 			if  ( testReleaseVersion .asInt () > maxSupportedJdkVersion .asInt () ) {
146164				System .out .println (
147- 						"[WARN] Gradle does not support bytecode version '"  + testCompilerVersion  + "'." 
165+ 						"[WARN] Gradle does not support bytecode version '"  + testReleaseVersion  + "'." 
148166								+ " Forcing test bytecode to version "  + maxSupportedJdkVersion  + "." 
149167				);
150168				testReleaseVersion  = maxSupportedJdkVersion ;
151169			}
152- 			else  {
153- 				testReleaseVersion  = testCompilerVersion ;
154- 			}
155170
156- 			testLauncherVersion  = testCompilerVersion ;
171+ 			testLauncherVersion  = testReleaseVersion ;
157172
158173			return  new  JdkVersionConfig (
159174					true ,
160175					baselineJdkVersion ,
176+ 					minSupportedJdkVersion ,
161177					maxSupportedJdkVersion ,
162178					mainCompilerVersion ,
163179					mainReleaseVersion ,
@@ -170,6 +186,11 @@ public static JdkVersionConfig createVersionConfig(
170186			// Not testing a particular JDK version: we will use the same JDK used to run Gradle. 
171187			// We disable toolchains for convenience, so that anyone can just run the build with their own JDK 
172188			// without any additional options and without downloading the whole JDK. 
189+ 
190+ 			if  ( gradleJdkVersion .asInt () > minSupportedJdkVersion .asInt () ) {
191+ 				throw  new  GradleException ("This build requires at least JDK "  + minSupportedJdkVersion  + ", but you are using JDK "  + gradleJdkVersion .asInt ());
192+ 			}
193+ 
173194			if  ( gradleJdkVersion .asInt () > maxSupportedJdkVersion .asInt () ) {
174195				System .out .println (
175196						"[WARN] Gradle does not support this JDK, because it is too recent; build is likely to fail." 
@@ -184,6 +205,7 @@ public static JdkVersionConfig createVersionConfig(
184205			return  new  JdkVersionConfig (
185206					false ,
186207					baselineJdkVersion ,
208+ 					minSupportedJdkVersion ,
187209					maxSupportedJdkVersion ,
188210					gradleJdkVersion ,
189211					baselineJdkVersion ,
0 commit comments