如何更改从/ usr / libexec / java_home返回的Mac OS的默认Java VM

(不知道这是否应该继续SU …移植肯定是一种select,但更多的程序员在这里阅读的问题,所以在这里)。

我运行的是Mac OS X 10.8.4,我安装了Apple的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 ),启动应用程序也会忽略环境variables。

那么,有没有我可以编辑的文件,我可以在全球范围内设置我的JVM订购偏好?

(请不要告诉我启动Java Preferences Panel,因为这样做根本行不通:它没有包含任何有用的东西,只列出了我安装的4个JVM中的一个。)

更新

Oracle JVM位于/Library/Java/JavaVirtualMachines 。 将JDK 1.8目录重命名为jdk1.8.0.jvm.xyz不会改变任何内容: java_home仍然可以find正确的位置,运行/ usr / bin / java仍然会执行1.8 JVM。 这不是synlinks等的问题

我认为JAVA_HOME是你能做的最好的。 像javajavac这样的命令行工具会尊重那个环境variables,你可以使用/usr/libexec/java_home -v '1.7*'给你一个合适的值,把它放到JAVA_HOME中以使命令行工具使用Java 7 。

 export JAVA_HOME="`/usr/libexec/java_home -v '1.7*'`" 

但标准的双击应用程序包根本不使用安装在/Library/Java下的JDK。 使用Apple的JavaApplicationStub的旧式.app软件包将使用/System/Library/Frameworks Apple Java 6,而没有捆绑JRE的AppBundler构build的新式软件将使用/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home – 在存根代码中硬编码,无法更改,并且不能同时安装两个不同的公共JRE。


编辑:我特意看了VisualVM,假设你正在使用下载页面的“应用程序包”版本,而这个特定的应用程序不是一个AppBundler应用程序,而是它的主要可执行文件是一个shell脚本,它调用一个数字其他shell脚本并读取各种configuration文件。 它默认从/Library/Javaselect最新的JDK,只要它是7u10或更高版本,或者如果您的Java 7安装是更新9或更早版本,则使用Java 6。 但是解开shell脚本中的逻辑看起来像我可以使用configuration文件指定一个特定的JDK。

创build一个文本文件~/Library/Application Support/VisualVM/1.3.6/etc/visualvm.conf (用你正在使用的任何版本的VisualVMreplace1.3.6)包含该行

 visualvm_jdkhome="`/usr/libexec/java_home -v '1.7*'`" 

这将迫使它selectJava 7而不是8。

我也到过那里,到处search/usr/libexec/java_home是如何工作的,但是我找不到任何有关如何确定它列出的可用Java虚拟机的信息。

我已经尝试了一下,我认为它只是执行一个ls /Library/Java/JavaVirtualMachines ,然后检查它在那里find的所有运行时./<version>/Contents/Info.plist

然后,它通过Info.plist中包含的关键JVMVersion对它们进行sorting,默认情况下,它使用第一个条目作为其默认JVM。

我认为我们唯一可以做的就是改变plist: sudo vi /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Info.plist ,然后修改JVMVersion从1.8.0到其他的东西,它的底部,而不是顶部,像!1.8.0

