我不确定这个问题是否应该放在SU上,迁移肯定是一个选择,但更多的程序员在这里阅读问题,所以就在这里问了。
我正在运行Mac OS X 10.8.4,并安装了苹果的JDK 1.6.0_51和Oracle的JDK 1.7.0_25。最近,我安装了Oracle的1.8预览版JDK,因为一些需要它的预发布软件。现在,当我运行/usr/libexec/java_home时,我得到了这个:
$ /usr/libexec/java_home -V
Matching Java Virtual Machines (4):
1.8.0, x86_64: "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home
1.7.0_25, x86_64: "Java SE 7" /Library/Java/JavaVirtualMachines/jdk1.7.0_25.jdk/Contents/Home
1.6.0_51-b11-457, x86_64: "Java SE 6" /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
1.6.0_51-b11-457, i386: "Java SE 6" /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
很好。
然而,运行:
$ java -version
返回:
java version "1.8.0-ea"
这意味着默认版本的Java目前是预发布版本,这会破坏一些“正常”的软件包(在我的情况下是VisualVM)。
我无法设置JAVA_HOME,因为启动应用程序会忽略环境变量,即使从命令行启动也是如此(例如$ open /Applications/VisualVM.app)。
那么,有没有一个文件我可以编辑,在其中可以全局设置我的JVM排序偏好?
(请不要告诉我启动Java首选项面板,因为那根本行不通:它不包含任何有用的内容,只列出我安装的4个JVM中的一个。)
更新:
Oracle JVM位于/Library/Java/JavaVirtualMachines。将JDK 1.8目录重命名为jdk1.8.0.jvm.xyz并不会改变任何东西:java_home仍然在正确的位置找到它,并且运行/usr/bin/java仍然执行1.8 JVM。这不是符号链接等问题。
类似问题的答案:
虽然这个答案提供了一种所谓的“hack”,可以阻止 java_home 选择 Java 版本,但它仍然没有回答这个问题:java_home 如何选择其默认值,以及用户是否能够非破坏性地设置它。
/usr/bin/java
指向/System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java
。Versions
目录中不包含指向1.8.0 JDK的符号链接。相反,它包含一个很有用的名为A
的目录,Current
指向它。A
不是一个"JAVA_HOME"。它有一个名为Commands
的子目录,其中包含一个java
命令,但它是一个不透明的通用二进制文件,做了什么无从得知。我怀疑它使用java_home
等来决定要使用哪个JVM。 - Christopher Schultz