web-dev-qa-db-ja.com

osxでrJavaに新しいバージョンのJavaを使用させるにはどうすればよいですか?

私はrJavaでこのチュートリアルに従っています: http://cran.r-project.org/web/packages/helloJavaWorld/vignettes/helloJavaWorld.pdf

チュートリアルで指定されているようにすべてのファイルを作成し、helloJavaWorldパッケージをインストールしましたが、helloJavaWorld()関数を実行すると、次のように文句を言います。

> helloJavaWorld()
Error in .jnew("HelloJavaWorld") :
  Java.lang.UnsupportedClassVersionError: HelloJavaWorld : Unsupported major.minor version 52.0

そこで、rJavaが使用しているJavaバージョンを確認しようとしました:

.jinit()
jvm = .jnew("Java.lang.System")
jvm.props = jvm$getProperties()$toString()
jvm.props <- strsplit(gsub("\\{(.*)}", "\\1", jvm.props), ", ")[[1]]
jvm.props

 [1] "Java.runtime.name=Java(TM) SE Runtime Environment"
 [2] "Sun.boot.library.path=/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Libraries"
 [3] "Java.vm.version=20.65-b04-466.1"
 [4] "awt.nativeDoubleBuffering=true"
 [5] "gopherProxySet=false"
 [6] "mrj.build=11M4716"
 [7] "Java.vm.vendor=Apple Inc."
 [8] "Java.vendor.url=http://www.Apple.com/"
 [9] "path.separator=:"
[10] "Java.vm.name=Java HotSpot(TM) 64-Bit Server VM"
[11] "file.encoding.pkg=Sun.io"
[12] "user.country=US"
[13] "Sun.os.patch.level=unknown"
[14] "Java.vm.specification.name=Java Virtual Machine Specification"
[15] "user.dir=/private/tmp"
[16] "Java.runtime.version=1.6.0_65-b14-466.1-11M4716"
[17] "Java.awt.graphicsenv=Apple.awt.CGraphicsEnvironment"
[18] "Java.endorsed.dirs=/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/endorsed"
[19] "os.Arch=x86_64"
[20] "Java.io.tmpdir=/var/folders/5d/44ctbbln4dsflgzxph1dm8wr0000gn/T/"
[21] "line.separator=\n"
[22] "Java.vm.specification.vendor=Sun Microsystems Inc."
[23] "os.name=Mac OS X"
[24] "Sun.jnu.encoding=MacRoman"
[25] "Java.library.path=.:/Users/kaiyin/Library/Java/Extensions:/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/Java"
[26] "Java.specification.name=Java Platform API Specification"
[27] "Java.class.version=50.0"
[28] "Sun.management.compiler=HotSpot 64-Bit Tiered Compilers"
[29] "os.version=10.10"
[30] "http.nonProxyHosts=local|*.local|169.254/16|*.169.254/16"
[31] "user.home=/Users/kaiyin"
[32] "user.timezone="
[33] "Java.awt.printerjob=Apple.awt.CPrinterJob"
[34] "file.encoding=MacRoman"
[35] "Java.specification.version=1.6"
[36] "Java.class.path=/Library/Frameworks/R.framework/Versions/3.1/Resources/library/rJava/Java/boot:/Library/Frameworks/R.framework/Versions/3.1/Resources/library/helloJavaWorld/Java"
[37] "user.name=kaiyin"
[38] "Java.vm.specification.version=1.0"
[39] "Java.home=/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home"
[40] "Sun.Arch.data.model=64"
[41] "user.language=en"
[42] "Java.specification.vendor=Sun Microsystems Inc."
[43] "awt.toolkit=Apple.awt.CToolkit"
[44] "Java.vm.info=mixed mode"
[45] "Java.version=1.6.0_65"
[46] "Java.ext.dirs=/Users/kaiyin/Library/Java/Extensions:/Library/Java/Extensions:/System/Library/Java/Extensions:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/ext"
[47] "Sun.boot.class.path=/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/jsfd.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/classes.jar:/System/Library/Frameworks/JavaVM.framework/Frameworks/JavaRuntimeSupport.framework/Resources/Java/JavaRuntimeSupport.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/ui.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/laf.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/sunrsasign.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/jsse.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/jce.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/charsets.jar"
[48] "Java.awt.headless=true"
[49] "Java.vendor=Apple Inc."
[50] "file.separator=/"
[51] "Java.vendor.url.bug=http://bugreport.Apple.com/"
[52] "Sun.io.unicode.encoding=UnicodeLittle"
[53] "Sun.cpu.endian=little"
[54] "mrj.version=1070.1.6.0_65-466.1"
[55] "socksNonProxyHosts=local|*.local|169.254/16|*.169.254/16"
[56] "ftp.nonProxyHosts=local|*.local|169.254/16|*.169.254/16"
[57] "Sun.cpu.isalist="

