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