Linux下Springboot解決`APR based Apache Tomcat Native library`提示


最近轉行做java,開發基於Springboot的項目,版本號為2.1.0.RELEASE.
啟動應用,發現以下提示:

The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [/usr/lib/jvm/java-1.8-openjdk/jre/lib/amd64/server:/usr/lib/jvm/java-1.8-openjdk/jre/lib/amd64:/usr/lib/jvm/java-1.8-openjdk/jre/../lib/amd64:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib]

提示告知,使用基於Apache Tomcat Native libraryARP可以提升生產環境性能.
以下是從網上節選的話語:

apr是從操作系統級別解決異步IO問題,大幅度提高服務器的並發處理性能,也是Tomcat生產環境運行的首選方式.
目前Tomcat 8.x默認情況下全部是運行在nio模式下,而apr的本質就是使用jni技術調用操作系統底層的IO接口.

如此具有誘惑力,當然值得花費時間去解決,按照網上教程安裝依賴:

sudo apt-get isntall libapr1-dev libssl-dev libtcnative-1

此處,需要注意網上給出的資源大多數是libapr以及libtcnative,安裝時提示無法找到.
因此,搜索到包名被修改成上述定義.

$ dpkg -L libtcnative-1

# 以下是輸出信息
/.
/usr
/usr/lib
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/libtcnative-1.a
/usr/lib/x86_64-linux-gnu/libtcnative-1.so.0.2.16
/usr/lib/x86_64-linux-gnu/pkgconfig
/usr/lib/x86_64-linux-gnu/pkgconfig/tcnative-1.pc
/usr/share
/usr/share/doc
/usr/share/doc/libtcnative-1
/usr/share/doc/libtcnative-1/README.Debian
/usr/share/doc/libtcnative-1/changelog.Debian.gz
/usr/share/doc/libtcnative-1/changelog.gz
/usr/share/doc/libtcnative-1/copyright
/usr/share/lintian
/usr/share/lintian/overrides
/usr/share/lintian/overrides/libtcnative-1
/usr/lib/x86_64-linux-gnu/libtcnative-1.so
/usr/lib/x86_64-linux-gnu/libtcnative-1.so.0

使用dpkg可以得知,libtcnative-1的靜態庫被安裝至:/usr/lib/x86_64-linux-gnu.
因此,啟動程序:

java -jar -Djava.library.path=/usr/lib/x86_64-linux-gnu cache-0.0.1-SNAPSHOT.jar
Picked up _JAVA_OPTIONS:   -Dawt.useSystemAAFontSettings=gasp

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.1.RELEASE)

org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/9.0.13
2019-01-10 15:33:55.586  INFO 2243 --- [           main] o.a.catalina.core.AprLifecycleListener   : An older version [1.2.16] of the APR based Apache Tomcat Native library is installed, while Tomcat recommends a minimum version of [1.2.18]
2019-01-10 15:33:55.586  INFO 2243 --- [           main] o.a.catalina.core.AprLifecycleListener   : Loaded APR based Apache Tomcat Native library [1.2.16] using APR version [1.6.3].
2019-01-10 15:33:55.586  INFO 2243 --- [           main] o.a.catalina.core.AprLifecycleListener   : APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
2019-01-10 15:33:55.586  INFO 2243 --- [           main] o.a.catalina.core.AprLifecycleListener   : APR/OpenSSL configuration: useAprConnector [false], useOpenSSL [true]
2019-01-10 15:33:55.597  INFO 2243 --- [           main] o.a.catalina.core.AprLifecycleListener   : OpenSSL successfully initialized [OpenSSL 1.1.0h  27 Mar 2018]
2019-01-10 15:33:55.748  INFO 2243 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext

輸出的啟動信息中,可以看到APR based Apache Tomcat Native library被加載了.
但是讓人心塞的是,輸出信息中提示版本過低,不滿足現階段使用的最小版本要求(差了兩個小版本號).

An older version [1.2.16] of the APR based Apache Tomcat Native library is installed, while Tomcat recommends a minimum version of [1.2.18]

根據網上搜索結果可知,無法通過apt-get去安裝高版本的libtcnative,只能手動編譯安裝.
因此,去Tomcat官網下載(http://tomcat.apache.org/native-doc/),可以看到最新的版本號為1.2.19,於是下載源碼包.

解壓后可以看到目錄結構:

.
├── build.properties.default
├── build.xml
├── CHANGELOG.txt
├── CMakeLists.txt
├── docs
├── examples
├── java
├── jnirelease.sh
├── LICENSE
├── native
├── NOTICE
├── README.txt
├── test
├── TODO.txt
└── xdocs

執行以下命令,進行編譯安裝:

sudo apt-get autoremove libtcnative-1 #刪除安裝的庫
cd native
./configure && make -j 4
sudo make install

此處,configure命令無需按照官網指示配置參數,會自行搜索依賴所在路徑.
安裝完之后,可以得知靜態庫被安裝至/usr/local/apr/lib.
重新啟動程序:

java -jar -Djava.library.path=/usr/local/apr/lib cache-0.0.1-SNAPSHOT.jar

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.1.RELEASE)

o.a.catalina.core.AprLifecycleListener   : Loaded APR based Apache Tomcat Native library [1.2.19] using APR version [1.6.3].
2019-01-10 15:48:29.130  INFO 7538 --- [           main] o.a.catalina.core.AprLifecycleListener   : APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
2019-01-10 15:48:29.130  INFO 7538 --- [           main] o.a.catalina.core.AprLifecycleListener   : APR/OpenSSL configuration: useAprConnector [false], useOpenSSL [true]
2019-01-10 15:48:29.136  INFO 7538 --- [           main] o.a.catalina.core.AprLifecycleListener   : OpenSSL successfully initialized [OpenSSL 1.1.0h  27 Mar 2018]
2019-01-10 15:48:29.255  INFO 7538 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext

通過輸出信息,可以得知:程序完美加載APR based Apache Tomcat Native library,性能就等着提升了.
將參數設置到ideaVM options中,調試的時候也舒服了許多.

PS:
如果您覺得我的文章對您有幫助,可以掃碼領取下紅包,謝謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM