如何更改Mac OS';从/usr/libexec/Java_home返回的默认Java VM
(不确定这是否应该继续进行……迁移当然是一种选择,但更多的程序员阅读了这里的问题,所以这里就开始了) 我运行的是MacOSX10.8.4,我安装了苹果的JDK1.6.0_51和Oracle的JDK1.7.0_25。我最近安装了Oracle的1.8预览JDK,用于一些需要它的预发布软件。现在,当我运行/usr/libexec/java_home时,我得到如下结果:如何更改Mac OS';从/usr/libexec/Java_home返回的默认Java VM,java,macos,java-home,Java,Macos,Java Home,(不确定这是否应该继续进行……迁移当然是一种选择,但更多的程序员阅读了这里的问题,所以这里就开始了) 我运行的是MacOSX10.8.4,我安装了苹果的JDK1.6.0_51和Oracle的JDK1.7.0_25。我最近安装了Oracle的1.8预览JDK,用于一些需要它的预发布软件。现在,当我运行/usr/libexec/java_home时,我得到如下结果: $ /usr/libexec/java_home -V Matching Java Virtual Machines (4):
$ /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\u HOME
,因为启动应用程序会忽略环境变量,即使从命令行启动(例如$open/applications/VisualVM.app
)
那么,是否有一个可以编辑的文件,可以在其中全局设置JVM排序首选项
(请不要告诉我启动Java首选项面板,因为它根本不起作用:它不包含任何有用的内容,只列出我安装的4个JVM中的一个。)
更新:
Oracle JVM生活在/Library/Java/JavaVirtualMachine
中。将JDK 1.8目录重新命名为jdk1.8.0.jvm.xyz
不会改变任何东西:java_home
仍然会找到正确的位置,并且运行/usr/bin/java仍然会执行1.8 jvm。这不是synlinks等的问题
对类似问题的回答
虽然它提供了一种黑客攻击,将Java版本从Java_home中删除,但它仍然没有回答Java_home如何选择默认版本以及用户是否可以选择默认版本的问题。我认为
Java_home
是您能做的最好的选择。像java
和javac
这样的命令行工具将尊重该环境变量,您可以使用/usr/libexec/java_home-v'1.7*'
为您提供一个合适的值,以输入java_home
,从而使命令行工具使用java 7
export JAVA_HOME="`/usr/libexec/java_home -v '1.7*'`"
但是标准的双击应用程序包根本不使用安装在/Library/Java
下的JDK。旧式的.app
捆绑使用苹果的JavaApplicationStub
将使用/System/Library/Frameworks
中的Apple Java 6,而新的捆绑式JRE将使用“public”/Library/internetplugins/JavaAppletPlugin.plugin/Contents/Home
中的JRE-这是存根代码中的硬编码,不能更改,并且不能同时安装两个不同的公共JRE
编辑:我专门研究了VisualVM,假设您使用的是来自的“应用程序包”版本,而这个特定的应用程序不是AppBundler应用程序,而是一个调用许多其他shell脚本并读取各种配置文件的shell脚本。它默认从
/Library/Java
中选择最新的JDK,只要是7u10或更高版本,或者如果您的Java 7安装是update 9或更早版本,则使用Java 6。但是,在我看来,要解开shell脚本中的逻辑,您可以使用配置文件指定特定的JDK
创建一个包含行的文本文件~/Library/Application Support/VisualVM/1.3.6/etc/VisualVM.conf
(将1.3.6替换为您正在使用的任何版本的VisualVM)
visualvm_jdkhome="`/usr/libexec/java_home -v '1.7*'`"
这将迫使它选择Java 7而不是Java 8。Oracle为我工作
摘录:
卸载JDK
要卸载JDK,您必须具有管理员权限,并以root用户身份或使用sudo(8)工具执行remove命令
导航到/Library/Java/JavaVirtualMachines并删除名称与以下格式匹配的目录:*
/Library/Java/JavaVirtualMachines/jdk…jdk
例如,要卸载7u6:
%rm-rf jdk1.7.0_06.jdk
编辑:此信息专门针对visualvm,不适用于任何其他java应用程序 正如其他人提到的,您需要修改visualvm.conf 对于Mac上最新版本的JvisualVM 1.3.6,安装目录已更改 目前正在进行中 /Applications/VisualVM.app/Contents/Resources/VisualVM/etc/VisualVM.conf 但是,这可能取决于安装VisualVM的位置。找到VisualVM的最简单方法是启动它,然后使用以下方法查看流程: ps-ef | grep VisualVM 您将看到如下内容:
<?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' -->`
-Dnetbeans.dirs=/Applications/VisualVM.app/Contents/Resources/VisualVM/VisualVM
您需要使用netbeans.dir属性并查找一个目录,您将找到etc文件夹
在visualvm.conf中取消注释这一行,并更改到jdk的路径
visualvm_jdkhome="/path/to/jdk"
此外,如果您的visualvm运行缓慢且内存很大,我建议您大幅增加可用内存量,并在服务器模式下运行:
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"
我也去过那里,到处搜索
/usr/libexec/java_home
是如何工作的,但我找不到任何关于它如何确定它列出的可用java虚拟机的信息
我做了一些实验,我认为它只是执行一个ls/Library/Java/JavaVirtualMachines
,然后检查它在那里找到的所有运行时的//Contents/Info.plist
然后,它按照Info.plist中包含的键JVMVVersion
对它们进行降序排序,默认情况下,它使用第一个条目作为默认JVM
我认为我们唯一可以做的就是更改plist:sudo vi/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Info.plist
,然后将JVM版本从1.8.0
修改为其他内容,使其排序为t
/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
java -version
java version "1.7.0_45"
vi ~/.profile
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk<version>.jdk/Contents/Home
source ~/.profile
java -version
cd /Library/Java
sudo rm Home
sudo ln -s /Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home ./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)
function setJava {
export JAVA_HOME="$(/usr/libexec/java_home -v $1)"
launchctl setenv JAVA_HOME $JAVA_HOME
sudo ln -nsf "$(dirname ${JAVA_HOME})/MacOS" /Library/Java/MacOS
java -version
}
setJava 1.8
$ /usr/libexec/java_home -V
Matching Java Virtual Machines (2):
11.0.5, x86_64: "Amazon Corretto 11" /Library/Java/JavaVirtualMachines/amazon-corretto-11.jdk/Contents/Home
1.8.0_232, x86_64: "Amazon Corretto 8" /Library/Java/JavaVirtualMachines/amazon-corretto-8.jdk/Contents/Home
/Library/Java/JavaVirtualMachines/amazon-corretto-11.jdk/Contents/Home
$ JAVA_VERSION=1.8 /usr/libexec/java_home
/Library/Java/JavaVirtualMachines/amazon-corretto-8.jdk/Contents/Home