在Windows XP上安装JDK8 – advapi32.dll错误

我下载了JDK8 build b121,并尝试安装时出现以下错误:

过程入口点RegDeleteKeyExA不能位于dynamic链接库ADVAPI32.dll中

操作系统是Windows XP,版本2002 Service Pack 3,32位。

发生这种情况是因为Oracle放弃了对Windows XP的支持(顺便说一句,安装程序没有在ADVAPI32.DLL使用RegDeleteKeyExA ),如http://mail.openjdk.java.net/pipermail/openjfx-dev/ 2013年7月/ 009005.html 。 然而,虽然官方对XP的支持已经结束,但Java二进制文件仍然(至less在Java 8u20 EA b05中)与XP兼容 – 只有安装程序不是…

正因为如此,解决scheme其实很简单:

  1. 得到7-zip(或任何其他质量的存档),手动解压分发.exe,它有一个.zip文件( tools.zip ),解压缩,

  2. 使用unpack200的unpack200将所有的.pack文件解压缩为.jar文件(旧的解包将无法正常工作); JAVA_HOME环境variables应该设置为你的Java解压根,例如“C:\ Program Files \ Java \ jdk8” – 你可以通过例如

     SET JAVA_HOME=C:\Program Files\Java\jdk8 
    • 使用单个命令解压缩所有文件(在batch file中):

       FOR /R %%f IN (*.pack) DO "%JAVA_HOME%\bin\unpack200.exe" -r -v "%%f" "%%~pf%%~nf.jar" 
    • 使用单个命令解压所有文件(JRE根目录下的命令行):

       FOR /R %f IN (*.pack) DO "bin\unpack200.exe" -r -v "%f" "%~pf%~nf.jar" 
    • 通过手动查找文件并逐个解压缩来解压缩:

       %JAVA_HOME%\bin\unpack200 -r packname.pack packname.jar 

    packname是例如rt

  3. 将你想使用的工具(例如Netbeans)指向%JAVA_HOME% ,你就可以走了。

