我有一个需要LD_LIBRARY_PATH
设置的 Tomcat webapp。
我正在使用 RHEL6 和 Tomcat6(来自 yum 包管理器),webapp 名为adore-djatoka
.
我通过使用提供的导出许多环境变量的脚本启动 tomcat,但它似乎LD_LIBRARY_PATH
未设置,我认为这是一项安全功能,因为 init 脚本由用户“ root
”运行,但 tomcat 运行为“ tomcat
”。
当我重新启动 tomcat 时,我在日志文件中看到以下行“ djatoka.log
”
2013-01-04/10:25:04.118/EST [main] DEBUG envParams: LD_LIBRARY_PATH=null | null/kdu_compress
我读到的内容告诉我该应用程序期望设置 LD_LIBRARY_PATH,但发现它为空,因此它将kdu_compress
在目录中查找null/
。
我乱扔了启动脚本,echo
所以我可以看到它LD_LIBRARY_PATH
正在设置和导出,所以我假设它必须被取消设置。
有几个与 webapp 捆绑在一起的脚本来测试它是否正确安装并且它们从命令行运行良好,但它们非常短,它们只是导出环境变量(包括LD_LIBRARY_PATH
)并调用 java.lang 。
我试过添加
LD_LIBRARY_PATH="/opt/adore-djatoka-1.1/lib/Linux-x86-64"
export LD_LIBRARY_PATH
至/usr/share/tomcat6/bin/setenv.sh
我试过添加
LD_LIBRARY_PATH="/opt/adore-djatoka-1.1/lib/Linux-x86-64"
到`/etc/tomcat6/tomcat6.conf
LD_LIBRARY_PATH
已经在继续调用的启动脚本中导出/etc/init.d/tomcat6 [start/stop/restart]
我对这里的一些主题还很陌生,所以一些关于如何更好地了解下一步要看的地方,或者哪些信息对发布有用的指导也将不胜感激。我已经读过“为什么 LD_LIBRARY_PATH 不好”
所以我的问题是如何启动 tomcat,使其不设置LD_LIBRARY_PATH
为 null?或者在将其设置为空后如何将其重新设置为我想要的?或者我怎样才能阻止 webapp 依赖它?
干杯,
您实际需要的是将一个适当的标志放入您的 JAVA_OPTS(这有点违反直觉)。
在 RHEL 机器上,将其放入 /etc/sysconfig/tomcat6 或 /etc/tomcat6/tomcat.conf
您可以使用以下方法验证这是否已在 Java 中设置:
以及在 djatoka 日志中看到以下内容:
或者您可以全局设置它(在 /etc/ld.so.conf.d/adore-djatoka 等文件中)
我最终通过获取 webapp 的源代码、将所需路径硬编码到相关行、编译和重新部署来解决这个问题。
有问题的路径只是作为源中的字符串提取出来,因此不需要将其存储在 LD_LIBRARY_PATH 中。
为了使其更具可移植性,我应该删除硬编码并将其替换为对配置脚本中设置的自定义环境变量的调用。
这意味着,据我所知,“如何在 setuid 程序范围内取消设置 LD_LIBRARY_PATH 环境变量后”的答案是,“你不能,除非程序本身有一个设施执行后传递此信息”。
使用 TOMCAT 7时,只需在 $CATALINA_HOME/conf/tomcat.conf 中设置几行即可解决问题(其中名为 eg Crypto 的库变为 libCrypto.so):
事实上,tomcat.conf 中的每一行 <tag>="<value>" 都变成了“export <tag>=<value>”(例如,对 Tomcat 服务启动脚本进行逆向工程:/etc/init.d/tomcat) .
您还可以在 /etc/sysconfig/tomcat 中为您可能已配置的所有 TOMCAT 服务全局重载该值。
因此,如果 tomcat.conf 中的设置看起来没有效果,请检查 /etc/sysconfig/tomcat 可能超载的内容......