就像是:

 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> ... <dict> ... <key>JVMVersion</key> <string>!1.8.0</string> <!-- changed from '1.8.0' to '!1.8.0' -->` 

然后它从列表顶部神奇地消失:

 /usr/libexec/java_home -verbose Matching Java Virtual Machines (3): 1.7.0_45, x86_64: "Java SE 7" /Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/Home 1.7.0_09, x86_64: "Java SE 7" /Library/Java/JavaVirtualMachines/jdk1.7.0_09.jdk/Contents/Home !1.8.0, x86_64: "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home 

现在您需要注销/login,然后:

 java -version java version "1.7.0_45" 

🙂

当然,我不知道现在是否还有其他问题,或者Java的1.8.0版本仍然可以正常工作。

你可能不应该这样做,而是简单地卸载1.8.0。

但是到目前为止,这对我来说是有效的。

Oracle 卸载Java 7的指示为我工作。

摘抄:

卸载JDK要卸载JDK,您必须具有pipe理员权限,并以root用户身份或使用sudo(8)工具执行remove命令。

导航到/ Library / Java / JavaVirtualMachines并删除名称与以下格式匹配的目录:*

/Library/Java/JavaVirtualMachines/jdk<major>.<minor>.<macro[_update]>.jdk

例如,要卸载7u6:

% rm -rf jdk1.7.0_06.jdk

有点晚,但这是一个与Mac OSX的持续问题…

我find的最简单的解决scheme是简单地删除Apple安装的OpenJDK的东西。 每当Mac OSX的更新到达时,它都会被安装,您需要再次将其删除。

如果您使用Java在您的Mac上开发Google App Engine的应用程序,这种方法非常有效。 OpenJDK工作不正常,Mac OSX Yosemite升级版附带的Java版本将使每个部署的App Engine引擎的Eclipse插件崩溃,并出现有用的错误:“读取超时”。

这其实很简单。 假设我们在我们的JavaVirtualMachines文件夹中有这个:

  • jdk1.7.0_51.jdk
  • jdk1.8.0.jdk

想象一下,1.8是我们的默认,那么我们只是添加一个新的文件夹(例如“旧”),并将默认的jdk文件夹移动到新的文件夹。 再次执行java -version et瞧,1.7!

这很简单,如果你不介意卷起你的袖子… / Library / Java / Home是JAVA_HOME的默认设置,它只是一个链接,指向以下之一:

  • /System/Library/Java/JavaVirtualMachines/1.?.?.jdk/Contents/Home
  • /Library/Java/JavaVirtualMachines/jdk1.?.?_??.jdk/Contents/Home

所以我想在改变JAVA_HOME的内容的情况下更改默认的JVM / JDK版本… / Library / Java / Home是当前JVM / JDK的标准位置,这就是我想要保留的…在我看来成为最简单的方式来改变事情的副作用最小。

其实很简单。 为了改变你用java -version看到的那个版本的java,你所要做的只是这个的一些版本:

 cd /Library/Java sudo rm Home sudo ln -s /Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home ./Home 

我没有花时间,但一个非常简单的shell脚本,使用/ usr / libexec / java_home和ln重新命名上述符号链接应该是愚蠢的容易创build…

一旦你改变了/ Library / Java / Home的位置,你会得到正确的结果:

 cerebro:~ magneto$ java -version java version "1.8.0_60" Java(TM) SE Runtime Environment (build 1.8.0_60-b27) Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, mixed mode) 

我有类似的情况,下面的过程为我工作:

  1. 在terminal中input

     vi ~/.profile 
  2. 然后在文件中添加这一行,并保存

     export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk<version>.jdk/Contents/Home 

    其中版本是您计算机上的版本,例如1.7.0_25

  3. 退出编辑器,然后input以下命令使其生效

     source ~/.profile 

然后键入java -version来检查结果

  java -version 

什么是.profile? 来自: http : //computers.tutsplus.com/tutorials/speed-up-your-terminal-workflow-with-command-aliases-and-profile–mac-30515

.profile文件是一个隐藏的文件。 它是一个可选的文件,告诉系统当用户的configuration文件login时运行哪些命令。例如,如果我的用户名是bruno,并且/ Users / bruno /中有一个.profile文件,它的所有内容将在login过程中执行。

MacOS使用/ usr / libexec / java_home来查找当前的Java版本。 一种绕过的方法是像上面的@ void256所解释的那样改变plist文件。 其他方法是采取java_home的备份,并用您自己的具有代码的脚本java_homereplace它
echo $ JAVA_HOME

现在,通过将以下命令添加到〜/ .bash_profile中,将JAVA_HOME导出到所需的SDK版本。 导出JAVA_HOME =“/系统/库/ Java / JavaVirtualMachines / 1.6.0.jdk /内容/主页”launchctl setenv JAVA_HOME $ JAVA_HOME ///使环境variables全局

运行命令source〜/ .bash_profile来运行上述命令。

每当需要更改JAVA_HOME时,他都可以重置〜/ .bash_profile文件中的JAVA_HOME值。

编辑:这个信息是专为visualvm,而不是任何其他的Java应用程序

正如别人所说,你需要修改visualvm.conf

对于Mac上最新版本的JvisualVM 1.3.6,安装目录已更改。

它目前位于/Applications/VisualVM.app/Contents/Resources/visualvm/etc/visualvm.conf

但是,这可能取决于您安装VisualVM的位置。 findVisualVM启动的最简单的方法,然后使用以下命令查看进程:

ps -ef | grep VisualVM

你会看到像这样的东西:

-Dnetbeans.dirs = / Applications / VisualVM.app / Contents / Resources / visualvm / visualvm

你想获取netbeans.dir属性并查找一个目录,你会发现etc文件夹。

在visualvm.conf中取消注释该行并将path更改为jdk

 visualvm_jdkhome="/path/to/jdk" 

另外,如果你的visualvm速度慢,而且你的内存很多,我build议大大增加可用内存的数量,并在服务器模式下运行它:

 visualvm_default_options="-J-XX:MaxPermSize=96m -J-Xmx2048m -J-Xms2048m -J-server -J-XX:+UseCompressedOops -J-XX:+UseConcMarkSweepGC -J-XX:+UseParNewGC -J-XX:NewRatio=2 -J-Dnetbeans.accept_license_class=com.sun.tools.visualvm.modules.startup.AcceptLicense -J-Dsun.jvmstat.perdata.syncWaitMs=10000 -J-Dsun.java2d.noddraw=true -J-Dsun.java2d.d3d=false" 

我想改变默认的Java版本forms1.6 * 1.7 *。 我尝试了以下步骤,它为我工作:

  • 从/ usr / bin下删除了链接“java”
  • 再次创build它,指向新的位置:

ln -s /Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/bin/java java

  • 通过“java -version”进行validation

java版本“1.7.0_51”
Java(TM)SE运行时环境(build 1.7.0_51-b13)
Java HotSpot(TM)64位服务器虚拟机(构build24.51-b03,混合模式)