问题描述
我(和一些同事)一直在研究依赖于rJava的软件包。我们连接到的程序需要运行Java 11+,并且在尝试配置.travis.yml文件时遇到了一些问题。
我尝试遵循this answer的解决方案(同时使它们适应Java 11),但似乎没有一个可行。首先,我尝试过:
language: r
warnings_are_errors: true
sudo: required
cache: packages
apt_packages:
- r-cran-rjava
但是我收到以下错误消息:
Failed with error: ‘.onLoad failed in loadNamespace() for 'rJava',details:
call: dyn.load(file,DLLpath = DLLpath,...)
error: unable to load shared object '/home/travis/R/Library/rJava/libs/rJava.so':
libjvm.so: cannot open shared object file: No such file or directory’
然后我尝试了第二种方法:
language: r
warnings_are_errors: true
sudo: required
cache: packages
apt_packages:
- default-jdk
before_install:
- export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
- export PATH=$PATH:$JAVA_HOME/bin
- export LD_LIBRARY_PATH=/usr/lib/jvm/java-11-openjdk-amd64/lib
- sudo R CMD javareconf
此错误消息引起的后果:
sudo: R: command not found
The command "sudo R CMD javareconf" failed and exited with 1 during .
我尝试不使用sudo
,但随后我发现我没有所需的权限。
我觉得解决方案可能很明显,但是我已经坚持了很长时间。
解决方法
这是因为R
在用户的PATH中,但是sudo
忽略了它,只在几个系统位置中查找。通过在用户级别解析完整路径可以轻松解决此问题:
- sudo $(which R) CMD javareconf
这会将R的完整路径插入到sudo命令中。
请注意,javareconf
脚本看起来足够聪明,可以在标准位置检测Java,因此在调用之前无需导出JAVA_HOME
,PATH
或LD_LIBRARY_PATH
它。
我得到了以下.travis.yml
文件:
language: r
cache: packages
warnings_are_errors: true
sudo: required
apt_packages:
- r-cran-rjava
before_install:
- sudo $(which R) CMD javareconf