Ошибка .onLoad в loadNamespace() для rJava при установке пакета

У меня есть пакет «javaOnLoadFailed» (просто минимальный пакет для тестирования моей проблемы, отсюда и странное имя), который импортирует rJava. Я получаю ошибки «rJava», когда пытаюсь проверить () или установить () пакет, хотя сам require (rJava) работает нормально.

install() выдает следующие ошибки:

> install()
Installing javaOnloadFailed
"C:/Program Files/R/R-3.2.0/bin/x64/R" --no-site-file --no-environ --no-save  \
--no-restore CMD INSTALL  \
"C:/Projects/stackoverflow/javaOnloadFailed/javaOnLoadFailed"  \
--library="C:/Users/adb2018/Documents/R/win-library/3.2" --with-keep.source  \
--install-tests 

* installing *source* package 'javaOnloadFailed' ...
** R
** preparing package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded
*** arch - i386
Error : .onLoad failed in loadNamespace() for 'rJava', details:
  call: inDL(x, as.logical(local), as.logical(now), ...)
  error: unable to load shared object 'C:/Users/adb2018/Documents/R/win-library/3.2/rJava/libs/i386/rJava.dll':
  LoadLibrary failure:  %1 is not a valid Win32 application.

Error: loading failed
Execution halted
*** arch - x64
ERROR: loading failed for 'i386'
* removing 'C:/Users/adb2018/Documents/R/win-library/3.2/javaOnloadFailed'
Error: Command failed (1)

Я использую R 3.2.0 из Architect с помощью sessionInfo():

R version 3.2.0 (2015-04-16)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1

locale:
[1] LC_COLLATE=English_United States.1252 
[2] LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] devtools_1.7.0.9000 rj_2.0.3-2         

loaded via a namespace (and not attached):
[1] tools_3.2.0   rj.gd_2.0.0-1

person Aditya    schedule 29.04.2015    source источник


Ответы (5)


Переменная среды Java пуста.

> Sys.getenv('JAVA')
[1] ""

На основе suggestion, я попытался установить переменную среды JAVA так, чтобы она указывала на 64-разрядную версию Java (поскольку я использую 64-разрядную версию R, как вы могли видеть из sessionInfo, но это не не работает:

> Sys.setenv(JAVA_HOME='C:\\Program Files\\Java\\jre1.8.0_45')
> install()
Installing javaOnloadFailed
"C:/Program Files/R/R-3.2.0/bin/x64/R" --no-site-file --no-environ --no-save  \
  --no-restore CMD INSTALL  \
  "C:/Projects/stackoverflow/javaOnloadFailed/javaOnLoadFailed"  \
  --library="C:/Users/adb2018/Documents/R/win-library/3.2" --with-keep.source  \
  --install-tests 

* installing *source* package 'javaOnloadFailed' ...
** R
** preparing package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded
*** arch - i386
Error : .onLoad failed in loadNamespace() for 'rJava', details:
  call: inDL(x, as.logical(local), as.logical(now), ...)
  error: unable to load shared object 'C:/Users/adb2018/Documents/R/win-library/3.2/rJava/libs/i386/rJava.dll':
  LoadLibrary failure:  %1 is not a valid Win32 application.

Error: loading failed
Execution halted
*** arch - x64
ERROR: loading failed for 'i386'
* removing 'C:/Users/adb2018/Documents/R/win-library/3.2/javaOnloadFailed'
Error: Command failed (1)

Затем я попытался установить переменную среды JAVA так, чтобы она указывала на 32-битную версию Java в моей системе, и тогда это сработало!

> Sys.setenv(JAVA_HOME='C:\\Program Files (x86)\\Java\\jre1.8.0_45\\')
> install()
Installing javaOnloadFailed
"C:/Program Files/R/R-3.2.0/bin/x64/R" --no-site-file --no-environ --no-save  \
  --no-restore CMD INSTALL  \
  "C:/Projects/stackoverflow/javaOnloadFailed/javaOnLoadFailed"  \
  --library="C:/Users/adb2018/Documents/R/win-library/3.2" --with-keep.source  \
  --install-tests 

* installing *source* package 'javaOnloadFailed' ...
** R
** preparing package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded
*** arch - i386
*** arch - x64
* DONE (javaOnloadFailed)

[INFO] Updating the R environment index started...

[INFO] The R environment index was updated successfully.

Я не совсем понимаю, почему мне нужно указать на 32-разрядную версию Java, чтобы заставить работать 64-разрядную версию R, но, похоже, это так.

Кстати, не наткнитесь на имя моего пакета "javaOnLoadFailed". Я только что создал минимальный пакет с таким именем, чтобы проверить проблему.

person Aditya    schedule 29.04.2015
comment
Попробуйте добавить INSTALL_opts="--no-multiarch" в качестве параметра при установке, чтобы установить только для текущей архитектуры. - person Dason; 29.04.2015
comment
Спасибо за предложение @Dason - person Aditya; 30.04.2015

Многие пакеты не устанавливаются, потому что они не предназначены для работы на платформе i386, но стандартный процесс установки пытается это сделать. Пользователи тратят много времени на jvm.dll, PATH и JAVA_HOME, тогда как реальное решение состоит в том, чтобы заставить установленную просто забыть о i386. Используйте опцию для install.packages. (это также работает, когда используется библиотека дерьма. (Спасибо Дейсону)

install.packages("SqlRender",INSTALL_opts="--no-multiarch")
person userJT    schedule 06.07.2016
comment
Это также ключ к тому, чтобы заставить rJava работать с Appveyor: в разделе build_script нам нужна строка - R -e "install.packages('rJava', repos = 'http://cran.us.r-project.org', INSTALL_opts='--no-multiarch')" - person Ben; 12.09.2016
comment
Кажется, это не работает с install_github, сталкивающимся с аналогичной проблемой? - person victordongy; 09.01.2018

Помните, проблема в том, что R не знает, где находится jvm.dll. Когда вы устанавливаете JAVA_HOME, используйте путь к каталогу, содержащему файл dll. Вы можете найти его в bin\client или bin\server. Затем команда становится:

Sys.setenv(JAVA_HOME='C:\\Program Files\\Java\\jre1.8.0_45\\bin\\client')

person murume    schedule 12.09.2016

Я попытался удалить системную переменную JAVA_HOME, и она работает. Так что когда вы запускаете R, Sys.getenv("JAVA_HOME") дает вам "".

person Ken Wang    schedule 09.10.2018

Я обнаружил ту же проблему при попытке установить пакет, доступный только в Github.
Это решило для меня:

devtools::install_github("snowflakedb/dplyr-snowflakedb", INSTALL_opts=c("--no-multiarch"))
person elmaroto10    schedule 17.12.2018