项目场景:
在这个项目中,我们正在使用SpringBoot和Tomcat来开发一个Web应用。我们的应用需要频繁地与客户端进行数据交换,因此我们选择了使用Tomcat的APR(Apache Portable Runtime)来提高性能。然而,当我们尝试运行我们的应用时,我们遇到了一个问题:我们的应用无法找到Tomcat需要的本地库。
问题描述
项目报错完整信息如下
org.apache.tomcat.jni.LibraryNotFoundError: Can't load library: E:\projectSpace\questionnaire\bin\tcnative-1.dll, Can't load library: E:\projectSpace\questionnaire\bin\libtcnative-1.dll, no tcnative-1 in java.library.path: [E:\jdks\jdk-11.0.21_windows-x64_bin\jdk-11.0.21\bin, C:\Windows\Sun\Java\bin, C:\Windows\system32, C:\Windows, C:\Program Files (x86)\VMware\VMware Workstation\bin\, C:\Program Files (x86)\Common Files\Oracle\Java\javapath, C:\Windows\system32, C:\Windows, C:\Windows\System32\Wbem, C:\Windows\System32\WindowsPowerShell\v1.0\, C:\Windows\System32\OpenSSH\, C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common, C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR, C:\Program Files\Java\jdk1.8.0_221\bin, D:\nvm, D:\nodejs, C:\Program Files\Git\cmd, D:\Redis-x64-3.2.100, D:\javadevelop\ffmpeg, C:\Program Files (x86)\NetSarang\Xftp 7\, C:\Windows\System32\cmd.exe, D:\develop\go1.20.6.windows-amd64\go\bin, D:\javadevelop\nodejs\, D:\develop\WeChat\微信web开发者工具\dll, D:\develop\chromedriver_win32, C:\Program Files (x86)\dotnet\, D:\BaiduNetdiskDownload\jiongjionganquan\netcat-1.11, E:\software\微信web开发者工具\dll, E:\Apache\apache-maven-3.9.6\bin, E:\datebases\mariadb-10.6.17-winx64\bin, E:\developtools\Microsoft VS Code\bin, C:\Program Files\Cloudflare\Cloudflare WARP\, C:\Program Files\MySQL\MySQL Shell 8.1\bin\, C:\Users\Lenovo\AppData\Local\Programs\Python\Python311\Scripts\, C:\Users\Lenovo\AppData\Local\Programs\Python\Python311\, D:\dev\python\python3.10.4\Scripts\, D:\dev\python\python3.10.4\, C:\Users\Lenovo\AppData\Local\Microsoft\WindowsApps, D:\nvm, D:\nodejs, C:\Program Files\JetBrains\PyCharm 2023.1\bin, ., C:\Program Files\JetBrains\GoLand 2023.1.1\bin, ., C:\ProgramData\Lenovo\GitHubDesktop\bin, C:\Users\Lenovo\AppData\Local\GitHubDesktop\bin, C:\Users\Lenovo\AppData\Roaming\npm, D:\develop\, E:\developtools\Microsoft VS Code Insiders\bin, .], no libtcnative-1 in java.library.path: [E:\jdks\jdk-11.0.21_windows-x64_bin\jdk-11.0.21\bin, C:\Windows\Sun\Java\bin, C:\Windows\system32, C:\Windows, C:\Program Files (x86)\VMware\VMware Workstation\bin\, C:\Program Files (x86)\Common Files\Oracle\Java\javapath, C:\Windows\system32, C:\Windows, C:\Windows\System32\Wbem, C:\Windows\System32\WindowsPowerShell\v1.0\, C:\Windows\System32\OpenSSH\, C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common, C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR, C:\Program Files\Java\jdk1.8.0_221\bin, D:\nvm, D:\nodejs, C:\Program Files\Git\cmd, D:\Redis-x64-3.2.100, D:\javadevelop\ffmpeg, C:\Program Files (x86)\NetSarang\Xftp 7\, C:\Windows\System32\cmd.exe, D:\develop\go1.20.6.windows-amd64\go\bin, D:\javadevelop\nodejs\, D:\develop\WeChat\微信web开发者工具\dll, D:\develop\chromedriver_win32, C:\Program Files (x86)\dotnet\, D:\BaiduNetdiskDownload\jiongjionganquan\netcat-1.11, E:\software\微信web开发者工具\dll, E:\Apache\apache-maven-3.9.6\bin, E:\datebases\mariadb-10.6.17-winx64\bin, E:\developtools\Microsoft VS Code\bin, C:\Program Files\Cloudflare\Cloudflare WARP\, C:\Program Files\MySQL\MySQL Shell 8.1\bin\, C:\Users\Lenovo\AppData\Local\Programs\Python\Python311\Scripts\, C:\Users\Lenovo\AppData\Local\Programs\Python\Python311\, D:\dev\python\python3.10.4\Scripts\, D:\dev\python\python3.10.4\, C:\Users\Lenovo\AppData\Local\Microsoft\WindowsApps, D:\nvm, D:\nodejs, C:\Program Files\JetBrains\PyCharm 2023.1\bin, ., C:\Program Files\JetBrains\GoLand 2023.1.1\bin, ., C:\ProgramData\Lenovo\GitHubDesktop\bin, C:\Users\Lenovo\AppData\Local\GitHubDesktop\bin, C:\Users\Lenovo\AppData\Roaming\npm, D:\develop\, E:\developtools\Microsoft VS Code Insiders\bin, .]
at org.apache.tomcat.jni.Library.<init>(Library.java:102) ~[tomcat-embed-core-9.0.46.jar:9.0.46]
at org.apache.tomcat.jni.Library.initialize(Library.java:206) ~[tomcat-embed-core-9.0.46.jar:9.0.46]
at org.apache.catalina.core.AprLifecycleListener.init(AprLifecycleListener.java:193) ~[tomcat-embed-core-9.0.46.jar:9.0.46]
at org.apache.catalina.core.AprLifecycleListener.isAprAvailable(AprLifecycleListener.java:102) ~[tomcat-embed-core-9.0.46.jar:9.0.46]
原因分析:
这是因为Tomcat中的connector为了提高性能,采用了加载与操作系统绑定(非跨平台)的本地库的方式,比如Windows系统中就是.dll动态链接库。上述异常中找不到的两个.dll库文件,默认会去Tomcat的bin目录下去找,但是由于SpringBoot的Tomcat是嵌入式的,没有xx.dll
解决方案:
到官方地址下载,并放到C:\Windows\System32\目录下,springboot项目就可以正常运行了