【问题标题】:How to configure a .travis.yml for a package that depends on rJava?如何为依赖于 rJava 的包配置 .travis.yml?
【发布时间】:2020-08-28 23:47:58
【问题描述】:

我(和一些同事)一直在研究一个依赖于 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 travis-ci rjava


    【解决方案1】:

    这是因为 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
    

    【讨论】:

    • 请注意,这似乎安装了 java-8-openjdk,而不是 11。但它解决了您遇到的两个错误消息。
    • 成功了!非常感谢你。我其实只需要jre 11,不一定是jdk 11,我意识到是r-cran-rjava安装的,所以应该没问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多