“未找到基于 APR 的 Apache Tomcat 本机库”是啥意思?

Posted

技术标签:

【中文标题】“未找到基于 APR 的 Apache Tomcat 本机库”是啥意思?【英文标题】:What does "The APR based Apache Tomcat Native library was not found" mean?“未找到基于 APR 的 Apache Tomcat 本机库”是什么意思? 【发布时间】:2012-02-01 17:28:49 【问题描述】:

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

在 java.library.path 中找不到基于 APR 的 Apache Tomcat Native 库,该库可在生产环境中实现最佳性能

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

【问题讨论】:

【参考方案1】:

这正是它所说的:“在 java.library.path 上找不到基于 APR 的 Apache Tomcat Native 库,它允许在生产环境中获得最佳性能”

引用的库被捆绑到通过 JNI 加载的操作系统特定的 dll (tcnative-1.dll) 中。它允许 tomcat 使用 Java Runtime 中未提供的 OS 功能(例如 sendfile、epoll、OpenSSL、系统状态等)。没有它,Tomcat 也可以正常运行,但对于某些用例,使用本机库会更快。

如果你真的想要,下载tcnative-1.dll (or libtcnative.so for Linux)放到bin文件夹,在eclipse中tomcat服务器的启动配置中添加系统属性。

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

【讨论】:

+1 我只在 Eclipse 下收到此错误(由 OP 发布),尽管它在我独立运行时已修复(当然,在添加本机库之后)。感谢有关设置的提示系统属性! 是否有在不添加 .dll 文件的情况下禁用该功能? @greyfairer @greyfairer Mac OS 下的 IntelliJ IDEA 怎么样? macosx的jboss-native包里有libtcnative:jbossweb.jboss.org/downloads/jboss-native-2-0-10,我猜是一样的东西,移植到MacOS? 我们在 Tomcat 8.0.47 上的 MacOSX 上安装 tomcat-native 时遇到问题。我们通过指定选项--prefix、--with-ssl 和-with-apr 成功构建了本机库。问题是二进制文件被复制到tomcat的“lib”文件夹,而不是“bin”文件夹。只需将它们移动到“bin”,它可能会起作用【参考方案2】:

除非您正在运行生产服务器,否则不要担心此消息。这是一个用于提高性能的库(在生产系统上)。来自Apache Portable Runtime (APR) based Native library for Tomcat:

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

【讨论】:

【参考方案3】:

在 RHEL Linux 上只需发出:

yum install tomcat-native.x86_64

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

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

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

所有操作都将明显比以前更快。

【讨论】:

至少对于 CentOS 7,在默认存储库中找不到它。但是,它在 EPEL 中,所以在执行 yum install epel-release 之后,它会安装。 对于 CentOS 7,yum install tomcat-native 为我解决了这个问题【参考方案4】:

在 Ubuntu 服务器上安装本机库:

sudo apt-get install libtcnative-1

如果这不起作用,则需要安装 tomcat-native

    安装Oracle java7:

    sudo add-apt-repository ppa:webupd8team/java sudo apt-get 更新 sudo apt-get install oracle-java7-installer sudo apt-get install oracle-java7-set-default

    安装tomcat apr:

    wget http://apache.mirror.anlx.net//apr/apr-1.5.0.tar.gz tar zxvf apr-1.5.0.tar.gz rm apr-1.5.0.tar.gz cd apr-1.5.0 sudo ./configure 须藤制作 sudo make install 导出 LD_LIBRARY_PATH='$LD_LIBRARY_PATH:/usr/local/apr/lib'

    安装tomcat tomcat-native:

    wget http://mirrors.ukfast.co.uk/sites/ftp.apache.org//tomcat/tomcat-connectors/native/1.1.29/source/tomcat-native-1.1.29-src.tar.gz tar zxvf tomcat-native-1.1.29-src.tar.gz rm tomcat-native-1.1.29-src.tar.gz cd tomcat-native-1.1.29-src/jni/native JAVA_HOME=/usr/lib/jvm/java-7-oracle sudo ./configure --with-apr=/usr/local/apr --with-java-home=$JAVA_HOME 须藤制作 sudo make install

【讨论】:

我尝试了所有这些,但没有任何效果。我不断收到“配置的协议 [org.apache.coyote.http11.Http11AprProtocol] 需要不可用的 APR/native 库”。甚至做了“ant jar”命令并将tomcat-native-1.1.33-dev.jar复制到我的tomcat/lib目录中。 您需要将生成的 .so 文件复制到该目录,或者更具体地说,复制到 java.library.path。【参考方案5】:

我刚刚完成并配置了以下内容:

Ubuntu 16.04

Tomcat 8.5.9

Apache2.4.25

1.5.2 年 4 月

Tomcat 原生 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

【讨论】:

我遇到这个错误`重定位 R_X86_64_32 针对.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 【参考方案6】:

在 debian 8 上,我通过安装 libapr1-dev 来修复它:

apt-get install libtcnative-1 libapr1-dev

【讨论】:

【参考方案7】:

在 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

【讨论】:

【参考方案8】:

也有这个问题。如果您确实拥有这些库,但仍然出现此错误,则可能是配置错误。您的 server.xml 可能缺少以下行:

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

(或者,它可以被注释掉)。这个&lt;Listener&gt;,和其他听众一样,是***&lt;Server&gt;的子级。

如果没有 &lt;Listener&gt; 行,则不会尝试加载 APR 库,因此会忽略 LD_LIBRARY_PATH-Djava.library.path= 设置。

【讨论】:

您,先生,是最棒的。在将前额应用到键盘几个小时后,我发现我一直都正确安装了 APR/Native。这是一个简单的 server.xml 问题!【参考方案9】:

我遇到了这个问题从 Java 8 升级到 11。添加此依赖项后,我的应用程序启动没有问题:

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

【讨论】:

【参考方案10】:

当 tomсat 找不到课程时,我遇到了同样的问题。尝试查看其他日志文件。有时在不同的日志文件中会出现 No class def found 错误:

tomcat8-stdout tomcat8-stderr 本地主机

【讨论】:

【参考方案11】:

如果您没有 Tomcat Native 库,请安装:

sudo apt-get install libtcnative-1

如果它仍然存在旧版本,请升级:

sudo apt-get upgrade libtcnative-1

【讨论】:

【参考方案12】:

我的问题是将一些库从 tomcat 添加到 eclipse 类路径中,我只是要去 eclipse 单击右键进行项目并转到 debug configuration -&gt; classpath -&gt; Add External JARs 添加来自 apache-tomcat-7.0.35\bin 的所有 jars 文件这是我的问题,它对我有用。

【讨论】:

【参考方案13】:

对于未来的读者: 当我尝试在 Spring STS 中运行 Spring Boot 应用程序时,我自己也遇到过这个问题。这个问题最初并没有重新出现。我能够在很长一段时间内毫无问题地处理我的项目,直到有一天我开始遇到这个特定错误。

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

关于安装 tomcat 原生库的讨论/建议对我来说没有任何意义,因为该项目之前已经运行良好。

对我有用的解决方案:

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

我从 Spring STS 删除我的项目,重新启动 Spring STS,然后重新导入该项目。它就像一个魅力,从那以后就再也没有遇到过这个问题。

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

我仍然碰巧不时从事这个项目,到目前为止还没有遇到过这个问题。我目前的开发 IDE 是 IntelliJ。

我不确定错误是否是特定于 IDE 的。

【讨论】:

以上是关于“未找到基于 APR 的 Apache Tomcat 本机库”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章