This is an automated email from the ASF dual-hosted git repository.

houston pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/solr.git


The following commit(s) were added to refs/heads/main by this push:
     new 41920dd9f2f build: Fix smoketest for Solr 10 (#3024)
41920dd9f2f is described below

commit 41920dd9f2f62f6323999b654f898cb07a590b71
Author: Houston Putman <[email protected]>
AuthorDate: Tue Jan 14 14:50:33 2025 -0600

    build: Fix smoketest for Solr 10 (#3024)
    
    - Fix smoketest for Solr 10
    
    - Fix documentation (javadocs) java version
    
    - Fix some release wizard versions
---
 .../java/org/apache/lucene/gradle/Checksum.java    |   4 +-
 dev-tools/scripts/releaseWizard.py                 |   4 +-
 dev-tools/scripts/releaseWizard.yaml               |   2 +-
 dev-tools/scripts/smokeTestRelease.py              | 111 +++++++++++----------
 gradle/documentation/render-javadoc.gradle         |  49 +++++++--
 .../render-javadoc/{java11 => java17}/package-list |   0
 .../render-javadoc/{java11 => java21}/package-list |  20 ++--
 gradle/java/javac.gradle                           |  24 ++---
 .../src/markdown/SYSTEM_REQUIREMENTS.md            |   2 +-
 9 files changed, 123 insertions(+), 93 deletions(-)

diff --git 
a/build-tools/build-infra/src/main/java/org/apache/lucene/gradle/Checksum.java 
b/build-tools/build-infra/src/main/java/org/apache/lucene/gradle/Checksum.java
index a1d5c09586f..925493822ef 100644
--- 
a/build-tools/build-infra/src/main/java/org/apache/lucene/gradle/Checksum.java
+++ 
b/build-tools/build-infra/src/main/java/org/apache/lucene/gradle/Checksum.java
@@ -47,7 +47,7 @@ import org.gradle.work.InputChanges;
 public class Checksum extends DefaultTask {
   private FileCollection files;
   private File outputDir;
-  private Algorithm algorithm = Checksum.Algorithm.SHA512;
+  private Algorithm algorithm;
 
   public enum Algorithm {
     MD5(new DigestUtils(DigestUtils.getMd5Digest())),
@@ -68,7 +68,7 @@ public class Checksum extends DefaultTask {
 
   public Checksum() {
     outputDir = new File(getProject().getBuildDir(), "checksums");
-    algorithm = Algorithm.SHA256;
+    algorithm = Checksum.Algorithm.SHA512;
   }
 
   @InputFiles
diff --git a/dev-tools/scripts/releaseWizard.py 
b/dev-tools/scripts/releaseWizard.py
index 4520a3c832a..e5dd6b835e7 100755
--- a/dev-tools/scripts/releaseWizard.py
+++ b/dev-tools/scripts/releaseWizard.py
@@ -68,7 +68,7 @@ from consolemenu.items import FunctionItem, SubmenuItem, 
ExitItem
 from scriptutil import BranchType, Version, download, run
 
 # Solr-to-Java version mapping
-java_versions = {6: 8, 7: 8, 8: 8, 9: 11, 10: 11}
+java_versions = {6: 8, 7: 8, 8: 8, 9: 11, 10: 21}
 editor = None
 state = None
 templates = None
@@ -1353,7 +1353,7 @@ def main():
 
     state.save()
 
-    # Smoketester requires JAVA11_HOME to point to Java11
+    # Smoketester requires JAVA21_HOME to point to Java21
     os.environ['JAVA_HOME'] = state.get_java_home()
     os.environ['JAVACMD'] = state.get_java_cmd()
 
diff --git a/dev-tools/scripts/releaseWizard.yaml 
b/dev-tools/scripts/releaseWizard.yaml
index a1ccdc5cf44..2823eac0e13 100644
--- a/dev-tools/scripts/releaseWizard.yaml
+++ b/dev-tools/scripts/releaseWizard.yaml
@@ -226,7 +226,7 @@ groups:
       You will need these tools:
 
       * Python v3.4 or later, with dependencies listed in requirements.txt
-      * Java 11 in $JAVA11_HOME
+      * Java 21 in $JAVA21_HOME
       * gpg
       * git
       * svn
diff --git a/dev-tools/scripts/smokeTestRelease.py 
b/dev-tools/scripts/smokeTestRelease.py
index 6358a152dd8..6744aea9070 100755
--- a/dev-tools/scripts/smokeTestRelease.py
+++ b/dev-tools/scripts/smokeTestRelease.py
@@ -141,15 +141,18 @@ def checkJARMetaData(desc, jarFile, gitRevision, version):
 
     s = decodeUTF8(z.read(MANIFEST_FILE_NAME))
 
+    compileJDK = '21'
+    if 'solrj' in desc or 'api' in desc:
+      compileJDK = '17'
     for verify in (
       'Specification-Vendor: The Apache Software Foundation',
       'Implementation-Vendor: The Apache Software Foundation',
       'Specification-Title: Apache Solr Search Server:',
       'Implementation-Title: org.apache.solr',
-      'X-Compile-Source-JDK: 11',
-      'X-Compile-Target-JDK: 11',
+      'X-Compile-Source-JDK: %s' % compileJDK,
+      'X-Compile-Target-JDK: %s' % compileJDK,
       'Specification-Version: %s' % version,
-      'X-Build-JDK: 11.',
+      'X-Build-JDK: 21.',
       'Extension-Name: org.apache.solr'):
       if type(verify) is not tuple:
         verify = (verify,)
@@ -625,8 +628,8 @@ def verifyUnpacked(java, artifact, unpackPath, gitRevision, 
version, testArgs):
   #     in_root_folder.remove(fileName)
 
   if isSrc:
-    expected_src_root_folders = ['buildSrc', 'dev-docs', 'dev-tools', 
'gradle', 'help', 'solr']
-    expected_src_root_files = ['build.gradle', 'gradlew', 'gradlew.bat', 
'settings.gradle', 'versions.lock', 'versions.props']
+    expected_src_root_folders = ['build-tools', 'dev-docs', 'dev-tools', 
'gradle', 'help', 'solr']
+    expected_src_root_files = ['build.gradle', 'gradlew', 'gradlew.bat', 
'settings.gradle', 'settings-gradle.lockfile', 'versions.lock']
     expected_src_solr_files = ['build.gradle']
     expected_src_solr_folders = ['benchmark',  'bin', 'modules', 'api', 
'core', 'cross-dc-manager', 'docker', 'documentation', 'example', 'licenses', 
'packaging', 'distribution', 'prometheus-exporter', 'server', 'solr-ref-guide', 
'solrj', 'solrj-streaming', 'solrj-zookeeper', 'test-framework', 'webapp', 
'.gitignore', '.gitattributes']
     is_in_list(in_root_folder, expected_src_root_folders)
@@ -660,47 +663,47 @@ def verifyUnpacked(java, artifact, unpackPath, 
gitRevision, version, testArgs):
 
     validateCmd = './gradlew --no-daemon check -p solr/documentation'
     print('    run "%s"' % validateCmd)
-    java.run_java11(validateCmd, '%s/validate.log' % unpackPath)
-
-    print("    run tests w/ Java 11 and testArgs='%s'..." % testArgs)
-    java.run_java11('./gradlew --no-daemon test %s' % testArgs, '%s/test.log' 
% unpackPath)
-    print("    run integration tests w/ Java 11")
-    java.run_java11('./gradlew --no-daemon integrationTest 
-Dversion.release=%s' % version, '%s/itest.log' % unpackPath)
-    print("    build binary release w/ Java 11")
-    java.run_java11('./gradlew --no-daemon dev -Dversion.release=%s' % 
version, '%s/assemble.log' % unpackPath)
-    testSolrExample("%s/solr/packaging/build/dev" % unpackPath, 
java.java11_home, False)
-
-    if java.run_java17:
-      print("    run tests w/ Java 17 and testArgs='%s'..." % testArgs)
-      java.run_java17('./gradlew --no-daemon clean test %s' % testArgs, 
'%s/test-java17.log' % unpackPath)
-      print("    run integration tests w/ Java 17")
-      java.run_java17('./gradlew --no-daemon integrationTest 
-Dversion.release=%s' % version, '%s/itest-java17.log' % unpackPath)
-      print("    build binary release w/ Java 17")
-      java.run_java17('./gradlew --no-daemon dev -Dversion.release=%s' % 
version, '%s/assemble-java17.log' % unpackPath)
-      testSolrExample("%s/solr/packaging/build/dev" % unpackPath, 
java.java17_home, False)
+    java.run_java21(validateCmd, '%s/validate.log' % unpackPath)
+
+    print("    run tests w/ Java 21 and testArgs='%s'..." % testArgs)
+    java.run_java21('./gradlew --no-daemon test %s' % testArgs, '%s/test.log' 
% unpackPath)
+    print("    run integration tests w/ Java 21")
+    java.run_java21('./gradlew --no-daemon integrationTest 
-Dversion.release=%s' % version, '%s/itest.log' % unpackPath)
+    print("    build binary release w/ Java 21")
+    java.run_java21('./gradlew --no-daemon dev -Dversion.release=%s' % 
version, '%s/assemble.log' % unpackPath)
+    testSolrExample("%s/solr/packaging/build/dev" % unpackPath, 
java.java21_home, False)
+
+    if java.run_java25:
+      print("    run tests w/ Java 25 and testArgs='%s'..." % testArgs)
+      java.run_java25('./gradlew --no-daemon clean test %s' % testArgs, 
'%s/test-java25.log' % unpackPath)
+      print("    run integration tests w/ Java 25")
+      java.run_java25('./gradlew --no-daemon integrationTest 
-Dversion.release=%s' % version, '%s/itest-java25.log' % unpackPath)
+      print("    build binary release w/ Java 25")
+      java.run_java25('./gradlew --no-daemon dev -Dversion.release=%s' % 
version, '%s/assemble-java25.log' % unpackPath)
+      testSolrExample("%s/solr/packaging/build/dev" % unpackPath, 
java.java25_home, False)
 
   else:
     # Binary tarball
     checkAllJARs(os.getcwd(), gitRevision, version)
 
-    print('    copying unpacked distribution for Java 11 ...')
-    java11UnpackPath = '%s-java11' % unpackPath
-    if os.path.exists(java11UnpackPath):
-      shutil.rmtree(java11UnpackPath)
-    shutil.copytree(unpackPath, java11UnpackPath)
-    os.chdir(java11UnpackPath)
-    print('    test solr example w/ Java 11...')
-    testSolrExample(java11UnpackPath, java.java11_home, isSlim)
-
-    if java.run_java17:
-      print('    copying unpacked distribution for Java 17 ...')
-      java17UnpackPath = '%s-java17' % unpackPath
-      if os.path.exists(java17UnpackPath):
-        shutil.rmtree(java17UnpackPath)
-      shutil.copytree(unpackPath, java17UnpackPath)
-      os.chdir(java17UnpackPath)
-      print('    test solr example w/ Java 17...')
-      testSolrExample(java17UnpackPath, java.java17_home, isSlim)
+    print('    copying unpacked distribution for Java 21 ...')
+    java21UnpackPath = '%s-java21' % unpackPath
+    if os.path.exists(java21UnpackPath):
+      shutil.rmtree(java21UnpackPath)
+    shutil.copytree(unpackPath, java21UnpackPath)
+    os.chdir(java21UnpackPath)
+    print('    test solr example w/ Java 21...')
+    testSolrExample(java21UnpackPath, java.java21_home, isSlim)
+
+    if java.run_java25:
+      print('    copying unpacked distribution for Java 25 ...')
+      java25UnpackPath = '%s-java25' % unpackPath
+      if os.path.exists(java25UnpackPath):
+        shutil.rmtree(java25UnpackPath)
+      shutil.copytree(unpackPath, java25UnpackPath)
+      os.chdir(java25UnpackPath)
+      print('    test solr example w/ Java 25...')
+      testSolrExample(java25UnpackPath, java.java25_home, isSlim)
 
     os.chdir(unpackPath)
 
@@ -1019,7 +1022,7 @@ def crawl(downloadedFiles, urlString, targetDir, 
exclusions=set()):
         sys.stdout.write('.')
 
 
-def make_java_config(parser, java17_home):
+def make_java_config(parser, java25_home):
   def _make_runner(java_home, version):
     print('Java %s JAVA_HOME=%s' % (version, java_home))
     if cygwin:
@@ -1033,23 +1036,23 @@ def make_java_config(parser, java17_home):
     def run_java(cmd, logfile):
       run('%s; %s' % (cmd_prefix, cmd), logfile)
     return run_java
-  java11_home =  os.environ.get('JAVA_HOME')
-  if java11_home is None:
+  java21_home =  os.environ.get('JAVA_HOME')
+  if java21_home is None:
     parser.error('JAVA_HOME must be set')
-  run_java11 = _make_runner(java11_home, '11')
-  run_java17 = None
-  if java17_home is not None:
-    run_java17 = _make_runner(java17_home, '17')
+  run_java21 = _make_runner(java21_home, '21')
+  run_java25 = None
+  if java25_home is not None:
+    run_java25 = _make_runner(java25_home, '25')
 
-  jc = namedtuple('JavaConfig', 'run_java11 java11_home run_java17 
java17_home')
-  return jc(run_java11, java11_home, run_java17, java17_home)
+  jc = namedtuple('JavaConfig', 'run_java21 java21_home run_java25 
java25_home')
+  return jc(run_java21, java21_home, run_java25, java25_home)
 
 version_re = re.compile(r'(\d+\.\d+\.\d+(-ALPHA|-BETA)?)')
 revision_re = re.compile(r'rev-([a-f\d]+)')
 def parse_config():
   epilogue = textwrap.dedent('''
     Example usage:
-    python3 -u dev-tools/scripts/smokeTestRelease.py 
https://dist.apache.org/repos/dist/dev/solr/solr-9.0.0-RC1-rev-c7510a0...
+    python3 -u dev-tools/scripts/smokeTestRelease.py 
https://dist.apache.org/repos/dist/dev/solr/solr-10.0.0-RC1-rev-c7510a0...
   ''')
   description = 'Utility to test a release.'
   parser = argparse.ArgumentParser(description=description, epilog=epilogue,
@@ -1064,8 +1067,8 @@ def parse_config():
                       help='GIT revision number that release was built with, 
defaults to that in URL')
   parser.add_argument('--version', metavar='X.Y.Z(-ALPHA|-BETA)?',
                       help='Version of the release, defaults to that in URL')
-  parser.add_argument('--test-java17', metavar='java17_home',
-                      help='Path to Java17 home directory, to run tests with 
if specified')
+  parser.add_argument('--test-java25', metavar='java25_home',
+                      help='Path to Java25 home directory, to run tests with 
if specified')
   parser.add_argument('--download-only', action='store_true', default=False,
                       help='Only perform download and sha hash check steps')
   parser.add_argument('--dev-mode', action='store_true', default=False,
@@ -1094,7 +1097,7 @@ def parse_config():
   if c.local_keys is not None and not os.path.exists(c.local_keys):
     parser.error('Local KEYS file "%s" not found' % c.local_keys)
 
-  c.java = make_java_config(parser, c.test_java17)
+  c.java = make_java_config(parser, c.test_java25)
 
   if c.tmp_dir:
     c.tmp_dir = os.path.abspath(c.tmp_dir)
diff --git a/gradle/documentation/render-javadoc.gradle 
b/gradle/documentation/render-javadoc.gradle
index 6c637e540df..4c9c7bcad10 100644
--- a/gradle/documentation/render-javadoc.gradle
+++ b/gradle/documentation/render-javadoc.gradle
@@ -18,7 +18,7 @@ import org.gradle.internal.jvm.Jvm
  */
 
 // generate javadocs by calling javadoc tool
-// see https://docs.oracle.com/en/java/javase/11/tools/javadoc.html
+// see https://docs.oracle.com/en/java/javase/21/javadoc/javadoc.html
 
 def resources = scriptResources(buildscript)
 
@@ -49,10 +49,11 @@ allprojects {
       description "Generates Javadoc API documentation for each module. This 
directly invokes javadoc tool."
       group "documentation"
 
-      taskResources = project.relativePath(resources)
+      taskResources = resources
       dependsOn sourceSets.main.compileClasspath
       classpath = sourceSets.main.compileClasspath
       srcDirSet = sourceSets.main.java
+      releaseVersion = project.minJavaVersion
 
       outputDir = project.javadoc.destinationDir
     }
@@ -61,10 +62,11 @@ allprojects {
       description "Generates Javadoc API documentation for the site (relative 
links)."
       group "documentation"
 
-      taskResources = project.relativePath(resources)
+      taskResources = resources
       dependsOn sourceSets.main.compileClasspath
       classpath = sourceSets.main.compileClasspath;
       srcDirSet = sourceSets.main.java;
+      releaseVersion = project.minJavaVersion
 
       relativeProjectLinks = true
 
@@ -80,15 +82,13 @@ allprojects {
 // Set up titles and link up some offline docs for all documentation
 // (they may be unused but this doesn't do any harm).
 
-def javaJavadocPackages = rootProject.file("${resources}/java11/")
-def junitJavadocPackages = rootProject.file("${resources}/junit/")
 allprojects {
   project.tasks.withType(RenderJavadocTask) {
     title = "Solr ${project.version} ${project.name} API"
 
     offlineLinks += [
-        "https://docs.oracle.com/en/java/javase/11/docs/api/": 
project.relativePath(javaJavadocPackages),
-        "https://junit.org/junit4/javadoc/4.12/": 
project.relativePath(junitJavadocPackages)
+        
"https://docs.oracle.com/en/java/javase/${project.minJavaVersion}/docs/api/": 
rootProject.file("${resources}/java${project.minJavaVersion}/"),
+        "https://junit.org/junit4/javadoc/4.12/": 
rootProject.file("${resources}/junit/")
     ]
 
     solrDocUrl = provider({ rootProject.solrDocUrl })
@@ -198,10 +198,26 @@ configure(subprojects) {
   }
 }
 
+class OfflineLink implements Serializable {
+  @Input
+  String url
+
+  @InputDirectory
+  @PathSensitive(PathSensitivity.RELATIVE)
+  @IgnoreEmptyDirectories
+  File location
+
+  OfflineLink(String url, File location) {
+    this.url = url
+    this.location = location
+  }
+}
+
 @CacheableTask
 class RenderJavadocTask extends DefaultTask {
   @InputFiles
   @PathSensitive(PathSensitivity.RELATIVE)
+  @IgnoreEmptyDirectories
   @SkipWhenEmpty
   SourceDirectorySet srcDirSet;
 
@@ -227,7 +243,16 @@ class RenderJavadocTask extends DefaultTask {
   boolean relativeProjectLinks = false
 
   @Input
-  def offlineLinks = [:]
+  JavaVersion releaseVersion
+
+  @Internal
+  Map<String, File> offlineLinks = [:]
+
+  // Computes cacheable inputs from the map in offlineLinks.
+  @Nested
+  List<OfflineLink> getCacheableOfflineLinks() {
+    return offlineLinks.collect { url, location -> new OfflineLink(url, 
location) }
+  }
 
   @Input
   @Optional
@@ -254,8 +279,10 @@ class RenderJavadocTask extends DefaultTask {
   final Property<String> executable = 
project.objects.property(String).convention(
       project.provider { Jvm.current().javadocExecutable.toString() })
 
-  @Input
-  def taskResources
+  @InputDirectory
+  @PathSensitive(PathSensitivity.RELATIVE)
+  @IgnoreEmptyDirectories
+  File taskResources
 
   /** Utility method to recursively collect all tasks with same name like this 
one that we depend on */
   private Set findRenderTasksInDependencies() {
@@ -370,7 +397,7 @@ class RenderJavadocTask extends DefaultTask {
       opts << [ '-linkoffline', url, dir ]
     }
 
-    opts << [ '--release', project.minJavaVersion.toString() ]
+    opts << [ '--release', releaseVersion.toString() ]
     opts << '-Xdoclint:all,-missing'
 
     // Increase Javadoc's heap.
diff --git a/gradle/documentation/render-javadoc/java11/package-list 
b/gradle/documentation/render-javadoc/java17/package-list
similarity index 100%
copy from gradle/documentation/render-javadoc/java11/package-list
copy to gradle/documentation/render-javadoc/java17/package-list
diff --git a/gradle/documentation/render-javadoc/java11/package-list 
b/gradle/documentation/render-javadoc/java21/package-list
similarity index 96%
rename from gradle/documentation/render-javadoc/java11/package-list
rename to gradle/documentation/render-javadoc/java21/package-list
index 4cfabf8fdf8..4d9e2fefef1 100644
--- a/gradle/documentation/render-javadoc/java11/package-list
+++ b/gradle/documentation/render-javadoc/java21/package-list
@@ -2,10 +2,13 @@ module:java.base
 java.io
 java.lang
 java.lang.annotation
+java.lang.constant
+java.lang.foreign
 java.lang.invoke
 java.lang.module
 java.lang.ref
 java.lang.reflect
+java.lang.runtime
 java.math
 java.net
 java.net.spi
@@ -18,7 +21,6 @@ java.nio.file
 java.nio.file.attribute
 java.nio.file.spi
 java.security
-java.security.acl
 java.security.cert
 java.security.interfaces
 java.security.spec
@@ -35,6 +37,7 @@ java.util.concurrent.atomic
 java.util.concurrent.locks
 java.util.function
 java.util.jar
+java.util.random
 java.util.regex
 java.util.spi
 java.util.stream
@@ -131,6 +134,7 @@ javax.naming
 javax.naming.directory
 javax.naming.event
 javax.naming.ldap
+javax.naming.ldap.spi
 javax.naming.spi
 module:java.net.http
 java.net.http
@@ -138,7 +142,6 @@ module:java.prefs
 java.util.prefs
 module:java.rmi
 java.rmi
-java.rmi.activation
 java.rmi.dgc
 java.rmi.registry
 java.rmi.server
@@ -219,12 +222,11 @@ module:jdk.hotspot.agent
 module:jdk.httpserver
 com.sun.net.httpserver
 com.sun.net.httpserver.spi
+module:jdk.incubator.vector
+jdk.incubator.vector
 module:jdk.jartool
-com.sun.jarsigner
 jdk.security.jarsigner
 module:jdk.javadoc
-com.sun.javadoc
-com.sun.tools.javadoc
 jdk.javadoc.doclet
 module:jdk.jcmd
 module:jdk.jconsole
@@ -241,6 +243,7 @@ module:jdk.jfr
 jdk.jfr
 jdk.jfr.consumer
 module:jdk.jlink
+module:jdk.jpackage
 module:jdk.jshell
 jdk.jshell
 jdk.jshell.execution
@@ -260,11 +263,8 @@ module:jdk.naming.rmi
 module:jdk.net
 jdk.net
 jdk.nio
-module:jdk.pack
-module:jdk.rmic
-module:jdk.scripting.nashorn
-jdk.nashorn.api.scripting
-jdk.nashorn.api.tree
+module:jdk.nio.mapmode
+jdk.nio.mapmode
 module:jdk.sctp
 com.sun.nio.sctp
 module:jdk.security.auth
diff --git a/gradle/java/javac.gradle b/gradle/java/javac.gradle
index ec33f977c64..be0196998a8 100644
--- a/gradle/java/javac.gradle
+++ b/gradle/java/javac.gradle
@@ -19,19 +19,19 @@
 
 allprojects {
   plugins.withType(JavaPlugin) {
-      // Use 'release' flag instead of 'source' and 'target'
-      tasks.withType(JavaCompile) {
-        compileTestJava {
-          sourceCompatibility = project.minJavaTestVersion
-          targetCompatibility = project.minJavaTestVersion
-          options.compilerArgs += ["--release", 
project.minJavaTestVersion.toString()]
-        }
-        compileJava {
-          sourceCompatibility = project.minJavaVersion
-          targetCompatibility = project.minJavaVersion
-          options.compilerArgs += ["--release", 
project.minJavaVersion.toString()]
-        }
+    sourceCompatibility = project.minJavaVersion
+    targetCompatibility = project.minJavaVersion
+    // Use 'release' flag instead of 'source' and 'target'
+    tasks.withType(JavaCompile) {
+      compileTestJava {
+        sourceCompatibility = project.minJavaTestVersion
+        targetCompatibility = project.minJavaTestVersion
+        options.compilerArgs += ["--release", 
project.minJavaTestVersion.toString()]
+      }
+      compileJava {
+        options.compilerArgs += ["--release", 
project.minJavaVersion.toString()]
       }
+    }
     // Configure warnings.
     tasks.withType(JavaCompile) {
       options.encoding = "UTF-8"
diff --git a/solr/documentation/src/markdown/SYSTEM_REQUIREMENTS.md 
b/solr/documentation/src/markdown/SYSTEM_REQUIREMENTS.md
index 57687e75962..9f13195955a 100644
--- a/solr/documentation/src/markdown/SYSTEM_REQUIREMENTS.md
+++ b/solr/documentation/src/markdown/SYSTEM_REQUIREMENTS.md
@@ -1,6 +1,6 @@
 # System Requirements
 
-Apache Solr runs on Java 11 or greater.
+Apache Solr runs on Java 21 or greater.
 
 It is also recommended to always use the latest update version of your
 Java VM, because bugs may affect Solr. An overview of known JVM bugs

Reply via email to