Java 1.6(OSXにプリインストールされている)を使用しているように見えますが、HelloJavaWorldクラスをJava 1.8でコンパイルしたため、どうすればよいですか? rJavaに新しいバージョンのJavaを使用させますか?

R CMD javareconfの出力:

Java interpreter : /usr/bin/Java
Java version     : 1.8.0_25
Java home path   : /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre
Java compiler    : /usr/bin/javac
Java headers gen.: /usr/bin/javah
Java archive tool: /usr/bin/jar
Non-system Java on OS X

trying to compile and link a JNI progam
detected JNI cpp flags    : -I$(Java_HOME)/../include -I$(Java_HOME)/../include/darwin
detected JNI linker flags : -L$(Java_HOME)/lib/server -ljvm
clang -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG -I/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/../include -I/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/../include/darwin -I/usr/local/include -I/usr/local/include/freetype2 -I/opt/X11/include    -fPIC  -Wall -mtune=core2 -g -O2  -c conftest.c -o conftest.o
clang -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -L/usr/local/lib -o conftest.so conftest.o -L/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/server -ljvm -F/Library/Frameworks/R.framework/.. -framework R -Wl,-framework -Wl,CoreFoundation


Java_HOME        : /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre
Java library path: $(Java_HOME)/lib/server
JNI cpp flags    : -I$(Java_HOME)/../include -I$(Java_HOME)/../include/darwin
JNI linker flags : -L$(Java_HOME)/lib/server -ljvm
Updating Java configuration in /Library/Frameworks/R.framework/Resources
Done.

/Library/Frameworks/R.framework/Versions/3.1/Resources/etc/javaconfのコンテンツ

## Versions from settings when configure was run
: ${Java_HOME=}
: ${Java_CPPFLAGS=~autodetect~}
: ${Java_LD_LIBRARY_PATH=~autodetect~}
: ${Java_LIBS=~autodetect~}

/Library/Frameworks/R.framework/Versions/3.1/Resources/etc/ldpathsのコンテンツ

➜  etc  cat ldpaths
: ${Java_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre}
: ${R_Java_LD_LIBRARY_PATH=${Java_HOME}/lib/server}
if test -n ""; then
: ${R_LD_LIBRARY_PATH=${R_HOME}/lib:}
else
: ${R_LD_LIBRARY_PATH=${R_HOME}/lib}
fi
if test -n "${R_Java_LD_LIBRARY_PATH}"; then
  R_LD_LIBRARY_PATH="${R_LD_LIBRARY_PATH}:${R_Java_LD_LIBRARY_PATH}"
fi
## This is DYLD_FALLBACK_LIBRARY_PATH on Darwin (OS X) and LD_LIBRARY_PATH elsewhere
if test -z "${DYLD_FALLBACK_LIBRARY_PATH}"; then
  DYLD_FALLBACK_LIBRARY_PATH="${R_LD_LIBRARY_PATH}"
else
  DYLD_FALLBACK_LIBRARY_PATH="${R_LD_LIBRARY_PATH}:${DYLD_FALLBACK_LIBRARY_PATH}"
fi
export DYLD_FALLBACK_LIBRARY_PATH
13
qed

SO上のrJavaについては矛盾する情報がたくさんあります。これらの回答の多くに関する私の懸念は、_Java_HOME_変数を使用してモンキーを開始すると、Javaインストールを完全に中断するリスクがあります-ソリューションはより悪い可能性があるということでしたこれは、rJavaの問題が発生した場合に実行できる「害を及ぼさない」ことの簡単な要約です。

