Eclipse - нет Java (JRE) / (JDK) ... нет виртуальной машины - PullRequest
274 голосов
/ 08 января 2010

Я пытаюсь заставить Eclipse v3.5 (Galileo) перезапуститься на моем компьютере - раньше я запускал его без проблем, но сейчас Я получаю эту ошибку:

Для запуска Eclipse должен быть доступен Java Runtime Environment (JRE) или Java Development Kit (JDK). Виртуальная машина Java не была найдена после поиска в следующих местах: C: \ затмение \ JRE \ javaw.exe javaw.exe в вашем текущем PATH

Я только что сделал новую установку JDK и SDK.

У меня Windows 7 (x64).

Что с этим? Как мне это исправить?

Я не могу запустить ни один из ipconfig / tracert / или ping.

Ответы [ 33 ]

1 голос
/ 26 декабря 2017

Я тоже столкнулся с этой проблемой. Мой случай выглядит следующим образом:

enter image description here enter image description here

В тексте:

HKEY_CURRENT_USER\Environment
    Path    REG_SZ    %JAVA_HOME%\bin;C:\ProgramFiles\nodejs

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
    JAVA_HOME    REG_SZ    C:\ProgramFiles\Java\jdk
    Path    REG_EXPAND_SZ    C:\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\
WindowsPowerShell\v1.0\;C:\Program Files\Intel\DMIX;c:\Program Files (x86)\Microsoft SQL Server\90\Tools\binn\;C:\Progra
m Files (x86)\Perforce;C:\ProgramFiles\010 Editor;C:\Program Files\Microsoft SQL Server\130\Tools\Binn\;C:\ProgramFiles\
Git\cmd;C:\Program Files (x86)\Skype\Phone\

C:\Users\ssfang> echo %^JAVA_HOME% = "%^JAVA_HOME%" = %%JAVA_HOME%% %JAVA_HOME%
%JAVA_HOME% = "%^JAVA_HOME%" = %C:\ProgramFiles\Java\jdk% C:\ProgramFiles\Java\jdk

Я обнаружил, что их типы значений реестра Path различны, поэтому я проверил, допустим ли путь, с помощью следующей команды:

C:\Users\ssfang> where node java
C:\ProgramFiles\nodejs\node.exe
INFO: Could not find "java".

В результате я сбрасываю локальную (текущую пользовательскую) среду с помощью следующих команд ( Setx ):

C:\Users\ssfang> setx PATH %^JAVA_HOME%\bin;"C:\ProgramFiles\nodejs"

SUCCESS: Specified value was saved.

C:\Users\ssfang> reg query HKEY_CURRENT_USER\Environment /v Path

HKEY_CURRENT_USER\Environment
    Path    REG_EXPAND_SZ    %JAVA_HOME%\bin;C:\ProgramFiles\nodejs

C:\Users\ssfang> where node java
C:\ProgramFiles\nodejs\node.exe
INFO: Could not find "java".

C:\Users\ssfang>echo %PATH%
C:\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Fi
les\Intel\DMIX;c:\Program Files (x86)\Microsoft SQL Server\90\Tools\binn\;C:\Program Files (x86)\Perforce;C:\ProgramFile
s\010 Editor;C:\Program Files\Microsoft SQL Server\130\Tools\Binn\;C:\ProgramFiles\Git\cmd;C:\Program Files (x86)\Skype\
Phone\;%JAVA_HOME%\bin;C:\ProgramFiles\nodejs

Но в текущем процессе он не может распространить эти изменения на другие запущенные процессы.

Однако, если вы непосредственно изменяете переменные среды пользователя в редакторе реестра,

эти изменения переменных среды делают не приводит к немедленным изменениям. Например, если вы начнете другой Командная строка после внесения изменений переменных среды будет отражать предыдущие (не текущие) значения. Изменения не действуют до тех пор, пока вы не выйдете, а затем снова войдите в систему.

Чтобы изменения вступили в силу, не выходя из системы, передайте WM_SETTINGCHANGE сообщение для всех окон в системе, так что любой заинтересованные приложения (такие как Windows Explorer, Program Manager, Диспетчер задач, Панель управления и т. Д.) Может выполнить обновление.

Подробнее см. Как распространить переменные среды в системе

Здесь я даю сценарий powershell, чтобы сделать это:

# powershell -ExecutionPolicy ByPass -File
# Standard, inline approach: (i.e. behaviour you'd get when using & in Linux)
# START /B CMD /C CALL "foo.bat" [args [...]]
# powershell -ExecutionPolicy ByPass -WindowStyle Hidden -File myScript.ps1 


<#
Add-Type @'

