由于可移植性原因,我想手动安装BlueJ。我已经设置了Java_Home并将Java bin目录添加到路径环境变量中。我在c:\java上使用符号链接(symbolic link),它指向sd卡上的d:\java。
为什么BlueJ仍不假装不考虑它们,却无法检测到jdk。
更新:Eclipse可以,所以BlueJ和Jdk 1.8有一些特定的功能吗?
最佳答案
我刚刚在单独的驱动器上完成了BlueJ和JDK 1.8的全新安装,以复制您的问题。我建立了到JDK的符号链接(symbolic link),并将其放在JAVA_HOME
和PATH
中(根据您对C:\
语法的使用,我猜您在Windows上,因此我在Windows 8.1上进行了测试)。
我也发现,在选择要运行的JDK时,BlueJ忽略了环境变量的设置。我可以通过使用配套程序选择BlueJ VM 来更改JDK,但无法在其中输入符号链接(symbolic link)(我相信在较早的版本中,更改VM是开始菜单上的一项设置,而不是单独的程序)。
总之:
详细地
我发现BlueJ在以下注册表项中存储了它使用的JDK的路径
HKEY_CURRENT_USER\Software\BlueJ\BlueJ\3.1.5\CurrentVM
请注意,根目录可以是HKEY_USERS
或HKEY_LOCAL_MACHINE
,具体取决于您是为机器的一个用户还是所有用户安装的。问题是,如果您的系统在运行时或首次运行 BlueJ 或使用时,您的系统中只有一个VM可用,则此 key 会自动设置,以后再随时选择Select BlueJ VM 程序。此时提供给您的选项是启动器可以通过系统(在注册表中)检测到的JDK。一旦设置了该值,它就不会在运行时动态更改以反射(reflect)
JAVA_HOME
。即使使用选项中的“浏览”选项,我也无法通过GUI将符号链接(symbolic link)设置为JDK位置。您可以,但是,请手动将该注册表项的值(例如,通过
regedit
)更改为您的符号链接(symbolic link)值(经过测试并验证为OK-可能需要管理员权限)。我查看了the source code以确定如何设置
CurrentVM
。经过很短的跟踪(对BlueJ开发人员的良好称赞),我最终得出结论,用于启动BlueJ的实际代码是
\package\winlaunch\bjlaunch.cc
(source file mercurial link here)中的C++文件。这只是检查注册表项的值,如果不存在,则调用
findRegistryVMs()
,这会检查注册表(非环境变量)中可用的VM并将其提供给用户。因此,似乎没有一种方法可以让BlueJ在无需手动注册表编辑的情况下使用JAVA_HOME
中的值。N.B. 如果您确实将此键值手动更改为Symlink,则可以更改符号链接(symbolic link)链接到的位置,并且(重新启动)BlueJ将使用该符号链接(symbolic link)链接到的JDK。再次在Windows 8.1上进行测试和验证
N.B. 2 最初,情况看起来很乐观:在
Installer.java
中,有一种方法称为findJavaPath()
,该方法首先进行检查String javaHome = System.getProperty("java.home");
在猜测是否可行之前,先进行一些猜测。因此,看起来它应该在安装时尊重JAVA_HOME
的值。 但是,它似乎仅用于检查是否有兼容的(1.6+)Java版本。