Получение R для использования более новых версий java

Этот вопрос связан с этим другим вопросом.

Я пытаюсь использовать RNetLogo с R и получить следующую ошибку.

nl.path <- "/Applications/NetLogo 5.1.0"
NLStart(nl.path) 
Error in .jnew("nlcon/Preprocess") : 
  java.lang.UnsupportedClassVersionError: nlcon/Preprocess : Unsupported major.minor version 51.0

Из того, что я понял в этом другом вопросе, проблема в том, что R использует старую версию Java, которая несовместима с RNetLogo.

Я установил Java 8.0, надеясь решить проблему, но я понимаю, что, несмотря на то, что Java 8.0 установлен на моем компьютере (Mac OS Maverick), R не подбирает его и не пытается использовать старые версии Java.

Итак, мой вопрос: как я могу заставить R использовать Java 8.0 вместо старой версии?

В терминальной консоли я получаю

java -version :
java version "1.6.0_65"
Java(TM) SE Runtime Environment (build 1.6.0_65-b14-462-11M4609)
Java HotSpot(TM) 64-Bit Server VM (build 20.65-b04-462, mixed mode)

Заранее благодарим за помощь,

Ответ 1

Кажется, что в Mac OS X вы можете одновременно использовать несколько Java.

Используйте команду ниже на терминале, чтобы проверить, сколько у вас версии JDK.

/usr/libexec/java_home -V

Вы можете следовать инструкциям ниже, чтобы иметь правильную настройку Java Path:

Как установить переменную среды $JAVA_HOME в Mac OS X

В двух словах:

export JAVA_HOME = $(/usr/libexec/java_home -v 1.8)

Ответ 2

К сожалению, ни один из них, похоже, не помогает на Mac. Решения Windows и Linux не актуальны, потому что файлы находятся в разных местах.

Если вы просто обновляете Java 1.8 (Java 8 для Oracle) стандартным способом, как подсказывает боль в настройках Java, вы просто получаете Java Runtime Environment (JRE). Если вы запустите...

/usr/libexec/java_home -V

... он все еще показывает только java 1.6 и...

export JAVA_HOME = $(/usr/libexec/java_home -v 1.8)

... вызывает ошибку, говоря, что не может найти версию 1.8.

Чтобы Mac смог распознать более новую версию Java, кажется, вы должны установить JDK v.8 (а не JRE). В этот момент вы можете заставить Mac распознать, что доступна новая виртуальная машина Java, и вы можете успешно выполнить команду экспорта. (Обратите внимание, что новая 1.8 JVM находится в РАЗЛИЧНОМ месте -/Library/Java вместо /System/Library/Java для 1.6.). НО, это все равно не подходит для R.

Я попытался помещать команду экспорта JAVA_HOME... в мой .profile и мой .bash_profile. Затем подбираем оба. Прекрасно работает, но не влияет на R AFAICT. Я запустил R через стандартный графический интерфейс Mac R, из RStudio и с терминала, и он распознает только Java 1.6. Так что RNetLogo все еще не работает.

Я попытаюсь найти RNetLogo 1.0-0 в архиве и проверить это. Если это сработает, я предлагаю откатить 1.0-1, пока эта проблема Java не будет решена.

Ответ 3

Я использую эту строку в окнах:

options(java.home="C:/Program Files/Java/jre7/")

Вероятно, вам нужно изменить 7 на 8 и найти правильный путь на mac.

Ответ 4

Это предположительно работает (первоначально из этого blog):

1) Загрузите и установите Apples Java версии 1.6.

2) Переконфигурируйте свою установку Java с помощью sudo R CMD javareconf -n.

3) Установите rJava из источника с помощью install.packages('rJava', type='source').

Пожалуйста, подтвердите, что Уилл Лоу на conjugateprior.org для исходного сообщения и решения.

Ответ 5

РЕДАКТИРОВАТЬ: Я не знаю, кто-то все еще борется с этим, но с rJava 0.9-9, "частичное исправление" ниже больше не работает. То, что работает и полностью, является окончательным решением, предлагаемым здесь: https://github.com/s-u/rJava/issues/86

