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

markt pushed a commit to branch 10.1.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git

commit 9a229601c4c85ca3ce2cecd0ef98803ac3d9848b
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Fri Feb 21 10:35:41 2025 +0000

    Fix Java 21 version detection for JreCompat
---
 java/org/apache/tomcat/util/compat/Jre21Compat.java | 15 +++++++++++----
 webapps/docs/changelog.xml                          |  4 ++++
 2 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/java/org/apache/tomcat/util/compat/Jre21Compat.java 
b/java/org/apache/tomcat/util/compat/Jre21Compat.java
index ee01f3e28e..23ebd27feb 100644
--- a/java/org/apache/tomcat/util/compat/Jre21Compat.java
+++ b/java/org/apache/tomcat/util/compat/Jre21Compat.java
@@ -32,6 +32,7 @@ public class Jre21Compat extends Jre19Compat {
     private static final Log log = LogFactory.getLog(Jre21Compat.class);
     private static final StringManager sm = 
StringManager.getManager(Jre21Compat.class);
 
+    private static final boolean supported;
     private static final Method nameMethod;
     private static final Method startMethod;
     private static final Method ofVirtualMethod;
@@ -46,9 +47,14 @@ public class Jre21Compat extends Jre19Compat {
         Method m4 = null;
 
         try {
-            c1 = Class.forName("java.lang.Thread$Builder");
-            m1 = c1.getMethod("name", String.class, long.class);
-            m2 = c1.getMethod("start", Runnable.class);
+            // Note: Virtual threads is the main new feature in Java 21, but 
it was previously
+            // present as a preview. As a result, it is more accurate to test 
for another
+            // new class
+            c1 = Class.forName("java.util.SequencedCollection");
+
+            Class<?> c2 = Class.forName("java.lang.Thread$Builder");
+            m1 = c2.getMethod("name", String.class, long.class);
+            m2 = c2.getMethod("start", Runnable.class);
             m3 = Thread.class.getMethod("ofVirtual", (Class<?>[]) null);
             m4 = Subject.class.getMethod("callAs", Subject.class, 
Callable.class);
         } catch (ClassNotFoundException e) {
@@ -58,6 +64,7 @@ public class Jre21Compat extends Jre19Compat {
             // Should never happen
             log.error(sm.getString("jre21Compat.unexpected"), e);
         }
+        supported = (c1 != null);
         nameMethod = m1;
         startMethod = m2;
         ofVirtualMethod = m3;
@@ -65,7 +72,7 @@ public class Jre21Compat extends Jre19Compat {
     }
 
     static boolean isSupported() {
-        return ofVirtualMethod != null;
+        return supported;
     }
 
     @Override
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index c1bf0a592d..cfd1fe14cc 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -125,6 +125,10 @@
         <code>HttpServletRequest.login(String username, String password)</code>
         when the realm is configured to use GSSAPI authentication. (markt)
       </fix>
+      <fix>
+        Fix a bug in the JRE compatibility detection that incorrectly 
identified
+        Java 19 and Java 20 as supporting Java 21 features. (markt)
+      </fix>
     </changelog>
   </subsection>
   <subsection name="Coyote">


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to