Переключить версию java на Win10 — проблема с ключом регистра

#java #java-8 #windows-10

#java #java-8 #windows-10

Вопрос:

Я должен переключаться между Java 7 и Java 8 в Windows 10.

У меня оба установлены:

 C:Program FilesJavajre1.8.0_91
C:Program FilesJavajre7
  

На моем ПУТИ есть общий путь (который содержит ссылки на исполняемые файлы Java). Это единственное значение Java во всех переменных eviroment:

 Path=C:ProgramDataOracleJavajavapath;..
  

Когда я хочу запустить Java 8, я создаю 3 реальные ссылки на C:Program FilesJavajre1.8.0_91 (с помощью команды mklink /H [link] [origin] ):

 C:ProgramDataOracleJavajavapathjava.exe   >> C:Program FilesJavajre1.8.0_91binjavapathjava.exe  
C:ProgramDataOracleJavajavapathjavaw.exe  >> C:Program FilesJavajre1.8.0_91binjavapathjavaw.exe 
C:ProgramDataOracleJavajavapathjavaws.exe >> C:Program FilesJavajre1.8.0_91binjavapathjavaws.exe
  

С этой конфигурацией это работает.

Но, когда я хочу запустить Java 7, я создаю 3 реальные ссылки на C:Program FilesJavajre7 :

 C:ProgramDataOracleJavajavapathjava.exe   >> C:Program FilesJavajre7binjavapathjava.exe  
C:ProgramDataOracleJavajavapathjavaw.exe  >> C:Program FilesJavajre7binjavapathjavaw.exe 
C:ProgramDataOracleJavajavapathjavaws.exe >> C:Program FilesJavajre7binjavapathjavaws.exe
  

Когда я пытаюсь запустить java, это не работает!Я получаю следующую ошибку:

 Error: Registry key 'SoftwareJavaSoftJava Runtime Environment'CurrentVersion' 
has value '1.8', but '1.7' is required.
Error: could not find java.dll Error: Could not find Java SE Runtime Environment.
  

Есть обходной путь, но он мне не очень нравится. Я могу работать с Java 7 только таким образом:

  1. Удалить C:ProgramDataOracleJavajavapath; из%PATH%
  2. Добавить C:Program FilesJavajre7bin; в%PATH%

Мне не нравится это решение, потому что оно отличается от предыдущей конфигурации, и потому что мне каждый раз приходится вручную удалять значение из PATH.

Комментарии:

1. Это просто проблема с копированием и вставкой или вы действительно ссылаетесь на несуществующий .. jre7 bin javapath java.exe ?

2. Это полная команда, и она работает: mklink /H C:ProgramDataOracleJavajavapathjava.exe "C:Program FilesJavajre7binjava.exe"

3. Проблема в том, что java.exe пытается сначала найти свой каталог JRE, проверив, находится ли он там, откуда он был запущен. Поскольку каталог javapath не содержит JRE, он затем ищет его в реестре и находит неправильный. Если вы добавите каталог JRE7 bin в путь, java.exe я найду его. Вам не нужно удалять каталог javapath; просто убедитесь, что jre7bin стоит на первом месте, например path %programfiles%Javajre7bin;%path% , будет достаточно.

4. хорошо, но таким образом, каждый раз, когда мне нужно переключать версию JAva, мой пакет добавляет другой путь в начале %PATH%; в противном случае я должен вручную изменить его

5. Я знаю, это не идеальное решение — вот почему я не назвал это ответом.

Ответ №1:

Было бы неплохо узнать, какой рекомендуемый способ Oracle, но не смог найти эту информацию. Следующее может быть разумным взломать обходной путь (я использовал аналогичный метод в прошлом).

Создайте соединение (или символическую ссылку):

 mklink /j "C:Program FilesJavajre" "C:Program FilesJavajre1.8.0_102"
  

Затем удалите C:ProgramDataOracleJavajavapath из вашего PATH и замените его C:Program FilesJavajrebin .

Теперь, когда вы хотите переключиться на Java 7, просто сделайте:

 rd "C:Program FilesJavajre"
mklink /j "C:Program FilesJavajre" "C:Program FilesJavajre7"
  

Это работает, потому что, когда вы сейчас введете java , он найдет его (по ПУТИ) C:Program FilesJavajrebinjava.exe . Исполняемый файл знает, в каком каталоге он находится, и ищет там другие файлы (jar, DLL и т. Д.). Поскольку jre теперь это псевдоним для jre7 , он найдет правильные. И поскольку он их находит, он не заглядывает в реестр.

Вы можете, конечно, создать командный файл или ярлык, содержащий команду для переключения между двумя версиями.

Комментарии:

1. Разница между вашей и моей конфигурацией заключается в том, что вы создаете a mklink /J для папки, а я создаю a milink /H для исполняемых файлов. К сожалению, ваше решение имеет ту же ошибку в разделе реестра. То же самое с mklink /H папкой. Я не знаю почему, но наличие реальной папки в ПУТИ вместо ссылки делает все различия.

2. @Radioleao mklink /h не работает с папками afaik, вам нужно будет использовать mklink /d . Возможно, вы захотите попробовать это.

3. Я пробовал 4 конфигурации: жесткая ссылка на файлы — жесткая ссылка на папку — символическая ссылка на файлы — символическая ссылка на папку.

4.Я протестировал это решение с Windows 10 и Java 6, 7 и 8 (JDK), и оно работало без сбоев. Интересно, что лучший вариант был mklink jdk pathToActualJDK без использования /D . Затем сама ссылка обрабатывается как файл, но разрешение путей через нее все еще работает, т. Е. Добавление jdkbin к PATH разрешению поиска java.exe и т. Д. Связанного фактического jdk. Преимущество неиспользования /D заключается в том, что вы можете просто del jdk избавиться от ссылки, не del пытаясь удалить рекурсивно, поскольку jdk она обрабатывается как файл.

5. @Radioleao: в нем содержались ссылки на некоторые из моих установок 1.8, но чтобы доказать, что они не имеют значения при связывании папки jdk, я удалил всю JavaSoft ветку, и она все еще работает. Ключевым моментом на самом деле является то, что вам нужно связать всю папку jre или jdk, а не исполняемые файлы.

Ответ №2:

Я не уверен на 100%, но я полагаю, что вам, возможно, придется установить для переменной JAVA_HOME ту версию, которую вы также хотите использовать.

Комментарии:

1. До сегодняшнего дня он всегда работал без JAVA_HOME, может быть, это старые вещи? В любом случае я попробовал УСТАНОВИТЬ JAVA_HOME = C:Program FilesJava jre7 и ничего не изменилось.

2. Извините, я должен был присмотреться. JAVA_HOME предназначен для JDK. JRE_HOME применяется к JRE

3. Никаких ошибок. Но при дальнейшей проблеме это сработало, если я изменил значение переменной окружения%PATH%, но это не лучшее решение. Я собираюсь обновить свой запрос.

4. mindprod.com/jgloss/javaexe.html#MULTIPLES может быть, это поможет вам немного больше. Похоже, что в system32 также есть java, поэтому, если она первая на вашем пути, она будет просматривать реестр, чтобы решить, какую версию запускать. Может быть, измените значения вашего пути?

5. Я никогда не устанавливал JAVA_HOME nor JRE_HOME за последние двадцать лет использования Java.