1)ターミナルで、_R CMD javareconf_を実行します。これは、「現在のJavaセットアップを検出し、Rの対応する構成を更新する」」というR Coreによって記述されたスクリプトです。内部を見てください ここ

2)ソースからrJavaを再インストールします。 install.packages("rJava", type = "source")

3)コマンドラインからRを開きます。 rJavaをロードします。コマンドラインからRStudioを開きます( directions )。 rJavaをロードします。同じエラーが発生しますか?そうでなければ、素晴らしいです-あなたは暖かくなっています! R自体ではなく、RStudioの問題に問題を切り分けました。

4)RStudioとrJavaには、関連するある種の問題があります-実際、あなたは何を知っていますか、率直に言って、それは私の賃金等級を超えているので、私はその文を終わらせようとさえしません。ダイナミックライブラリ何か何か。

これについての記事がたくさんあります( ここここここそしてここ )。私のお気に入りのタイトルは「 rJavaの悪夢 」でした。

マイレージは異なる場合がありますしかし this SO答えは私がRStudioを取得するために必要なすべてでしたニースを再生するには(端末に1行のコードを記述し、シンボリックリンクを作成するだけです。アクセス許可を変更したり、環境変数を変更したりする必要はありません)。単純なシンボリックリンクです。

それでも問題が解決しない場合は、上記のリンクされたブログ投稿を読んでから、SO全体に散らばっている多数のこれでうまくいった回答をコピー/貼り付けすることをお勧めします。

18
Andrew

私も同様の問題を抱えていましたが、この解決策は私にはうまくいきませんでした。最終的には機能するようになりましたが、変更したもののどれが問題を解決したのかわかりません。これが私がしたことです:

  1. _.bash_profile_に次の行を追加しました。

    _export Java_HOME="/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre"
    export LD_LIBRARY_PATH=/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/server 
    export PATH=$PATH:$Java_HOME/bin
    _
  2. _Java.home_オプションと_DYLD_FALLBACK_LIBRARY_PATH_環境変数をRで設定しました。

    _options(Java.home="/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk")
    Sys.setenv(DYLD_FALLBACK_LIBRARY_PATH="/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/server/")
    _
  3. この問題のスレッドに従って、念のためにAppleのバージョンのJava 1.6を再インストールしました: https://github.com/s-u/rJava/issues/37

  4. RのJava設定を再構成しました。Bashの場合:_R CMD javareconf_
  5. Rをrootとして実行し、ソースから直接RForgeからrJavaをインストールしました。 Bashの場合:_Sudo R_。次に、Rセッションで:install.packages('rJava',,'http://www.rforge.net/')

ソースからのインストールは、rJavaがRの新しいJava設定を取得するために重要でした。ソースからインストールしなかった場合、rJavaは正常にインストールされますが、引き続きJRE1.6を使用します。以下を実行して、どのJRErJavaが使用するかを確認します。

_library(rJava)
.jinit()
.jcall("Java/lang/System", "S", "getProperty", "Java.runtime.version")
_

Rをrootとして実行することは、RForgeソースからrJavaを正しくインストールするために重要でした。ユーザーとしてinstall.packages('rJava',,'http://www.rforge.net/')を実行しようとすると、次のエラーメッセージが表示されました。

  • コマンドラインでRを実行すると、rJavaが正しくインストールされませんでした。

    _checking JNI data types... configure: error: One or more JNI types differ from the corresponding native type. You may need to use non-standard compiler flags or a different compiler in order to fix this.
    ERROR: configuration failed for package ‘rJava’
    _
  • FinderからアプリケーションとしてRを実行している場合、rJavaはインストールされますが、ロードされません。

    _> library(rJava) 
    Error : .onLoad failed in loadNamespace() for 'rJava', details:  
    call: dyn.load(file, DLLpath = DLLpath, ...) 
    error: unable to load shared object '/Library/Frameworks/R.framework/Versions/3.2/Resources/library/rJava/libs/rJava.so': dlopen(/Library/Frameworks/R.framework/Versions/3.2/Resources/library/rJava/libs/rJava.so, 6): 
    Library not loaded: @rpath/libjvm.dylib 
    Referenced from: /Library/Frameworks/R.framework/Versions/3.2/Resources/library/rJava/libs/rJava.so 
    Reason: image not found 
    Error: package or namespace load failed for ‘rJava’
    _

