“未找到基于APR的Apache Tomcat Native库”是什么意思?

126
我在Windows上使用Eclipse中的Tomcat 7。启动Tomcat时,我会收到以下信息:

  

基于APR的Apache Tomcat本地库允许在生产环境中实现最佳性能,但未在java.library.path上找到

这是什么意思,我该如何提供APR库?

13个回答

134

这句话的意思就是:“基于APR(Apache Portable Runtime)的 Apache Tomcat Native 库,可以在生产环境中实现最佳性能,但是该库在java.library.path路径下未找到。”

所提到的库被捆绑在特定于操作系统的dll文件(tcnative-1.dll),通过JNI进行加载。它允许Tomcat使用Java运行时无法提供的操作系统功能,例如sendfile、epoll、OpenSSL、系统状态等。即使没有这个库,Tomcat也可以正常运行,但对某些用例来说,使用本地库会更快。

如果您真的需要它,请下载tcnative-1.dll(或Linux下的libtcnative.so并将其放入bin文件夹中,并在eclipse中Tomcat服务器的启动配置的系统属性中添加。

 -Djava.library.path=c:\dev\tomcat\bin

1
+1 我在 Eclipse 下遇到了这个错误(由 OP 发布),但当我单独运行它时,它已经被修复了(当然,在添加本地库后)。感谢您关于设置系统属性的提示! - asgs
11
有没有办法在不添加.dll文件的情况下禁用这个功能?@greyfairer - Koray Tugay
3
在Mac OS下使用IntelliJ IDEA怎么样? - aircraft
1
在MacOSX上的jboss-native软件包中有libtcnative:http://jbossweb.jboss.org/downloads/jboss-native-2-0-10,我猜这是相同的东西,移植到了MacOS? - GeertPt
1
我们在Tomcat 8.0.47的MacOSX上安装tomcat-native时遇到了问题。通过指定--prefix,--with-ssl和-with-apr选项,我们成功地构建了本机库。问题在于二进制文件被复制到了Tomcat的“lib”文件夹而不是“bin”文件夹中。将它们移动到“bin”文件夹中可能会解决问题。 - maddob
我在CentOS上运行SpringBoot时遇到了同样的问题,现在已经解决了。安装了tomcat-native库。https://centos.pkgs.org/7/epel-x86_64/tomcat-native-1.2.23-1.el7.x86_64.rpm.html - Rajesh Balan

36

如果您不是在运行生产服务器,那就不用担心这条信息。这是一个用于提高性能的库(在生产系统上使用)。来自Apache可移植运行时(APR)Tomcat本地库

Tomcat可以使用Apache可移植运行库提供更高的可伸缩性、性能和更好的本地服务器技术集成。 Apache可移植运行时是Apache HTTP Server 2.x的核心,是一个高度可移植的库。 APR具有许多用途,包括访问高级IO功能(例如sendfile、epoll和OpenSSL)、操作系统级功能(随机数生成、系统状态等)和本地进程处理(共享内存、NT管道和Unix套接字)。


34
在RHEL Linux上,只需执行以下命令:

On RHEL Linux just issue:


yum install tomcat-native.x86_64

/注意:根据您的架构,64位或32位软件包的扩展名可能不同。

就这样。之后,您将在日志文件中找到下一个信息消息:

INFO: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].

所有操作都比以前更快。


3
至少针对 CentOS 7,该软件包未在默认软件源中找到。然而,在 EPEL 软件源中可以找到,所以安装前需要执行 "yum install epel-release" 来安装 EPEL 软件源。安装完成后即可安装该软件包。 - Mike Gleason
8
针对 CentOS 7,执行命令 yum install tomcat-native解决了我的问题。 - Isaac Betesh

23

使用以下命令在Ubuntu服务器上安装本地库:

sudo apt-get install libtcnative-1

