RApache部署含rJava/RJDBC的R脚本时加载rJava包失败求助
看起来你遇到的是RApache运行环境与本地Rscript环境不一致导致的Java库加载问题——毕竟Rscript是在你的用户环境下执行,而Apache是用www-data用户运行的,环境变量和权限都可能有差异。结合你给出的错误日志,核心问题是RApache找不到libjvm.so的正确路径,下面给你几个针对性的排查和解决步骤:
第一步:找到
libjvm.so的真实路径
你之前设置的/usr/lib/jvm/default-java/bin/java是Java可执行文件的路径,完全不是库文件的位置!先通过命令找到正确的libjvm.so路径:find /usr/lib/jvm -name libjvm.so通常它的路径会是类似
/usr/lib/jvm/default-java/lib/server/libjvm.so这样的,记下来这个目录(比如/usr/lib/jvm/default-java/lib/server)。第二步:在Apache配置里正确设置
LD_LIBRARY_PATH
修改你的000-default.conf,把之前错误的路径替换成刚才找到的库目录:SetEnv LD_LIBRARY_PATH /usr/lib/jvm/default-java/lib/server保存配置后重启Apache生效:
sudo systemctl restart apache2第三步:确保
www-data用户有权限访问Java库
即使路径对了,如果www-data没有读权限也会报错,执行下面的命令调整权限:# 给libjvm.so添加读权限 sudo chmod +r /usr/lib/jvm/default-java/lib/server/libjvm.so # 给所在目录添加执行权限(让进程能进入目录) sudo chmod +x /usr/lib/jvm/default-java/lib/server如果整个Java安装目录权限都比较严格,也可以把目录权限组调整为
www-data:sudo chown -R root:www-data /usr/lib/jvm/default-java备选方案:在R脚本里显式设置路径
如果Apache的SetEnv还是不生效,你可以在R脚本开头直接指定正确的库路径,避免依赖Apache的环境变量:# 替换成你实际的libjvm.so所在目录 Sys.setenv(LD_LIBRARY_PATH = "/usr/lib/jvm/default-java/lib/server") # 如果rJava安装在非默认库路径,还要添加这个路径 .libPaths(c(.libPaths(), "/path/to/your/rJava/library")) library(rJava)
另外提醒一下:你原来脚本里的Sys.setenv(LD_LIBRARY_PATH = "/usr/lib/jvm/default-java/bin/java")是错误的,这应该是导致问题的直接原因,一定要改成库文件所在的目录哦。
备注:内容来源于stack exchange,提问作者Simon Giesen

