On 12/01/2026 18:10, Christopher Schultz wrote:
Mark,

Should this kind of thing go under "Notable Changes"?

https://tomcat.apache.org/ migration-11.0.html#Tomcat_11.0.x_noteable_changes

I ask because updating tcnative on *NIX is a whole separate process, and should probably be done before attempting to upgrade Tomcat itself.

Yes, it probably should. Remind me if I forget to do that when I update the site after the release.

Mark



-chris

On 1/12/26 10:55 AM, [email protected] wrote:
This is an automated email from the ASF dual-hosted git repository.

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


The following commit(s) were added to refs/heads/main by this push:
      new 666456c1cf Update minimum Tomcat Native version to 1.3.4/2.0.12
666456c1cf is described below

commit 666456c1cff8a23c44b92f033d50fdce9874266e
Author: Mark Thomas <[email protected]>
AuthorDate: Mon Jan 12 15:55:30 2026 +0000

     Update minimum Tomcat Native version to 1.3.4/2.0.12
     This is in preparation for adding TLS 1.3 config support and expanding
     the OCSP config support
---
  .../apache/catalina/core/AprLifecycleListener.java | 54 ++++++++++++ +++++-----
  .../apache/catalina/core/LocalStrings.properties   |  4 +-
  webapps/docs/changelog.xml                         |  6 +++
  3 files changed, 52 insertions(+), 12 deletions(-)