如果那个不起作用,需要安装tomcat-native:

  1. 安装Oracle java7:

    • sudo add-apt-repository ppa:webupd8team/java
    • sudo apt-get update
    • sudo apt-get install oracle-java7-installer
    • sudo apt-get install oracle-java7-set-default
  2. 安装tomcat apr:

  3. 安装tomcat tomcat-native:


1
我尝试了所有这些方法,但都没有起作用。我一直收到“配置的协议[org.apache.coyote.http11.Http11AprProtocol]需要APR / native库,但该库不可用”的错误提示。 我甚至执行了“ant jar”命令,并将tomcat-native-1.1.33-dev.jar复制到我的tomcat / lib目录中。 - coladict
你需要将生成的 .so 文件复制到该目录,更具体地说,是复制到 java.library.path。 - demonkoryu

14

我刚刚浏览了一下,并使用以下内容进行了配置:

Ubuntu 16.04

Tomcat 8.5.9

Apache2.4.25

APR 1.5.2

Tomcat-native 1.2.10

Java 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

安装并编译Apache APR

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

下载并安装Tomcat Native源代码包

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

验证JAVA_HOME

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

请编辑/opt/tomcat/bin/setenv.sh文件,添加以下一行:

sudo pico /opt/tomcat/bin/setenv.sh
export LD_LIBRARY_PATH='$LD_LIBRARY_PATH:/usr/local/apr/lib'

重启Tomcat

sudo service tomcat restart


我遇到了这个错误 relocation R_X86_64_32 against.rodata' can not be used when making a shared object; recompile with -fPIC /usr/local/ssl/lib/libssl.a: error adding symbols: Bad value collect2: error: ld returned 1 exit status make[1]: *** [libtcnative-1.la] Error 1` - Agnibha

9
在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 > 打开启动配置 > Arguments选项卡 > VM参数)。

-Djava.library.path=/usr/local/opt/tomcat-native/lib

7
在Debian 8上,我通过安装libapr1-dev来修复它:
apt-get install libtcnative-1 libapr1-dev

6岁的答案在2022年仍然完美运行。谢谢!我在Ubuntu 20.04 LTS上尝试过。当在IDE中使用jvm 16+启动时出现错误。 - Semo

5

我也遇到了这个问题。如果你确实已经安装了相关的库,但是还是出现了这个错误,那么可能是配置错误。你的 server.xml 文件可能缺少以下行:

 <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />

(或者,它可以被注释掉)。这个<Listener>和其他监听器一样,是顶层<Server>的子元素。

如果没有<Listener>行,则不会尝试加载APR库,因此LD_LIBRARY_PATH-Djava.library.path=设置将被忽略。


您,先生,是最棒的。在数小时不断敲击键盘之后,我发现我一直正确安装 APR/Native。原来只是一个简单的 server.xml 问题! - immortal squish

2
我遇到了这个问题,从Java 8升级到Java 11。添加这个依赖项后,我的应用程序可以顺利启动:

最初的回答

<dependency>
    <groupId>org.javassist</groupId>
    <artifactId>javassist</artifactId>
    <version>3.25.0-GA</version>
</dependency>

1

针对未来的读者: 当我尝试在Spring STS中运行一个Spring Boot应用程序时,我自己也遇到了这个问题。最初这个问题没有再次出现。我能够在我的项目上工作相当长的一段时间,直到有一天我开始遇到这个特定的错误。

据我所记,我没有对我的项目进行任何配置更改,也没有更改使用的Java/Tomcat版本。

关于安装tomcat本地库的讨论/建议对我来说都没有意义,因为该项目之前已经正常工作。

解决方案:

最后,我想尝试删除并重新导入我的项目。

我从Spring STS中删除了我的项目,重启了Spring STS,然后重新导入了项目。它像魔法一样工作,并且从那以后再也没有遇到过这个问题。

您也可以尝试在重新启动IDE和重新导入项目之前删除项目中生成的任何IDE文件/文件夹(如果有)。

我时不时地仍在这个项目上工作,目前还没有遇到过这个问题。我的当前开发IDE是IntelliJ。

我不确定错误是否与IDE有关。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接