如何为依赖于 rJava 的包配置 .travis.yml?

How to configure a .travis.yml for a package that depends on rJava?

我(和一些同事)一直在开发一个依赖于 rJava 的包。我们连接的程序需要 Java 11+ 到 运行,我们在尝试配置 .travis.yml 文件时遇到了一些问题。运行

我尝试遵循 的解决方案(同时将它们调整为 Java 11),但 none 似乎有效。首先我尝试了:

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_HOMEPATHLD_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