Tomcat(作为服务)是否不为Java Web应用程序加载本机库?

时间:2016-06-30 18:56:51

标签: java eclipse web-services tomcat catalina

我正在使用Tomcat7和Ubuntu。我有一个Java Web应用程序,它使用一些本机库。当我在Eclipse中运行Web应用程序时,它在调试期间通过Eclipse内部Tomcat服务器工作。但是,当我将applcation部署到托管的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而且,无论何时 到达加载本机库时,我收到有关 InvocationTargetException 的错误。
  5. 我也愿意选择将本机库添加为应用程序的.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不是,即使两者都在同一个位置。

2 个答案:

答案 0 :(得分:1)

可以从代码本身完成。这应该让你对加载图书馆充满信心。

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

它需要库的绝对路径,例如

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

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

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

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

但是如你所提到的那样设置可能很麻烦,这个改变必须在tomcat的所有实例中完成。

答案 1 :(得分:0)

经过几天的头痛,我有一个解决方案。

  1. 编辑文件

    sudo vi /etc/ld.so.conf

  2. 在文件

    中附加本机库的位置

    包括/etc/ld.so.conf.d/*.conf /家/我/ my_shared_lib

  3. 加载配置

    sudo ldconfig

  4. 查看新的更改

    ldconfig -p | grep my_shared_lib

  5. 这告诉动态链接器在哪里查找本机库。

    我的问题解决了。

    还有其他替代解决方案here,可能有也可能没有一些缺点。

    或者(也发现),您可以在/ usr / share / tomcat7 / bin /下的setenv.sh文件中导出LD_LIBRARY_PATH,而不是上述步骤。设置成为Tomcat的一部分;清洁方法。