为什么 BlueJ 不能考虑我的 Java Home 而 Eclipse 可以

Why can't BlueJ take into account my Java Home whereas Eclipse can

出于可移植性原因,我想手动安装 BlueJ。我已经设置 Java_Home 并将 Java bin 目录添加到路径环境变量。我在 c:\java 上使用符号链接,它指向 sd 卡上的 d:\java。

为什么 BlueJ 不考​​虑它们仍然假装它无法检测到 jdk。

更新:Eclipse 没问题,那么 BlueJ 和 Jdk 1.8 有什么特别之处吗?

我刚刚在不同的驱动器上全新安装了 BlueJ 和 JDK 1.8,以重现您的问题。我创建了一个指向 JDK 的符号链接,并将其放在 JAVA_HOMEPATH 中(根据您对 C:\ 语法的使用,我猜您使用的是 Windows,所以我在 Windows 8.1).

上测试过

我也发现在 运行ning 时,BlueJ 在选择 JDK 时忽略了环境变量的设置。我可以通过使用配套程序 Select BlueJ VM 来更改 JDK,但无法在那里输入符号链接(我相信在早期版本中,更改 VM 是一个设置在开始菜单上,而不是单独的程序)。

总结:

  • 这不是 BlueJ 和 Java 8 兼容性的问题
  • 不是符号链接的问题
  • 至少对于 Windows,这是由于 BlueJ 确定和存储它使用的 JDK 的方式(这两个操作都通过注册表)。
  • 如果需要,您可以手动将注册表项更改为您的符号链接(请参阅下面的详细信息),但这是一个额外的安装步骤。

详细

我发现 BlueJ 将该路径存储到它在以下注册表项中使用的 JDK

HKEY_CURRENT_USER\Software\BlueJ\BlueJ.1.5\CurrentVM

请注意,root 可以是 HKEY_USERSHKEY_LOCAL_MACHINE,具体取决于您是为机器的一个用户还是所有用户安装的。

问题是,如果您的系统在 运行 时或 BlueJ[=76= 的第一个 运行 时只有一个 VM 可用,则此键会自动设置] 或稍后随时使用 Select BlueJ VM 程序。提供给您的选项是 JDK,启动器当时可以在您的系统上检测到(通过注册表)。一旦设置了该值,它就不会在 运行 时间动态更改以反映 JAVA_HOME。即使使用选项中的“浏览”选项,我也无法通过 GUI 将符号链接设置为 JDK 位置。

可以 ,但是,手动将该注册表项的值(例如通过 regedit)更改为您的符号链接值(测试和验证正常 - 可能需要管理员权限)。


我查看了 the source code 以确定 CurrentVM 的设置方式。

经过相当短的拖网(感谢 BlueJ 开发人员的良好命名),我最终发现用于启动 BlueJ 的实际代码是 \package\winlaunch\bjlaunch.cc (source file mercurial link here) 中的 C++ 文件。

这只是检查注册表项的值,如果不存在,则调用 findRegistryVMs(),检查注册表(NOT 环境变量)用于可用的虚拟机并将其提供给用户。因此,似乎没有办法让 BlueJ 在不手动编辑注册表的情况下使用 JAVA_HOME 中的值。


N.B. 如果您手动将此键值更改为符号链接,则可以更改符号链接链接到的位置,并且(重新启动)BlueJ 将使用JDK 链接到的符号链接。同样,在 Windows 8.1

上进行了测试和验证

N.B。 2 起初,事情看起来很乐观:在 Installer.java 中有一个名为 findJavaPath() 的方法首先检查

String javaHome = System.getProperty("java.home");

如果那行不通,再进行一些猜测。所以它看起来应该尊重 JAVA_HOME 在安装时 的值。 但是,它似乎只用它来检查是否有 Java 的兼容(1.6+)版本可用。