Eclipse - 没有Java(JRE)/(JDK)...没有虚拟机

286

我正在尝试让Eclipse v3.5(Galileo)在我的计算机上重新运行 - 我以前已经运行过它,没有任何问题,但是现在我一直收到以下错误:

必须提供Java Runtime Environment(JRE)或Java Development kit(JDK)才能运行Eclipse。在搜索以下位置后未找到Java虚拟机: C:\ eclipse \ jre \ javaw.exe 当前路径中的javaw.exe

我刚刚安装了JDK和SDK。

我使用的操作系统是Windows 7(x64)。

怎么回事?我该如何解决?

我无法运行任何ipconfig / tracert /或ping命令。


3
“Java Runtime Environment”是JRE,不是SDK。 - user85421
1
安装JRE - 这将在您的路径中提供javaw.exe。 JDK没有。 - Thorbjørn Ravn Andersen
12
@Carlos,每个JDK都带有一个私有的JRE。 - Thorbjørn Ravn Andersen
3
@Thorbjørn: 那有什么意义呢?我知道这一点,也知道JDK还提供了一个公共 JRE。我写过“Java Runtime Environment不是SDK”,但你需要阅读原帖(在1月11日编辑之前)才能理解为什么我写了它:“一个Java Runtime Environment (SDK)或…” - user85421
11
如果您最近在安装Eclipse之后安装了JDK,并且安装位置与之前不同,那么您可能会遇到此问题。这是因为当第一次设置Eclipse时,eclipse.ini文件中已经硬编码了JDK路径。只需在eclipse.ini中更改正确的JDK路径即可解决此错误。 - Rajaraman Subramanian
显示剩余3条评论
35个回答

6
在您的eclipse.ini文件中,您需要更新VM路径,使其指向与您机器上安装的javaw.exe相同的位置。

5
编辑我的eclipse.ini文件来更新最新的JDK。之前我使用的是jdk1.7.0_09,现在更新到了jdk1.7.0_80,但是 Eclipse 报错了。
“必须有Java Runtime Environment(JRE)或Java Development Kit(JDK)才能运行Eclipse。在搜索以下位置后,未找到Java虚拟机:C:/Program Files/Java/jdk1.7.0_09/bin/javaw”
在更新了eclipse.ini文件之后,将以下内容:
-vm
C:/Program Files/Java/jdk1.7.0_09/bin/javaw

为了

-vm
C:/Program Files/Java/jdk1.7.0_80/bin/javaw

Eclipse运行正常。


1
这是对我起作用的解决方案 - 谢谢Lucky。Eclipse会加载ini文件中引用的JRE,因此建议中所提到的它查看env PATH是不正确的。 - Steve Mayne

3

3
如果在将C:\Program Files\Java\jdk1.8.0_92\bin添加到环境变量的PATH变量后,Eclipse仍然给出相同的错误,请检查Eclipse文件夹中找到的配置设置文件,您必须看到与C:\program Files中相同的jdk路径。
请查看以下截图:enter image description here 希望对您有所帮助。

2
当我遇到这样的问题时,我的情况是安装了x64 JDK + JRE和x86 Eclipse。因此,安装x86 JDK + JRE解决了我的问题 :) 我还在eclipse文件夹中创建了“jre”文件夹,并将本地路径“C:\Program Files (x86)\Java\jre7”中的“bin”文件夹复制到“..\eclipse\jre\”中。

2
  • 64位操作系统--> 您需要:64位Java和64位Eclipse
  • 32位操作系统--> 您需要:32位Java和32位Eclipse

如果您在64位计算机上使用默认更新方式更新Java版本(并且您有32位浏览器),Java将安装32位版本。您应该查找64位Java版本并安装它。


1

我也遇到了这个问题。我的情况如下:

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资源管理器、程序管理器、任务管理器、控制面板等)可以执行更新操作。

详见如何将环境变量传播到系统

这里,我提供了一个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);
#>


<#

#https://dev59.com/aGQn5IYBdhLWcg3wzZ36

#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:
https://dev59.com/d3A75IYBdhLWcg3wS3FA

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]

这是关于编程的内容,保留了HTML格式,不进行解释。
/m Specifies to set the variable in the system environment. The default setting is the local environment

1

首先感谢YouYou提供的解决方案!我尝试了YouYou的回答(https://dev59.com/I3I-5IYBdhLWcg3wEEBV#14464653)。最初,它对我没用。以下是让它工作所需采取的步骤:

  1. 起初,我的新电脑没有安装Java。所以我不得不安装它(从http://java.com/en/download/manual.jsp下载)。
  2. 我正在运行64位操作系统。但是,在下载时,我收到了一条消息,可以帮助我选择要下载的Java版本:选择32位下载以与32位浏览器一起使用。因此,我下载了32位版本。
  3. 然后,我按照https://dev59.com/I3I-5IYBdhLWcg3wEEBV#14464653中提到的步骤进行操作,希望能得到解决方案。
  4. 我遇到了其他错误:Java启动但返回退出代码=13
  5. 然后,我安装了64位版本的Java。
  6. 从那个版本中复制了javaw.exe

……然后Eclipse开始工作了!!!耶!


1

尝试将JAVA_HOME设置为正确的文件夹。在Windows中搜索设置环境变量。


我按照这些说明进行操作: http://wso2.org/project/wsas/java/2.0-beta/docs/setting-java-home.html 但是没有成功。 - Wallter
我不想说...但是你重启了吗? - Topher Fangio
重新启动计算机不是安装Java的必要步骤。 - Thorbjørn Ravn Andersen
1
不需要JAVA_HOME。它使用的是PATH来查找javaw.exe。(JAVA_HOME被一些其他应用程序如ant使用,所以无论如何设置它都不会错) - user85421

1

上周我的一位同事遇到了这个问题。他通过安装x64版本的Eclipse和x64 JDK来解决它。

编辑:在安装必要的插件后,他重用了旧的工作空间,所以这不应该是什么问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接