web-dev-qa-db-ja.com

パッケージのインストール時に、「rJava」のloadNamespace()で.onLoadが失敗しました

RJavaをインポートするパッケージ「javaOnLoadFailed」(問題をテストするための最小限のパッケージ、したがって奇妙な名前)があります。 require(rJava)自体は正常に機能しますが、パッケージをcheck()またはinstall()しようとすると、「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)

Architect内からsessionInfo()を使用してR3.2.0を使用しています。

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
17
Aditya

Java環境変数は空です

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

suggestion に基づいて、Java環境変数を64ビットバージョンのJavaを指すように設定してみました(私はsessionInfoからわかるように、R 64ビットを実行していますが、機能しません。

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

次に、システム上の32ビットバージョンのJavaを指すように、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.

R64ビットを機能させるためにJava 32ビットを指す必要がある理由はよくわかりませんが、そうなっているようです。

ちなみに、私のパッケージ名「javaOnLoadFailed」につまずかないでください。問題をテストするために、その名前で最小限のパッケージを作成しました。

24
Aditya

多くのパッケージは、i386プラットフォームで実行することを意図していないため、インストールに失敗しますが、標準のインストールプロセスはそれを実行しようとします。本当の修正がインストールされたものにi386を忘れさせることであるとき、ユーザーはjvm.dllとPATHとJava_HOMEで多くの時間を浪費します。 install.packagesのオプションを使用します。 (これは、dratライブラリが使用されている場合にも機能します。(クレジットはDasonに送られます)

install.packages("SqlRender",INSTALL_opts="--no-multiarch")
3
userJT

_Java_HOME_システム変数を削除しようとしましたが、機能します。そのため、Rを起動すると、Sys.getenv("Java_HOME")は_""_を提供します。

1
Xiankai Wang

Githubでのみ利用可能なパッケージをインストールしようとすると、同じ問題が見つかりました。
これは私にとって解決しました:

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

問題は、Rがjvm.dllの場所を知らないことです。 Java_HOMEを設定するときは、dllファイルを含むディレクトリのパスを使用します。 _bin\client_または_bin\server_にあります。コマンドは次のようになります。

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

1
murume