gpt4 book ai didi

java - Tomcat(即服务)是否不为 Java Web 应用程序加载 native 库?

转载 作者:行者123 更新时间:2023-11-28 22:51:39 25 4
gpt4 key购买 nike

我正在使用 Tomcat7 和 Ubuntu。我有一个使用一些 native 库的 Java Web 应用程序。当我在 Eclipse 中运行 Web 应用程序时,它在调试期间通过 Eclipse 内部 Tomcat 服务器工作。但是,当我将应用程序部署到托管的 Tomcat 服务时,应用程序在加载这些库时失败。

  1. 我将本地库放在/home/me/my_shared_libs 中,并提供
    用户“Tomcat7”的文件夹和文件所有权 -- sudo chown
  2. 我将本地库的所有权限授予“Tomcat7”用户-- sudo chmod
  3. sudo vi/usr/share/tomcat7/bin/setenv.sh 中输入以下内容在文件 export CATALINA_OPTS="-Djava.library.path=/home/me/my_shared_libs"
  4. 然后我重新启动 Tomcat -- sudo service tomcat7 restart 而且,每当已达到加载 native 库的引用,我收到有关 InvocationTargetException 的错误。

我也愿意选择将 native 库添加为应用程序的 .WAR 文件的一部分。 (虽然我不确定如何在 Eclipse 中执行此操作)。

/var/log/tomcat7/catalina.out的日志-->

Jun 30, 2016 8:11:50 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 3643 ms
Load my_native_lib_called. libmachoman.so: cannot open shared object file: No such file or directory

编辑:我发现了一件非常有趣的事情。 Tomcat 确实选择了我在上面设置的库位置。发生的情况是我在该位置有两种类型的库 (.so) 文件。第一个库 (libcore.so) 调用/加载第二个库 (libmachoman.so)。找到并加载了 libcore.so,但没有找到 libmachoman.so,即使它们位于同一位置。

最佳答案

它可以从代码本身完成。这应该会让您对库的加载充满信心。

为此,您可以使用 System.load()

以库的绝对路径为例

System.load("/PATH/TO/.so");

在应用程序启动时,在调用库函数之前运行这段代码一次。

您必须将您的图书馆放在所有服务器上的自定义位置。

System.loadLibrary()也用于相同的目的,但不同之处在于它将按名称加载库并查看 Java 环境变量 java.library.path 指定的位置。

但是正如您所提到的那样,设置起来可能会很痛苦,必须在 tomcat 的所有实例中完成此更改。

关于java - Tomcat(即服务)是否不为 Java Web 应用程序加载 native 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38131207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com