うまくいけば、この答えが他の誰かの時間を節約するでしょう!

編集して追加:2人の教授がこれらの指示に従い、次の問題が発生しました:rJavaはコマンドラインでRを実行すると機能しますが、失敗しますRStudioまたはデフォルトのMacRアプリを実行するときにロードします。

Joe Ramsey 解決策を見つけました。彼は書く:

どうやらRStudioは、Appleがアプリケーションを開くために使用するデフォルトのユーザー/ディレクトリを使用する必要があることについて不平を言っています。

この記事ではそれについて説明しています: http://jeromyanglim.tumblr.com/post/34221143729/how-to-run-rstudio-from-the-command-line-on-osx

[問題を修正するには]コマンドラインに移動して、次のように入力します:_open -a rstudio_または_open -a R_

編集番号2:Ubuntu 14.04.4 LTS(64ビット)を実行している学校のコンピューターの1つにrJavaをインストールしました。 Rをrootとして実行すると、rJavaをインストールできました。ただし、ユーザーとしてRを実行してパッケージをロードしようとすると、まったく新しいロードエラーが発生しました。

_> library(rJava)
Error : .onLoad failed in loadNamespace() for 'rJava', details:
    call: dyn.load(file, DLLpath = DLLpath, ...)
    error: unable to load shared object '/home/lizziesilver/R/x86_64-pc-linux-gnu-library/3.2/rJava/libs/rJava.so':
    libjvm.so: cannot open shared object file: No such file or directory
  Error: package or namespace load failed for ‘rJava’
_

ディレクトリを確認しました。 rJava.soは間違いなく存在していました。私には適切な権限がないことが判明しました。

_...$ ls -l /home/lizziesilver/R/x86_64-pc-linux-gnu-library/3.2/rJava/libs/rJava.so
-rwxr-xr-x 1 root root 353325 Feb 26 16:58 /usr/lib/R/library/rJava/libs/rJava.so
_

だから私は許可を変更しました:_Sudo chmod -R a+rX /home/lizziesilver/R/x86_64-pc-linux-gnu-library/3.2/rJava/_

次に、RのJava設定を再構成しました:

_export LD_LIBRARY_PATH=/usr/lib/jvm/Java-8-Oracle/lib/AMD64:/usr/lib/jvm/Java-8-Oracle/jre/lib/AMD64/server
Sudo R CMD javareconf
_

RootではなくユーザーとしてRを実行している場合でも、rJavaがロードされるようになりました。

rJava:提供し続けるパッケージ(構成エラー)

10
Lizzie Silver

RForgeの最新のソースパッケージからインストールすることで問題を解決しました: http://www.rforge.net/rJava/files/

cd /tmp
wget http://www.rforge.net/rJava/snapshot/rJava_0.9-7.tar.gz
R CMD INSTALL rJava_0.9-7.tar.gz

Rの場合:

> library(helloJavaWorld)
Loading required package: rJava
> helloJavaWorld()
[1] "Hello from Java!"
2
qed

これが私にとってかなりうまくいった解決策です:

  1. ターミナルで実行:R CMD javareconf

  2. 出力例からJava_HOMEパスとJavaライブラリパス)を取得します

Java_HOME:/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre Javaライブラリパス:$(Java_HOME)/ lib/server JNI cppフラグ:-I $( Java_HOME)/../ include -I $(Java_HOME)/../ include/darwin JNIリンカーフラグ:-L $(Java_HOME)/ lib/server-ljvm更新Java Library/Frameworks/R.framework/Resources

  1. 次に、RStudioのオープンインスタンスがないことを確認します。最新のJavaバージョンへの正しいパスでRStudioを開くエイリアスを作成します。これをコマンドラインで実行します

エイリアスrstudio = "DYLD_FALLBACK_LIBRARY_PATH =/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/server open -a RStudio"

  1. ターミナルにrstudioと入力します

  2. 完了! Rstudioは右向きに開きますJavaバージョン

0
nadia