diff --git a/java/org/apache/catalina/core/AprLifecycleListener.java b/java/org/apache/catalina/core/AprLifecycleListener.java
index bf047c362d..d10d9591fe 100644
--- a/java/org/apache/catalina/core/AprLifecycleListener.java
+++ b/java/org/apache/catalina/core/AprLifecycleListener.java
@@ -64,12 +64,17 @@ public class AprLifecycleListener implements LifecycleListener {
      // ---------------------------------------------- Constants
-    protected static final int TCN_REQUIRED_MAJOR = 1;
-    protected static final int TCN_REQUIRED_MINOR = 2;
-    protected static final int TCN_REQUIRED_PATCH = 34;
+    private static final int TCN_1_REQUIRED_MINOR = 3;
+    private static final int TCN_1_REQUIRED_PATCH = 4;
+    private static final int TCN_1_RECOMMENDED_MINOR = 3;
+    private static final int TCN_1_RECOMMENDED_PATCH = 4;
+
+    protected static final int TCN_REQUIRED_MAJOR = 2;
+    protected static final int TCN_REQUIRED_MINOR = 0;
+    protected static final int TCN_REQUIRED_PATCH = 12;
      protected static final int TCN_RECOMMENDED_MAJOR = 2;
      protected static final int TCN_RECOMMENDED_MINOR = 0;
-    protected static final int TCN_RECOMMENDED_PV = 5;
+    protected static final int TCN_RECOMMENDED_PV = 12;
      // ---------------------------------------------- Properties
@@ -209,9 +214,6 @@ public class AprLifecycleListener implements LifecycleListener {
      }
      private static void init() {
-        int rqver = TCN_REQUIRED_MAJOR * 1000 + TCN_REQUIRED_MINOR * 100 + TCN_REQUIRED_PATCH; -        int rcver = TCN_RECOMMENDED_MAJOR * 1000 + TCN_RECOMMENDED_MINOR * 100 + TCN_RECOMMENDED_PV;
-
          if (org.apache.tomcat.jni.AprStatus.isAprInitialized()) {
              return;
          }
@@ -249,9 +251,34 @@ public class AprLifecycleListener implements LifecycleListener {
              }
              return;
          }
+
+        /*
+         * With parallel development of 1.x and 2.x there are now minimum and recommended versions for both branches.
+         *
+         * The minimum required version is increased when the Tomcat Native API is changed (typically extended) to +         * include functionality that Tomcat expects to always be present.
+         *
+         * The minimum recommended version is increased when there is a change in Tomcat Native that while not required
+         * is recommended (such as bug fixes).
+         */
+        int rqver;
+        int rcver;
+        if (tcnMajor == 1) {
+            rqver = 1000 + TCN_1_REQUIRED_MINOR * 100 + TCN_1_REQUIRED_PATCH; +            rcver = 1000 + TCN_1_RECOMMENDED_MINOR * 100 + TCN_1_RECOMMENDED_PATCH;
+        } else {
+            rqver = TCN_REQUIRED_MAJOR * 1000 + TCN_REQUIRED_MINOR * 100 + TCN_REQUIRED_PATCH; +            rcver = TCN_RECOMMENDED_MAJOR * 1000 + TCN_RECOMMENDED_MINOR * 100 + TCN_RECOMMENDED_PV;
+        }
+
          if (tcnVersion < rqver) {
-            log.error(sm.getString("aprListener.tcnInvalid", Library.versionString(), -                    TCN_REQUIRED_MAJOR + "." + TCN_REQUIRED_MINOR + "." + TCN_REQUIRED_PATCH));
+            if (tcnMajor == 1) {
+                log.error(sm.getString("aprListener.tcnInvalid.1", Library.versionString(), +                        "1." + TCN_1_REQUIRED_MINOR + "." + TCN_1_REQUIRED_PATCH));
+            } else {
+                log.error(sm.getString("aprListener.tcnInvalid", Library.versionString(), +                        TCN_REQUIRED_MAJOR + "." + TCN_REQUIRED_MINOR + "." + TCN_REQUIRED_PATCH));
+            }
              try {
                  // Terminate the APR in case the version
                  // is below required.
@@ -263,8 +290,13 @@ public class AprLifecycleListener implements LifecycleListener {
              return;
          }
          if (tcnVersion < rcver) {
- initInfoLogMessages.add(sm.getString("aprListener.tcnVersion", Library.versionString(), -                    TCN_RECOMMENDED_MAJOR + "." + TCN_RECOMMENDED_MINOR + "." + TCN_RECOMMENDED_PV));
+            if (tcnMajor == 1) {
+ initInfoLogMessages.add(sm.getString("aprListener.tcnVersion.1", Library.versionString(), +                        "1." + TCN_1_RECOMMENDED_MINOR + "." + TCN_1_RECOMMENDED_PATCH));
+            } else {
+ initInfoLogMessages.add(sm.getString("aprListener.tcnVersion", Library.versionString(), +                        TCN_RECOMMENDED_MAJOR + "." + TCN_RECOMMENDED_MINOR + "." + TCN_RECOMMENDED_PV));
+            }
          }
          initInfoLogMessages
diff --git a/java/org/apache/catalina/core/LocalStrings.properties b/ java/org/apache/catalina/core/LocalStrings.properties
index 31602e7018..37d1805d6f 100644
--- a/java/org/apache/catalina/core/LocalStrings.properties
+++ b/java/org/apache/catalina/core/LocalStrings.properties
@@ -84,9 +84,11 @@ aprListener.requireNotInFIPSMode=AprLifecycleListener is configured to require t   aprListener.skipFIPSInitialization=Already in FIPS mode; skipping FIPS initialization.
  aprListener.sslInit=Failed to initialize the SSLEngine.
  aprListener.sslRequired=[{0}] is not a valid value for SSLEngine when using version [{1}] of the Tomcat Native library since SSL is required for version 2.x onwards. -aprListener.tcnInvalid=An incompatible version [{0}] of the Apache Tomcat Native library is installed, while Tomcat requires version [{1}] +aprListener.tcnInvalid=An incompatible version [{0}] of the Apache Tomcat Native library is installed, while Tomcat requires at least version [{1}] +aprListener.tcnInvalid.1=An incompatible version [{0}] of the Apache Tomcat Native library is installed, while Tomcat requires at least version [{1}] of Tomcat Native 1.x   aprListener.tcnValid=Loaded Apache Tomcat Native library [{0}] using APR version [{1}].   aprListener.tcnVersion=An older version [{0}] of the Apache Tomcat Native library is installed, while Tomcat recommends a minimum version of [{1}] +aprListener.tcnVersion.1=An older version [{0}] of the Apache Tomcat Native library is installed, while Tomcat recommends a minimum version of [{1}] of Tomcat Native 1.x   aprListener.tooLateForFIPSMode=Cannot setFIPSMode: SSL has already been initialized   aprListener.tooLateForSSLEngine=Cannot setSSLEngine: SSL has already been initialized   aprListener.tooLateForSSLRandomSeed=Cannot setSSLRandomSeed: SSL has already been initialized
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index 569684ca84..4a1d0e3369 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -205,6 +205,12 @@
          <bug>69918</bug>: Ensure request parameters are correctly parsed for HTTP/2 requests
          when the content-length header is not set. (dsoumis)
        </fix>
+      <update>
+        Enable minimum and recommended Tomcat Native versions to be set
+        separately for Tomcat Native 1.x and 2.x. Update the minimum and
+        recommended versions for Tomcat Native 1.x to 1.3.4. Update the minimum +        and recommended versions for Tomcat Native 2.x to 2.0.12. (markt)
+      </update>
      </changelog>
    </subsection>
    <subsection name="Coyote">


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to