public class CSharp
{
    public static void Method(object[] first, object[] second)
    {
        System.Console.WriteLine("Hello world");
    }
}
'@
$a = 1..4;
[string[]]$b = "a","b","c","d";
[CSharp]::Method($a, $b);
#>


<#

#http://stackoverflow.com/questions/16552801/how-do-i-conditionally-add-a-class-with-add-type-typedefinition-if-it-isnt-add

#Problem Add-Type : Cannot add type. The type name 'PInvoke.User32' already exists.

if (-not ("MyClass" -as [type])) {
    add-type @"
    public class MyClass { }
"@
}


p.s. there's no Remove-Type; see this answer for more on how to best work around this limitation:
http://stackoverflow.com/questions/3369662/can-you-remove-an-add-ed-type-in-powershell-again

I think it will be wanted when debugging.
It is much simpler to close a tab in Console and open new one in PowerShell_ISE.exe or close PowerShell.exe.

Or

Start-Job -ScriptBlock {
    param([uri]$url,$OutputDir)
    # download and save pages
    Invoke-RestMethod $url | Out-File "$OutputDir\$($url.Segments[-1])" -Force
} -ArgumentList $link,$OutputDir

#>
if (-not ([System.Management.Automation.PSTypeName]'PInvoke.Program').Type)
{
    $sig=@"
using System;
using System.Runtime.InteropServices;
using System.Text;
using System.Collections.Generic;

// The global namespace is the "root" namespace: global::system will always refer to the .NET Framework namespace System.

///P/Invoke (Platform Invoke)
namespace PInvoke
{
    public static class User32
    {
        /// http://www.pinvoke.net/default.aspx/Constants/HWND.html
        // public const IntPtr HWND_BROADCAST = new IntPtr(0xffff);
        /// https://msdn.microsoft.com/en-us/library/windows/desktop/ms725497(v=vs.85).aspx
        /// http://www.pinvoke.net/default.aspx/Constants/WM.html
        public const UInt32 WM_SETTINGCHANGE = 0x001A;

        // SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,    (LPARAM) "Environment", SMTO_ABORTIFHUNG,    5000, &dwReturnValue);

        /// https://msdn.microsoft.com/en-us/library/windows/desktop/ms644952(v=vs.85).aspx
        /// If the function succeeds, the return value is nonzero. 
        [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "SendMessageTimeout", SetLastError = true)]
        public static extern uint SendMessageTimeout(IntPtr hWnd, uint Msg, int wParam, string lParam, SendMessageTimeoutFlags fuFlags, uint uTimeout, out int lpdwResult);
    }

    [Flags]
    public enum SendMessageTimeoutFlags : uint
    {
        SMTO_NORMAL = 0x0,
        SMTO_BLOCK = 0x1,
        SMTO_ABORTIFHUNG = 0x2,
        SMTO_NOTIMEOUTIFNOTHUNG = 0x8,
        SMTO_ERRORONEXIT = 0x20
    }

    public class Program
    {
        public static void Main(string[] args)
        {
            //int innerPinvokeResult;
            //uint pinvokeResult = User32.SendMessageTimeout(User32.HWND_BROADCAST, User32.WM_SETTINGCHANGE, 0, "Environment", SendMessageTimeoutFlags.SMTO_NORMAL, 1000, out innerPinvokeResult);
            Console.WriteLine("Over!!!!!!!!!!!!!!!!!!!!!!!!!");
        }
    }
}
"@

    Add-Type -TypeDefinition $sig
}


## [PInvoke.Program]::Main([IntPtr]::Zero);

$innerPinvokeResult=[int]0
[PInvoke.User32]::SendMessageTimeout([IntPtr]0xffff, [PInvoke.User32]::WM_SETTINGCHANGE, 0, "Environment", [PInvoke.SendMessageTimeoutFlags]::SMTO_NORMAL, 1000, [ref]$innerPinvokeResult);

Setx setx [/ s [/ u [] [/ p []]]] [/ m]

/m Specifies to set the variable in the system environment. The default setting is the local environment
1 голос
/ 08 января 2010

Попробуйте установить JAVA_HOME в правильную папку. Google для установки переменных среды в Windows.

1 голос
/ 18 ноября 2014

Что ж, этот ответ для тех, кто попробовал все остальные, все еще не повезло, может быть, это будет Студия Android или Eclipse Обычно я делаю это, когда все остальное терпит неудачу.

  1. Найдите папку Android SDK и откройте файл android.bat в текстовом редакторе
  2. некоторые команды, подобные этим, вы найдете в начале файла,

set java_exe=

call lib\find_java.bat

