我正在使用Tomcat7和Ubuntu。我有一个Java Web应用程序,它使用一些本机库。当我在Eclipse中运行Web应用程序时,它在调试期间通过Eclipse内部Tomcat服务器工作。但是,当我将applcation部署到托管的Tomcat服务时,应用程序在到达加载这些库时会失败。
sudo chown
sudo chmod
sudo vi /usr/share/tomcat7/bin/setenv.sh
中,并执行以下操作
在文件export CATALINA_OPTS="-Djava.library.path=/home/me/my_shared_libs"
sudo service tomcat7 restart
而且,无论何时
到达加载本机库时,我收到有关 InvocationTargetException
的错误。我也愿意选择将本机库添加为应用程序的.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不是,即使两者都在同一个位置。
答案 0 :(得分:1)
可以从代码本身完成。这应该让你对加载图书馆充满信心。
为此,您可以使用System.load()
它需要库的绝对路径,例如
System.load("/PATH/TO/.so");
在应用程序启动之前运行这段代码一次,然后再调用库函数。
您必须将您的图书馆放在所有服务器上的自定义位置。
System.loadLibrary()也用于相同的目的,但区别在于它将按名称加载库并查看由Java环境变量java.library.path
指定的位置。
但是如你所提到的那样设置可能很麻烦,这个改变必须在tomcat的所有实例中完成。
答案 1 :(得分:0)
经过几天的头痛,我有一个解决方案。
编辑文件
sudo vi /etc/ld.so.conf
在文件
中附加本机库的位置包括/etc/ld.so.conf.d/*.conf /家/我/ my_shared_lib
加载配置
sudo ldconfig
查看新的更改
ldconfig -p | grep my_shared_lib
这告诉动态链接器在哪里查找本机库。
我的问题解决了。
还有其他替代解决方案here,可能有也可能没有一些缺点。
或者(也发现),您可以在/ usr / share / tomcat7 / bin /下的setenv.sh文件中导出LD_LIBRARY_PATH,而不是上述步骤。设置成为Tomcat的一部分;清洁方法。