Копирование оттуда, большое спасибо Грегори Р. Варнсу:

  • удалите существующие версии rJava, выполнив в терминале следующее:

    Rscript -e 'remove.packages("rJava")'
    sudo Rscript -e 'remove.packages("rJava")'
    
  • добавьте следующее в /Users/<userid>/.bashrc:

    export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)/jre'
    

(например, введите > vim /Users/<userid>/.bashrc в терминале, затем "i", добавьте строку выше, затем ": wq" для сохранения и выхода)

  • закрыть и перезапустить все окна Terminal, R и RStudio

  • введите в окне терминала следующее:

    sudo ln -sf $(/usr/libexec/java_home)/jre/lib/server/libjvm.dylib /usr/local/lib
    
  • в новом сеансе R заново установите rJava из источника:

    install.packages("rJava", repos="http://rforge.net", type="source")
    

СТАРЫЙ "ЧАСТИЧНЫЙ ФИКС" НИЖЕ:

Хорошо. Я работаю над этой проблемой все утро, и у меня есть частичное исправление.

Я попробовал решение, предложенное Guilherme Kenji Chihaya выше, но даже после sudo R CMD javareconf -n и install.packages('rJava', type='source') R настаивает на использовании Java 1.6 (и с удовольствием это делает).

HOWEVER, студия R создает ошибку после повторной установки rJava:

Библиотека (rJava) Ошибка:.onLoad failed в loadNamespace() для 'rJava', подробности:   call: dyn.load(файл, DLLpath = DLLpath,...)   ошибка: невозможно загрузить общий объект '/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): библиотека не загружена: @rpath/libjvm.dylib   Ссылки:/Library/Frameworks/R.framework/Versions/3.2/Resources/library/rJava/libs/rJava.so   Причина: изображение не найдено Ошибка: загрузка пакета или пространства имен не выполнена для 'rJava

Googling это привело меня к этому сообщению: http://andrewgoldstone.com/blog/2015/02/03/rjava/ с рабочим решением. Установите в терминале следующее:

alias r="DYLD_FALLBACK_LIBRARY_PATH=/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/server/: open -a r"

И запустите R из терминала. Затем, магически, в R:

> library(rJava)
> .jinit()
> .jcall("java/lang/System", "S", "getProperty", "java.runtime.version")
[1] "1.8.0_11-b12"

Однако это работает только при запуске R из терминала. Я не смог получить R, чтобы автоматически распознать правильный "DYLD_FALLBACK_LIBRARY_PATH" любым способом.

Ответ 6

Попробуйте связать libjvm.dylib с /usr/lib:

sudo ln -f -s $(/usr/libexec/java_home)/jre/lib/server/libjvm.dylib /usr/lib

-f добавлен флаг, чтобы принудительно перезаписать существующий файл/ссылку

Ответ 7

В Ubuntu есть команда alternatives, которую я использую для этой цели.

alternatives --install /usr/bin/java java /usr/java/jdk1.8*/jre/bin/java 200000
alternatives --install /usr/bin/javaws javaws /usr/java/jdk1.8*/jre/bin/javaws 200000
alternatives --install /usr/bin/javac javac /usr/java/jdk1.8*/bin/javac 200000
alternatives --install /usr/bin/jar jar /usr/java/jdk1.8*/bin/jar 200000

После установки альтернатив используйте следующую команду, чтобы изменить свою версию. alternatives --config java, а затем выберите новую версию java.

Если это не доступно, вы должны сначала узнать, где именно находится ваша новая Java. locate *jdk1.8* Затем выясните, какой java вы используете как двоичный. which java это вернет путь к двоичному. это старый двоичный java, поэтому удалите его и добавьте новый java файл в одно и то же место. Например: ln -s /path/to/java1.8*/bin/java /usr/bin/java

В дополнении вам необходимо обновить переменную среды CLASS_PATH, необходимую для виртуальной машины.

например: export CLASS_PATH=/usr/java/jdk1.8*/jre/lib, и вы можете добавить эту строку в свой bashrc файл, чтобы зарегистрировать эту конфигурацию.

Ответ 8

В установках на основе Debian R использует настройки /etc/R/Makeconf для создания библиотек. Одна из настроек - JAVA_HOME. Попробуйте установить правильный путь и переустановите пакет.