«Системе не удается найти файл C:\ProgramData\Oracle\Java\javapath\java.exe»
Я использую JDK 8u25 в Windows 8, и у меня возникла проблема с установкой Java. Я могу нормально запустить javac , но запуск java выдает следующее сообщение об ошибке:
The system cannot find the file C:\ProgramData\Oracle\Java\javapath\java.exe
Я думаю, что проблема связана с моими переменными среды.
Важными переменными, как я их установил, являются:
- JAVA_HOME – C:\Program Files\Java\jdk1.8.0_25
- CLASSPATH – .;%JAVA_HOME%\lib
- PATH – ;%JAVA_HOME%\bin
И их расширения, если смотреть с помощью set в cmd, таковы:
- JAVA_HOME – C:\Program Files\Java\jdk1.8.0_25
- CLASSPATH – .;C:\Program Files\Java\jdk1.8.0_25\lib;%CLASSPATH%;
- PATH – C:\ProgramData\Oracle\Java\javapath;C:\Program Files\Java\jdk1.6.0_45\bin;;C:\Program Files\Java\jdk1.8.0_25\bin
Полный вывод set можно просмотреть здесь.
Проверьте эту ссылку, чтобы узнать, как установить переменные среды. stackoverflow.com/q/1672281/4083590
То, что я сделал, похоже на пост по ссылке. Мне не нужна \lib в конце пути к классам? Пробовал и с ним и без. Я все еще получал сообщение об ошибке, когда пытался запустить файл класса.
На вашем скриншоте вместо \ . Почему? Не могу опознать персонажа. Вероятно, не стоит раскрывать переменные среды. Вы должны показывать только релевантные
19 ответов
У меня похожая проблема, над решением которой я сейчас работаю. Я не могу сказать, что это решит вашу ошибку, так как могут быть проблемы с другим программным обеспечением (как в моем случае с Eclipse Luna).
Java использует путь, указанный в вашей переменной PATH, то есть
C:\ProgramData\Oracle\Java\javapath
Перейдите в эту папку (ProgramData скрыта, поэтому при необходимости отобразите ее) и щелкните правой кнопкой мыши символическую ссылку java.exe. В поле «Цель» вы увидите, где он ищет java.exe. Это может указывать на файл java.exe из вашей предыдущей установки jdk1.6.0_45. Либо вставьте сюда новые ярлыки, либо измените параметр PATH, как уже упоминалось другими.
Я обнаружил, что установщик Java не меняет javapath и не обновляет системный путь, по крайней мере, при переходе с 1.8 на 1.7. В моем случае изменение ярлыков привело только к проблеме с Eclipse при запуске.
РЕДАКТИРОВАТЬ:—— После игры с ярлыками папок javapath оказывается, что вам нужны символические ссылки, по крайней мере, для Eclipse. См. Windows, как создать символическую ссылку на каталог.
Вам не нужен переключатель /d для символической ссылки на файл,
mklink java.exe "C:\Program Files\Java\jdk1.8.0_20\bin\java.exe" mklink javaw.exe "C:\Program Files\Java\jdk1.8.0_20\bin\javaw.exe" mklink javaws.exe "C:\Program Files\Java\jdk1.8.0_20\bin\javaws.exe"
Теперь это работает для меня.
Похоже, он не работает в Windows 7 — из-за недавнего изменения в том, как он обрабатывает символические ссылки, его графический интерфейс отображает ошибку, говорящую о том, что он не может найти «java[w/ws].exe» при использовании символических ссылок. Безопаснее просто создать соединение каталогов: rmdir /s /q %ProgramData%\Oracle\Java\javapath & mlink /d %ProgramData%\Oracle\Java\javapath %ProgramFiles%\Java\jre1.8.0_60\bin
Перед запуском этих mklink обязательно cd C:\ProgramData\Oracle\Java\javapath и del java*.exe , иначе вы создадите новые символические ссылки в текущем каталоге cmd.
Возможно, вам придется запустить командную строку от имени администратора, иначе вы можете столкнуться с проблемами с разрешениями (как у Игоря выше).
Почему Oracle так плохо указал на java, мне непонятно. Мы решили эту проблему, создав новую ссылку на JDK
mklink /d C:\ProgramData\Oracle\Java\javapath "C:\Program Files\Java\jdk1.8.0_40\bin\"
То же самое будет работать для JRE, если это все, что требуется.
Это заменяет старые символические ссылки в C:\ProgramData\Oracle\Java\javapath (если они существовали ранее)
Это работает для java, но не для javac: не удается найти или загрузить основной класс com.sun.tools.javac.Main
Why Oracle did such a poor way to point to java is beyond me Я предполагаю, что причина была в том, что когда у вас есть относительно постоянная env var (всегда указывающая на одно место — папку fe javapath ), вы можете динамически менять пути, на лету (изменение ссылки делает не требует перезапуска оболочки). В то время как, если вы измените env var (например, PATH), вам придется перезапустить оболочку, чтобы перезагрузить и применить новые значения ENVVAR. Конечно, я не сторонник Oracle, и, конечно, это всего лишь мое предложение.
C:\ProgramData\Oracle\Java\javapath;C:\Program Files\Java\jdk1.8.0_92\bin;
C:\ProgramData\Oracle\Java\javapath;
И это решило проблему для меня. java -version теперь предоставляет подробную информацию о версии Java и т. д.
Это решит все проблемы, связанные с Java и переменными среды:
- Перейдите в диалоговое окно переменных среды Windows.
- В разделе Системные переменные выберите переменную с именем Путь. Нажмите Изменить. .
- Удалите запись, которая выглядит так:
C:\ProgramData\Oracle\Java\javapath
Обновление переменной среды PATH
Если вы не задаете переменную PATH, вам необходимо указывать полный путь к исполняемому файлу при каждом его запуске, например:
C:\> "C:\Program Files\Java\jdk1.8.0\bin\javac" MyClass.java
Полезно установить переменную PATH на постоянной основе, чтобы она сохранялась после перезагрузки.
Чтобы установить переменную PATH на постоянной основе, добавьте полный путь к каталогу jdk1.8.0\bin в переменную PATH. Обычно этот полный путь выглядит примерно так
C:\Program Files\Java\jdk1.8.0\bin .
Установите переменную PATH следующим образом в Microsoft Windows:
- Нажмите Пуск, затем Панель управления, затем Система.
- Нажмите «Дополнительно», затем «Переменные среды».
- Добавьте расположение папки bin установки JDK в переменную PATH в системных переменных.
Следующее является типичным значением переменной PATH: C:\WINDOWS\system32;C:\WINDOWS;C:\Program Files\Java\jdk1.8.0\bin
Новый путь вступает в силу в каждом новом командном окне, которое вы открываете после установки переменной PATH.
«Системе не удается найти файл C: \ ProgramData \ Oracle \ Java \ javapath \ java.exe»
изображение связанных переменных среды, которые я ввел: Я мог бы создать файл класса, но когда я попытался запустить файл класса, произошла ошибка и он сказал следующее:
Я не могу понять, в чем проблема. Является ли это мои переменные, которые загрязнены (и если да, то почему и как я должен их исправить), или если это что-то другое.
проверьте эту ссылку, чтобы узнать, как установить переменные среды. stackoverflow.com/q/1672281/4083590
@johny То, что я сделал, похоже на пост по ссылке. Разве мне не нужен \ lib в конце пути к классам? Я попробовал это с и без. Я все еще получал сообщение об ошибке, когда пытался запустить файл класса.
Ваш скриншот имеет странный символ вместо \. Зачем? Я не могу определить характер. Вероятно, не стоит раскрывать переменные среды. Вы должны показывать только соответствующие
14 ответов
У меня есть аналогичная проблема, над которой я сейчас работаю. Я не могу сказать, что это решит вашу ошибку, поскольку могут возникнуть проблемы с другим программным обеспечением (это мой случай с Eclipse Luna).
Java использует путь, указанный в вашей переменной PATH, которая,
C:\ProgramData\Oracle\Java\javapath
Перейдите в эту папку (ProgramData скрыта, поэтому, если необходимо), щелкните правой кнопкой мыши по символической ссылке java.exe. Вы увидите в поле Цель, где он ищет java.exe. Он может указывать на файл java.exe из вашей предыдущей установки jdk1.6.0_45. Либо вставьте новые ярлыки здесь, либо измените настройку PATH, как упомянули другие.
Я обнаружил, что установщик Java не изменяет javapath или не обновляет системный путь, по крайней мере, при переходе от 1,8 до 1,7. В моем случае изменение ярлыков только привело к проблеме с Eclipse при запуске.
EDIT: —— После игры с ярлыками в папке javapath оказывается, что вам нужны символические ссылки, по крайней мере для Eclipse. См. Windows, как создать символическую ссылку для каталога.
Вам не нужен переключатель /d для символической ссылки файла,
mklink java.exe "C:\Program Files\Java\jdk1.8.0_20\bin\java.exe" mklink javaw.exe "C:\Program Files\Java\jdk1.8.0_20\bin\javaw.exe" mklink javaws.exe "C:\Program Files\Java\jdk1.8.0_20\bin\javaws.exe"
Теперь это работает для меня.
Как найти, где установлен javaw.exe?
Итак, для проекта, над которым я работаю, мне нужно выяснить, где находится javaw.exe на пользовательской машине. Как это сделать? Предполагая, что пользователь находится на компьютере под управлением Windows Метод, который я использовал, ограничен только английскими версиями Windows.
Я искал, где установлена ОС, найдите каталог Program Files , найдите каталог Java , jdk , bin , затем javaw.exe . Я знаю, что это не будет работать на неанглийских версиях Windows. Что такое независимый от человека язык?
Существуют специфичные для ОС API-интерфейсы поиска для поиска файлов и получения версии из исполняемого файла. В Windows вы можете использовать API поиска Windows для поиска и :: GetFileVersionInfo (. ), чтобы получить версию. Обратите внимание, что поиск может занять некоторое время. Альтернативой является отправка собственной JVM, что упрощает поиск по относительному пути.
@LittleChild: Обратите внимание, что обычно вы не найдете JDK, установленный на ПК обычного пользователя. Ваши шансы лучше искать установку JRE.
5 ответов
Для полноты позвольте мне упомянуть, что есть некоторые места (на ПК с Windows) для поиска javaw.exe в случае, если он не найден в пути: (Рекомендация Still Reimeus должна быть вашей первой попыткой.)
1.
Java обычно хранит его местоположение в реестре под следующим ключом:
HKLM\Software\JavaSoft\Java Runtime Environement\\JavaHome
2.
Более новые версии JRE/JDK, похоже, также помещают копию javaw.exe в «C:\Windows\System32», поэтому вам тоже может понадобиться проверить (хотя есть шансы, если она есть, она будет найдена в путь также).
3.
Конечно, есть «обычные» места установки:
- ‘C:\Program Files\Java\jre *\bin’
- ‘C:\Program Files\Java\jdk *\bin’
- ‘C:\Program Files (x86)\Java\jre *\bin’
- ‘C:\Program Files (x86)\Java\jdk *\bin’
Некоторое время назад я написал этот фрагмент кода для проверки javaw.exe в вышеупомянутых местах. Может быть, кто-то сочтет это полезным:
static protected String findJavaw() < Path pathToJavaw = null; Path temp; /* Check in Registry: HKLM\Software\JavaSoft\Java Runtime Environement\\JavaHome */ String keyNode = "HKLM\\Software\\JavaSoft\\Java Runtime Environment"; List output = new ArrayList<>(); executeCommand(new String[] , output); Pattern pattern = Pattern.compile("\\s*CurrentVersion\\s+\\S+\\s+(.*)$"); for (String line : output) < Matcher matcher = pattern.matcher(line); if (matcher.find()) < keyNode += "\\" + matcher.group(1); Listoutput2 = new ArrayList<>(); executeCommand( new String[] , output2); Pattern pattern2 = Pattern.compile("\\s*JavaHome\\s+\\S+\\s+(.*)$"); for (String line2 : output2) < Matcher matcher2 = pattern2.matcher(line2); if (matcher2.find()) < pathToJavaw = Paths.get(matcher2.group(1), "bin", "javaw.exe"); break; >> break; > > try < if (Files.exists(pathToJavaw)) < return pathToJavaw.toString(); >> catch (Exception ignored) <> /* Check in 'C:\Windows\System32' */ pathToJavaw = Paths.get("C:\\Windows\\System32\\javaw.exe"); try < if (Files.exists(pathToJavaw)) < return pathToJavaw.toString(); >> catch (Exception ignored) <> /* Check in 'C:\Program Files\Java\jre*' */ pathToJavaw = null; temp = Paths.get("C:\\Program Files\\Java"); if (Files.exists(temp)) < try (DirectoryStreamdirStream = Files.newDirectoryStream(temp, "jre*")) < for (Path path : dirStream) < temp = Paths.get(path.toString(), "bin", "javaw.exe"); if (Files.exists(temp)) < pathToJavaw = temp; // Don't "break", in order to find the latest JRE version >> if (pathToJavaw != null) < return pathToJavaw.toString(); >> catch (Exception ignored) <> > /* Check in 'C:\Program Files (x86)\Java\jre*' */ pathToJavaw = null; temp = Paths.get("C:\\Program Files (x86)\\Java"); if (Files.exists(temp)) < try (DirectoryStreamdirStream = Files.newDirectoryStream(temp, "jre*")) < for (Path path : dirStream) < temp = Paths.get(path.toString(), "bin", "javaw.exe"); if (Files.exists(temp)) < pathToJavaw = temp; // Don't "break", in order to find the latest JRE version >> if (pathToJavaw != null) < return pathToJavaw.toString(); >> catch (Exception ignored) <> > /* Check in 'C:\Program Files\Java\jdk*' */ pathToJavaw = null; temp = Paths.get("C:\\Program Files\\Java"); if (Files.exists(temp)) < try (DirectoryStreamdirStream = Files.newDirectoryStream(temp, "jdk*")) < for (Path path : dirStream) < temp = Paths.get(path.toString(), "jre", "bin", "javaw.exe"); if (Files.exists(temp)) < pathToJavaw = temp; // Don't "break", in order to find the latest JDK version >> if (pathToJavaw != null) < return pathToJavaw.toString(); >> catch (Exception ignored) <> > /* Check in 'C:\Program Files (x86)\Java\jdk*' */ pathToJavaw = null; temp = Paths.get("C:\\Program Files (x86)\\Java"); if (Files.exists(temp)) < try (DirectoryStreamdirStream = Files.newDirectoryStream(temp, "jdk*")) < for (Path path : dirStream) < temp = Paths.get(path.toString(), "jre", "bin", "javaw.exe"); if (Files.exists(temp)) < pathToJavaw = temp; // Don't "break", in order to find the latest JDK version >> if (pathToJavaw != null) < return pathToJavaw.toString(); >> catch (Exception ignored) <> > return "javaw.exe"; // Let just hope it is in the path :) >