我在 Windows 上的 Eclipse 中使用 Tomcat 7。启动 Tomcat 时,我收到以下信息消息:
在 java.library.path 上找不到基于 APR 的 Apache Tomcat Native 库,它允许在生产环境中获得最佳性能
这是什么意思,我该如何提供 APR 库?
它的意思正是它所说的:“在 java.library.path 上找不到基于 APR 的 Apache Tomcat Native 库,它允许在生产环境中获得最佳性能”
引用的库捆绑到通过 JNI 加载的特定于操作系统的 dll (tcnative-1.dll) 中。它允许 tomcat 使用 Java Runtime 中未提供的 OS 功能(例如 sendfile、epoll、OpenSSL、系统状态等)。没有它,Tomcat 将运行得很好,但对于某些用例,使用本机库会更快。
如果你真的想要它,下载tcnative-1.dll
(或者libtcnative.so
对于Linux)并将它放在bin文件夹中,并在eclipse中的tomcat服务器的启动配置中添加一个系统属性。
-Djava.library.path=c:\dev\tomcat\bin
除非您正在运行生产服务器,否则不要担心此消息。这是一个用于提高性能的库(在生产系统上)。来自Tomcat 的基于 Apache Portable Runtime (APR) 的本机库:
Tomcat 可以使用 Apache Portable Runtime 提供卓越的可扩展性、性能以及与本机服务器技术的更好集成。Apache Portable Runtime 是一个高度可移植的库,它是 Apache HTTP Server 2.x 的核心。APR 有很多用途,包括访问高级 IO 功能(例如 sendfile、epoll 和 OpenSSL)、操作系统级功能(随机数生成、系统状态等)和本地进程处理(共享内存、NT 管道和 Unix 套接字)。
在 RHEL Linux 上只需发出:
yum install tomcat-native.x86_64
/注意:根据您的架构,64 位或 32 位包可能有不同的扩展名/
就这些。之后,您将在日志文件中找到下一条信息性消息:
INFO: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
所有操作将明显比以前更快。
在 Ubuntu 服务器上安装本机库:
sudo apt-get install libtcnative-1
如果这不起作用,则需要安装 tomcat-native
安装 Oracle java7:
安装tomcat apr:
安装 tomcat tomcat-native:
我刚刚经历了这个并使用以下内容对其进行了配置:
Ubuntu 16.04
雄猫 8.5.9
Apache2.4.25
4 月 1.5.2 日
Tomcat 原生 1.2.10
爪哇 8
这些是我根据这里的旧帖子使用的步骤:
sudo apt-get update
sudo apt-get install libtcnative-1
sudo apt-get install make
sudo apt-get install gcc
sudo apt-get install openssl
sudo apt-get install libssl-dev
cd /opt/tomcat/bin
sudo wget http://apache.mirror.anlx.net//apr/apr-1.5.2.tar.gz
sudo tar -xzvf apr-1.5.2.tar.gz
cd apr-1.5.2
sudo ./configure
sudo make
sudo make install
cd /usr/local/apr/lib/
ls
libapr-1.la
cd /opt/tomcat/bin
sudo wget https://archive.apache.org/dist/tomcat/tomcat-connectors/native/1.2.10/source/tomcat-native-1.2.10-src.tar.gz
sudo tar -xzvf tomcat-native-1.2.10-src.tar.gz
cd tomcat-native-1.2.10-src/native
sudo pico ~/.bashrc
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
source ~/.bashrc
sudo ./configure --with-apr=/usr/local/apr --with-java-home=$JAVA_HOME
sudo make
sudo make install
sudo pico /opt/tomcat/bin/setenv.sh
export LD_LIBRARY_PATH='$LD_LIBRARY_PATH:/usr/local/apr/lib'
sudo service tomcat restart
在 debian 8 上,我通过安装来修复它libapr1-dev
:
apt-get install libtcnative-1 libapr1-dev
在 Mac OS X 上:
$ brew install tomcat-native
==> tomcat-native
In order for tomcat's APR lifecycle listener to find this library, you'll
need to add it to java.library.path. This can be done by adding this line
to $CATALINA_HOME/bin/setenv.sh
CATALINA_OPTS="$CATALINA_OPTS -Djava.library.path=/usr/local/opt/tomcat-native/lib"
If $CATALINA_HOME/bin/setenv.sh doesn't exist, create it and make it executable.
然后将其添加到 eclipse 的 tomcat 参数中(双击Server > Open Launch Configuration > Arguments tab > VM arguments)
-Djava.library.path=/usr/local/opt/tomcat-native/lib
也有这个问题。如果您确实有库,但仍然出现此错误,则可能是配置错误。您server.xml
可能缺少以下行:
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
(或者,它可以被注释掉)。这<Listener>
与其他听众一样是顶级的孩子<Server>
。
如果没有该<Listener>
行,则不会尝试加载 APR 库,因此LD_LIBRARY_PATH
会-Djava.library.path=
忽略设置。
我从 Java 8 升级到 11时遇到了这个问题。添加此依赖项后,我的应用程序启动没有问题:
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.25.0-GA</version>
</dependency>
当 tomсat 找不到课程时,我遇到了同样的问题。尝试查看其他日志文件。有时 No class def found 错误出现在不同的日志文件中:
如果您没有 Tomcat Native 库,请使用以下命令安装它:
sudo apt-get install libtcnative-1
如果它仍然存在旧版本,请使用以下命令升级:
sudo apt-get 升级 libtcnative-1
对于未来的读者:我自己在尝试在Spring STS中运行Spring Boot应用程序 时遇到了这个问题。这个问题最初并没有重新出现。我能够在很长一段时间内毫无问题地处理我的项目,直到有一天我开始遇到这个特殊错误。
据我所知,我没有对我的项目进行任何配置更改,也没有更改正在使用的 Java/Tomcat 版本。
关于安装tomcat 本机库的讨论/建议对我来说没有任何意义,因为该项目之前已经运行良好。
对我有用的解决方案:
所以最后我想尝试删除并重新导入我的项目。
我从 Spring STS 中删除了我的项目,重新启动了 Spring STS,然后重新导入了该项目。它就像一种魅力,从那以后就再也没有遇到过这个问题。
在重新启动 IDE 并重新导入项目之前,您还可以尝试删除项目中任何 IDE 生成的文件/文件夹(如果有的话)。
我仍然碰巧不时从事这个项目,到目前为止还没有遇到过这个问题。我目前的开发 IDE 是 IntelliJ。
我不确定该错误是否是特定于 IDE 的。