【问题标题】:How to prevent that java.exe is installed in Windows' system32?如何防止 java.exe 安装在 Windows 的 system32 中?
【发布时间】:2011-11-22 07:45:28
【问题描述】:

有没有办法防止 Java 安装例程(例如 jdk-7u1-windows-i586.exe)将 java.exe 复制到 C:\Windows\system32 目录中?

我必须在客户的笔记本电脑上安装我的软件,我不想破坏已经安装在机器上的其他 Java 应用程序。换句话说,我想安装一个private JRE,它只被我的软件使用。

现在,我将已安装的 JRE 从我的计算机复制到客户端的计算机上。

【问题讨论】:

  • 我认为 Java 安装程序总是将自己安装到一个独立的目录中。不?那我认为只需将安装目录复制到另一台机器,就可以以 xcopy 方式安装 Java。
  • @selbie:它可以以这种方式安装,但这不是安装程序默认执行的操作:它确实将 JRE 安装到自己的目录,但java.exe复制到system32目录。
  • @selbie:安装程序还会创建一些注册表项。我没有找到一个简单的适用于 Windows 的 zip 存档 可以用来代替安装程序。
  • 您可以创建一个安装程序,将私有 JRE(整个 JRE 文件夹的副本而不是 setup.exe)捆绑到您的应用程序的目录中,而不是默认的 Java 安装路径,并要求您的 Java 应用程序的 Java 启动器请参阅此私有 JRE。 Launch4J 支持这种启动设置。如果有,它不会干扰用户安装的 JRE。
  • 当有一个专门用于指示 Java 位置的 JAVA_HOME 环境变量时,您真的想知道为什么要搞乱 System32 文件夹。惊人的

标签: windows installation jvm java


【解决方案1】:

我昨天发现 Windows 上的 Java 版本存在问题,您知道这些天保持 Java 最新是至关重要的,尤其是位于 Windows 系统中的 Internet Explorer 使用的 JRE32 或syswow64 文件夹。

您可以在 C: 驱动器中搜索 java 并查看它找到的各种可执行文件以确定该情况是否适用于特定系统。

经过一番研究,我发现当 Java updater 运行时,它只会更新安装在 JAVA home 中的文件,通常位于程序文件中,但它不会更新位于 Windows 系统文件夹中的文件。因此,由于系统文件夹位于默认系统 PATH 中,Internet Explorer 的使用继续使用旧版本的 JAVA 文件(java.exe、javaw.exe、javaws.exe)

解决方案使用控制面板卸载java卸载程序功能,下载最新版本并重新安装

干杯! 费尔南多

【讨论】:

  • 我认为情况并非如此。 Windows System32 目录仅包含 java.exe 和其他 java 启动器。实际的 VM (jvm.dll) 和支持的库/类位于由 Java 更新程序更新的 JDK/JRE 目录中。
【解决方案2】:

我最近升级到 java 8 并发现了这个问题,因为 system32 下的 java 版本仍然是 java 7。它甚至会阻止你运行版本,因为它抱怨注册表项

U:\>java -version
Error: Registry key 'Software\JavaSoft\Java 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.

执行以下操作将我指向了罪魁祸首:

U:\>where java
C:\Windows\System32\java.exe
C:\Program Files\Java\jdk1.8.0_45\bin\java.exe

我通过删除system32下的java“解决”了这个问题!我不确定这会产生什么后果。

【讨论】:

  • 您避免的问题可能比这样做产生的问题多!最好让程序崩溃告诉您它找不到 java,而不是使用已弃用的 java 版本运行而您甚至不知道它。
  • 我们还应该删除哪些其他内容(或者移至临时文件夹)?至少 java.exe、javaw.exe、javaws.exe、JavaScriptCollectionAgent.dll 对吧?该 dll 似乎正在使用中,因此无法移动。还有其他人吗?
  • @snaran 不知道对不起,这在当时为我完成了工作
  • 已经 3 年了。有没有发现什么问题?
  • @Lucas 我没有一直使用 java 但我不记得有任何问题
【解决方案3】:

您只需提供要在软件上使用的 JRE,然后:

  • 在运行应用程序之前设置 JAVA_HOME 变量
  • 指向正确的 java.exe 文件(例如 ..\jre1.5.0_22\bin\java <your_java_main>

例如,这可以在 *.bat 文件中完成。

运行您创建的 *.bat 文件后,所有其他 java 版本都将被忽略,并且该 PC 上已安装或将要安装的版本无关紧要。

【讨论】:

  • 这只会确保 我的应用程序 使用正确的 JRE。如果没有设置 JAVA_HOME 并依赖于使用通常位于 system32 中的默认 JRE,则已安装在机器上的其他应用程序可能会中断。但是如果我安装一个新的 JRE(可能是 beta 版本),java.exe 会被复制到 system32 中,因此其他 Java 应用程序可能会使用 beta JRE。这就是问题所在。
  • 如果我没记错的话,JAVA_HOME环境变量只有在使用JDK时才需要,JRE不需要。 JRE 自动使用系统属性java.home 从 Windows 注册表中获取 Java 默认路径
  • 使用SET 完成的绑定更改仅在 cmd 会话期间持续,因此不会影响其他应用程序。您可以通过在批处理文件末尾调用 exit 来确保用户不会尝试从同一 cmd 会话启动任何其他应用程序。
  • 您可以使用“setx”来持久化对环境变量的更改。需要注意的几点:它不会像“set”那样改变当前会话中的环境。同样在我的系统上,如果没有管理员权限,我无法使用它更改整个路径 - 所以 system32 总是在路径中排在第一位。
【解决方案4】:

我发现最新的 JDK 仍然没有针对注册表编写正确的代码。 问题是如果计算机没有 JRE,JDK 不会在注册表中正确注册 JRE。

对于那些安装 JDK 1.7u72 的用户,只需添加 Software\JavaSoft\Java Runtime Environment,如错误消息所示。并添加一个值为 1.7 的 CurrentVersion 字符串条目。 然后添加 Software\JavaSoft\Java Runtime Environment\1.7 并放置一个值为“C:\Program Files\Java\jre7”的 JavaHome 字符串条目。 JRE 将正常运行。 怪Oracle,如果你使用Registry,那就写正确的代码,否则不要使用Registry!

【讨论】:

    【解决方案5】:

    您所要做的就是转到控制面板-> 程序卸载程序。卸载旧的 java 更新并保持最新的 java 更新和 java 开发工具包更新。您最新的 Java 更新和 Java 开发工具包更新应该具有相同的编号。

    【讨论】:

    • 需要 1.6 和 1.8
    【解决方案6】:

    Windows 10 解决方案

    1. 在控制台 (CMD) 中使用 java -version 检查 Java 版本
    2. 使用where java 签入控制台 (CMD),Java 路径已登记。
    • 如果您在其输出中显示“C:\Windows\System32”,那么您将无法访问所需的 Java 版本所在的 %JAVA_HOME%。
    • 意思是,你需要去掉“C:\Windows\System32”中的“java.exe”。
    1. 只需卸载软件中的 JRE(“程序和功能”) 提示:请记住,不是JDK,在我的例子中是“Java SE Development Kit 8 Update(64-bit)”),而是JRE。

    【讨论】:

      【解决方案7】:

      我会尝试的一种方法是在 System32 文件夹中创建一个名为 java.exe 的只写空文件。

      【讨论】:

      • 这不是一个选项。如果 system32 中已经有一个“真正的”java.exe 怎么办?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 2012-06-19
      • 2018-12-28
      • 1970-01-01
      • 2019-06-25
      • 2015-02-09
      相关资源
      最近更新 更多