我刚刚在单独的驱动器上完成了 BlueJ 和 JDK 1.8 的全新安装,以重现您的问题。我创建了一个指向 JDK 的符号链接,并将其放在 JAVA_HOME 和 PATH 中(根据您使用的 C:\ 语法,我猜您是在 Windows 上,所以我在 Windows 8.1 上进行了测试)。
我也发现BlueJ在选择运行时使用的JDK时忽略了环境变量的设置。我可以使用配套程序 Select BlueJ VM 更改 JDK,但无法在此处输入符号链接(我相信在早期版本中,更改 VM 是开始菜单上的设置,而不是单独的程序)。
总结:
- BlueJ 和 Java 8 的兼容性不是问题
- 不是符号链接的问题
- 至少对于 Windows,这是由于 BlueJ 确定和存储它使用的 JDK 的方式(这两个操作都通过注册表)。
- 如果需要,您可以手动将注册表项更改为符号链接(请参阅下面的详细信息),但这是一个额外的安装步骤。
详细说明
我发现 BlueJ 将它使用的 JDK 的路径存储在以下注册表项中
HKEY_CURRENT_USER\Software\BlueJ\BlueJ\3.1.5\CurrentVM
请注意,根目录可能是HKEY_USERS 或HKEY_LOCAL_MACHINE,具体取决于您是为机器的一个用户还是所有用户安装。
问题是,如果您的系统在运行时或在第一次运行 BlueJ 或使用 Select BlueJ VM 时只有一个可用的 VM,则此键会自动设置在以后的任何时间进行程序。那里提供给您的选项是启动器可以在那时(通过注册表)在您的系统上检测到的 JDK。一旦设置了该值,它就不会在运行时动态更改以反映JAVA_HOME。即使使用选项中的“浏览”选项,我也无法通过 GUI 将符号链接设置为 JDK 位置。
您可以但是,手动将该注册表项的值(例如通过regedit)更改为您的符号链接值(测试和验证OK - 可能需要管理员权限)。
我查看了the source code 以确定CurrentVM 的设置方式。
经过相当短的搜索(感谢 BlueJ 开发人员的良好命名),我最终发现用于启动 BlueJ 的实际代码是 \package\winlaunch\bjlaunch.cc (source file mercurial link here) 中的 C++ 文件。
这只是检查注册表项的值,如果它不存在,则调用 findRegistryVMs(),它会检查注册表(NOT 环境变量) 获取可用的虚拟机并将其提供给用户。因此,似乎没有办法让 BlueJ 在不手动编辑注册表的情况下使用来自 JAVA_HOME 的值。
注意如果您手动将此键值更改为符号链接,您可以更改符号链接链接到的位置,并且(通过重新启动)BlueJ 将使用符号链接链接到的任何 JDK。再次在 Windows 8.1 上测试和验证
注意2 起初,事情看起来很乐观:在Installer.java 中有一个名为findJavaPath() 的方法首先检查
String javaHome = System.getProperty("java.home");
如果这不起作用,请先进行一些猜测。所以它看起来应该尊重JAVA_HOME 在安装时的值。 但是,它似乎只使用它来检查是否有可用的兼容 (1.6+) 版本的 Java。