注意:您可能不应该这样做,只是在您的Web浏览器中使用Java 8或出于任何类似的原因(安装JRE 8时想到); 主要的Java版本早期更新的安全漏洞(介意我)是传说中的 ,并且在XP上没有对XP和Java 8的实际支持只会使事情变得更糟。 更不用说你通常不需要在你的浏览器中使用Java(参见http://nakedsecurity.sophos.com/2013/01/15/disable-java-browsers-homeland-security/) – 这个话题已经在许多页面,只是Google它,如果你需要进一步的信息)。 在任何情况下,AFAIK将这个过程应用到JRE所需的唯一东西是将上面指定的一些path从\ bin \更改为\ lib \(安装程序目录树中的文件放置有些不同) – 但我强烈build议反对这样做。

另请参阅: 如何将最新的JRE / JDK作为zip文件而不是EXE或MSI安装程序获取? , JRE 1.7返回:java / lang / NoClassDefFoundError:java / lang / Object

对于那些不害怕使用hex编辑器(例如XVI32)的用户来说,也有一个替代的解决scheme[感谢Trevor for this]:在解压缩后的 1个安装程序可执行文件( jdk-8uXX-windows-i586.exe )只需用RegDeleteKeyA (传统API名称)replace所有出现的RegDeleteKeyExA (在“new” ADVAPI32.DLLfind的API的名称),然后用两个hex00(用于保留填充/分段边界)。 安装程序会抱怨不支持的Windows版本,但仍然工作。

作为参考,原始的hexstring将是:

 52 65 67 44 65 6C 65 74 65 4B 65 79 45 78 41 

取而代之

 52 65 67 44 65 6C 65 74 65 4B 65 79 41 00 00 

注意:此过程适用于脱机(独立)和在线(下载程序)包。

1:一些更新的安装程序版本与UPX打包在一起 – 你需要先解压它们,否则你根本无法find所需的hexstring

甲骨文已经宣布修复Windows XP安装错误


自从Oracle决定修复Windows XP安装以来,我添加了这个答案。 从2014年10月15日发布的JRE 8u25发布以来,该错误已被修复,从而阻止了Windows XP的安装。

但是,这并不意味着Oracle正在继续支持Windows XP。 他们不保证当前和未来版本的JRE8与Windows XP兼容。 看起来这是一个风险自负的运行。

请看这里的Oracle博客文章。

您可以从Oracle下载站点获得JRE 8u25 (或最新版本)。

使用XP上的JRE 8还有另一种方法 – 使用MSI部署软件包。

  • 在支持OS的PC上安装JRE 8 x86
  • 将c:\ Users [USER] \ AppData \ LocalLow \ Sun \ Java \ jre1.8.0 \ jre1.8.0.msi和Data1.cab复制到XP PC并运行jre1.8.0.msi

或(无声的方式,可用于batch file等)

 for %%I in ("*.msi") do if exist "%%I" msiexec.exe /i %%I /qn EULA=0 SKIPLICENSE=1 PROG=0 ENDDIALOG=0 

在Win XP上安装Java 8的“未来保障”方法

  1. 获得一个hex编辑器。 名为Hxd的程序将为此工作。
  2. 下载名为jre-8u11-windows-i586-iftw.exe的Oracle Java 8在线安装程序(它是两个Windows可执行文件中最小的一个,运行它会每次下载最新的Java版本)。

Java的最新版本可以从这个页面中获得,没有直接的联系。

Java SE运行时环境8下载

http://www.oracle.com/technetwork/java/javase/downloads/jre8-downloads-2133155.html

  1. 使用jre-8u11-windows-i586-iftw.exe打开jre-8u11-windows-i586-iftw.exe (或更新的可执行文件)

  2. search并replace(以hex模式) RegDeleteKeyExA的两次出现,并用RegDeleteKeyA (旧的API名称)replace它们。 请记住使用hex模式:

更换

52 65 67 44 65 6C 65 74 65 4B 65 79 45 78 41

52 65 67 44 65 6C 65 74 65 4B 65 79 41 00 00

  1. 保存文件改名为jre-8u11-windows-i586-iftw__Patched.exe

  2. 运行补丁程序,如果你正确的补丁,它会抱怨你的操作系统太旧了。

  3. closuresPopup并安装Java 8.在线安装程序将在每次运行Oracle时从Oracle下载最新版本的Java。

  4. 点击桌面上的[开始]button,右键单击“我的电脑”,然后左键单击“属性”。

  5. 点击“高级”选项卡,然后点击“环境variables”button。 你不需要PATH的字母“java”(java的副本安装在PATH中的C:\WINDOWS\system32中)。 清理PATH所有垃圾,包括对java的引用(但显然,不要从PATHvariables中删除C:\WINDOWS\system32目录)。

将名为JAVA_HOME的环境variables(如有必要,创build它)设置为

 JAVA_HOME=C:\Program Files\Java\jre8 
  1. 现在一切都应该正确安装。 您可能需要重新启动,但在执行之前请检查步骤11。

  2. 如果Java不启动(使用“java -version”进行testing),请查找* .pack文件,如下所示:

cd“c:\ Program Files \ java \”

dir / s * .pack

您可以通过以下两种方法之一来解压缩它们:

  • 使用单个命令解压缩所有文件(在batch file中):

FOR /R %%f IN (*.pack) DO "%JAVA_HOME%\bin\unpack200.exe" -r -v "%%f" "%%~pf%%~nf.jar"

  • 使用单个命令解压所有文件(JRE根目录下的命令行):

FOR /R %f IN (*.pack) DO "%JAVA_HOME%\bin\unpack200.exe" -r -v "%f" "%~pf%~nf.jar"

将来,当您想要更新Java时,只需重新运行修补程序,它将从Oracle获取最新的Java直接副本并进行安装。 无需重新打补丁或设置任何环境variables(直到您过去版本8,或希望使用JDK而不是JRE)。

这是一个“修复 – 一旦它应该工作一段时间”解决scheme。