Note: This applies to both 8.5.x and 9.0.x. Since tcnative 1.x and 2.x can be installed side by side: > root@deblndw011x:/tmp/local/lib > # ll > total 19576 > drwxr-xr-x 2 osipovmi wheel 512 2023-10-12 17:24 engines-3/ > -rw-r--r-- 1 osipovmi wheel 8917782 2023-10-12 17:24 libcrypto.a > lrwxr-xr-x 1 osipovmi wheel 14 2023-10-12 17:24 libcrypto.so@ -> libcrypto.so.3 > -rwxr-xr-x 1 osipovmi wheel 5050168 2023-10-12 17:24 libcrypto.so.3* > -rw-r--r-- 1 osipovmi wheel 1328044 2023-10-12 17:24 libssl.a > lrwxr-xr-x 1 osipovmi wheel 11 2023-10-12 17:24 libssl.so@ -> libssl.so.3 > -rwxr-xr-x 1 osipovmi wheel 783496 2023-10-12 17:24 libssl.so.3* > -rw-r--r-- 1 osipovmi wheel 1701660 2023-10-27 12:57 libtcnative-1.a > -rwxr-xr-x 1 osipovmi wheel 1052 2023-10-27 12:57 libtcnative-1.la* > lrwxr-xr-x 1 osipovmi wheel 23 2023-10-27 12:57 libtcnative-1.so@ -> libtcnative-1.so.0.2.40 > lrwxr-xr-x 1 osipovmi wheel 23 2023-10-27 12:57 libtcnative-1.so.0@ -> libtcnative-1.so.0.2.40 > -rwxr-xr-x 1 osipovmi wheel 975800 2023-10-27 12:57 libtcnative-1.so.0.2.40* > -rw-r--r-- 1 osipovmi wheel 567160 2023-10-27 10:39 libtcnative-2.a > -rwxr-xr-x 1 osipovmi wheel 1050 2023-10-27 10:39 libtcnative-2.la* > lrwxr-xr-x 1 osipovmi wheel 22 2023-10-27 10:39 libtcnative-2.so@ -> libtcnative-2.so.0.0.7 > lrwxr-xr-x 1 osipovmi wheel 22 2023-10-27 10:39 libtcnative-2.so.0@ -> libtcnative-2.so.0.0.7 > -rwxr-xr-x 1 osipovmi wheel 361312 2023-10-27 10:39 libtcnative-2.so.0.0.7* > drwxr-xr-x 2 osipovmi wheel 512 2023-10-12 17:24 ossl-modules/ > drwxr-xr-x 2 osipovmi wheel 512 2023-10-12 17:24 pkgconfig/ or on Windows: > PS C:\Temp\apache-tomcat-9.0.83-dev\bin> gci -include *.dll > PS C:\Temp\apache-tomcat-9.0.83-dev\bin> gci -Path *.dll > > Directory: C:\Temp\apache-tomcat-9.0.83-dev\bin > > Mode LastWriteTime Length Name > ---- ------------- ------ ---- > -a--- 2023-09-28 14:25 3577344 tcnative-1.dll > -a--- 2023-09-27 16:24 3424256 tcnative-2.dll Now let's start Tomcat 9 with APR connector configured. Library.java will use: > private static final String [] NAMES = {"tcnative-2", "libtcnative-2", "tcnative-1", "libtcnative-1"}; Result: > 27-Oct-2023 13:11:18.029 INFORMATION [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["https-openssl-apr-30001"] > 27-Oct-2023 13:11:18.033 SCHWERWIEGEND [main] org.apache.catalina.util.LifecycleBase.handleSubClassException Failed to initialize component [Connector["https-openssl-apr-30001"]] > java.lang.UnsatisfiedLinkError: org.apache.tomcat.jni.Address.info(Ljava/lang/String;IIIJ)J > at org.apache.tomcat.jni.Address.info(Native Method) > at org.apache.tomcat.util.net.AprEndpoint.bind(AprEndpoint.java:361) > at org.apache.tomcat.util.net.AbstractEndpoint.bindWithCleanup(AbstractEndpoint.java:1326) > at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:1339) > at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:654) > at org.apache.coyote.http11.AbstractHttp11Protocol.init(AbstractHttp11Protocol.java:75) > at org.apache.catalina.connector.Connector.initInternal(Connector.java:1009) > at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:127) > at org.apache.catalina.core.StandardService.initInternal(StandardService.java:554) > at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:127) > at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:1039) > at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:127) > at org.apache.catalina.startup.Catalina.load(Catalina.java:724) > at org.apache.catalina.startup.Catalina.load(Catalina.java:746) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) > at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:498) > at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:307) > at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:477) > 27-Oct-2023 13:11:18.041 INFORMATION [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["https-openssl-apr-30002"] > 27-Oct-2023 13:11:18.042 SCHWERWIEGEND [main] org.apache.catalina.util.LifecycleBase.handleSubClassException Failed to initialize component [Connector["https-openssl-apr-30002"]] > java.lang.UnsatisfiedLinkError: org.apache.tomcat.jni.Address.info(Ljava/lang/String;IIIJ)J > at org.apache.tomcat.jni.Address.info(Native Method) > at org.apache.tomcat.util.net.AprEndpoint.bind(AprEndpoint.java:361) > at org.apache.tomcat.util.net.AbstractEndpoint.bindWithCleanup(AbstractEndpoint.java:1326) > at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:1339) > at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:654) > at org.apache.coyote.http11.AbstractHttp11Protocol.init(AbstractHttp11Protocol.java:75) > at org.apache.catalina.connector.Connector.initInternal(Connector.java:1009) > at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:127) > at org.apache.catalina.core.StandardService.initInternal(StandardService.java:554) > at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:127) > at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:1039) > at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:127) > at org.apache.catalina.startup.Catalina.load(Catalina.java:724) > at org.apache.catalina.startup.Catalina.load(Catalina.java:746) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) > at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:498) > at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:307) > at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:477) So if we assume that both 1.x and 2.x are functionally identical, but for APR the line in Library should eiher read: > private static final String [] NAMES = {"tcnative-1", "libtcnative-1"}; or > private static final String [] NAMES = {"tcnative-1", "libtcnative-1", "tcnative-2", "libtcnative-2"}; or maybe something else?
For 9.0.x and 8.5.x I think it makes sense to use 1.x in preference to 2.x since 1.x supports the APR/Native connector. 10.1.x onwards are fine preferring 2.x. Fixed in: - 9.0.x for 9.0.83 onwards - 8.5.x for 8.5.96 onwards