if not defined java_exe goto :EOF

  1. Измените их на

    set java_exe= <<strong> путь к файлу java.exe (можно найти в папке jdk folder / bin) >

  2. найти строки

rem Set SWT.Jar path based on current architecture (x86 or x86_64) for /f "delims=" %%a in ('"%java_exe%" -jar lib\archquery.jar') do set swt_path=lib\%%a

  1. Замените его на set swt_path= <<strong> путь к соответствующему файлу swt.jar, для x86 он находится в sdk \ tools \ lib \ x86, а для x64 в sdk \ tools \ lib \ x86_64 >
  2. Сохраните и закройте файл, и теперь все готово.
1 голос
/ 22 октября 2014

Прежде всего спасибо YouYou за его решение! Я пытался ответить YouYou (https://stackoverflow.com/a/14464653/801919). Изначально он не работал для меня. Ниже приведены шаги, которые мне нужно было предпринять, чтобы заставить его работать:

  1. Изначально на моей новой машине не было Java. Итак, мне пришлось установить это (скачано с: http://java.com/en/download/manual.jsp).
  2. Я использую 64-битную ОС. Но во время загрузки я получил сообщение, которое может помочь мне выбрать версию Java для загрузки: Choose the 32-bit download to use with a 32-bit browser. Следовательно, я скачал 32-битную версию.
  3. Затем я следовал процедуре, упомянутой в https://stackoverflow.com/a/14464653/801919,, в надежде получить решение.
  4. У меня есть другая ошибка: Java was started but returned exit code=13
  5. Затем я установил 64-битную версию Java.
  6. Скопировано javaw.exe из этой версии.

... И Eclipse начал работать !!! Yaay!

0 голосов
/ 29 февраля 2012

У меня была такая же проблема.Самый простой способ исправить это - установить JRE и eclipse как x86 или x64.Когда их битовый тип не совпадал, затмение не могло его найти.Так что, если для вас не составит большого труда удалить и переустановить, чтобы они соответствовали друг другу, я бы сделал это.

Я закончил установку: Java Runtime Environment 1.7.0.3 (64-bit) иEclipse Indigo (3.7) (64-разрядная версия)

Тогда все просто работает.

0 голосов
/ 30 августа 2016

Сначала перейдите на компьютер, затем в свойства, затем в расширенные настройки системы, затем в расширенный

(3-е меню)

и затем нажмите кнопку переменных среды внизу.

К пути в переменных среды вы добавляете:

C:\Program Files\Java\jdk1.8.0_102\bin\;C:\Program Files\Java\jdk1.8.0_102\lib\; 

и ошибка исчезнет. Это самый лучший.

Другой способ - скопировать папку jre (C:\Program Files\Java\jre1.8.0_102) в

E:\eclipse-jee-indigo-SR2-win32\eclipse

папка. Тогда ошибка исчезнет.

0 голосов
/ 09 января 2010

JDK не устанавливает JVM в путь по умолчанию.

Если вам не нужны внешние инструменты для работы как ant, для запуска Eclipse достаточно не-JDK. Самый простой способ установить такую ​​JVM - перейти на http://java.com и позволить ему установить то, что он хочет установить.

Затем дважды щелкните двоичный файл Eclipse снова.

0 голосов
/ 11 августа 2015

Одной из проблем является конфликт между версией Eclipse-64bit и нашей установкой Java, являющейся 32-битной версией. Это нелегко решить, потому что на странице установки Java нет опции для 64-битной версии - она ​​предполагает 32-битную версию, загружает и устанавливает 32-битную версию. Чтобы решить эту проблему, выполните следующие действия:

  1. Загрузите 64-битную версию, перейдя по ссылке Java SE Runtime Environment 7 (по этой ссылке можно скачать 64-битную версию Java) Загрузите и установите это.
  2. Теперь попытка установить Eclipse все равно выдаст ошибку. Итак, мы копируем папку jre7 из C:/program files/Java/ и копируем ее в нашу папку установки Eclipse.
  3. Теперь мы переименуем его в jre.

Установить Eclipse.

- launcher.appendVmargs -vm C: \ Program Files \ Java \ jdk1.7.0_79 \ jre \ bin \ javaw.exe -vmargs

0 голосов
/ 09 января 2010

установить переменную JAVA_HOME и ad JAVA_HOME / bin в переменную пути взвода.

0 голосов
/ 18 марта 2015

Когда я скопировал только javaw, произошла вторая ошибка, нет файла java.dll, когда я тоже его скопировал, eclipse не запустился, я сделал то, что скопировал всю папку jdk в папку eclipse и переименовал id к Jre. Проблема решена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...