如何更改从/ usr / libexec / java_home返回的Mac OS默认Java VM
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何更改从/ usr / libexec / java_home返回的Mac OS默认Java VM相关的知识,希望对你有一定的参考价值。
(不确定这是否应该继续使用SU ...迁移肯定是一种选择,但更多的程序员在这里阅读问题,所以这里也是如此)。
我正在运行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
)。
那么,是否有一个我可以编辑的文件,我可以在全局设置我的JVM订购首选项?
(请不要告诉我启动Java Preferences Panel,因为它根本不起作用:它不包含任何有用的东西,只列出我安装的4个JVM之一。)
更新:
Oracle JVM位于/Library/Java/JavaVirtualMachines
。将JDK 1.8目录重新命名为jdk1.8.0.jvm.xyz
不会改变任何内容:java_home
仍然在正确的位置找到它,并且运行/ usr / bin / java仍然执行1.8 JVM。这不是synlinks等的问题。
类似问题的答案
虽然this answer提供的东西相当于一个黑客,它将删除java_home中的Java版本,但它仍然没有回答java_home如何选择其默认值以及用户是否可以使用non-destructively set it的问题。
我认为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。使用Apple的.app
的旧式JavaApplicationStub
捆绑包将使用来自/System/Library/Frameworks
的Apple Java 6,而使用AppBundler而没有捆绑的JRE构建的新式捆绑包将使用/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home
中的“公共”JRE - 这是在存根代码中硬编码而不能被更改,您不能同时安装两个不同的公共JRE。
编辑:我已经专门看了一下VisualVM,假设你正在使用the download page的“应用程序包”版本,而这个特定的应用程序不是AppBundler应用程序,而是它的主要可执行文件是一个调用其他一些的shell脚本shell脚本并读取各种配置文件。它默认从/Library/Java
中选择最新的JDK,只要它是7u10或更高版本,或者如果Java 7安装是9或更早版本,则使用Java 6。但是解开shell脚本中的逻辑,它在我看来就像你可以使用配置文件指定一个特定的JDK。
创建一个文本文件~/Library/Application Support/VisualVM/1.3.6/etc/visualvm.conf
(用你正在使用的任何版本的VisualVM替换1.3.6)包含该行
visualvm_jdkhome="`/usr/libexec/java_home -v '1.7*'`"
这将迫使它选择Java 7而不是8。
我有类似的情况,以下过程对我有用:
- 在终端中输入
vi ~/.profile
- 然后在文件中添加此行,并保存
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk<version>.jdk/Contents/Home
其中版本是您计算机上的版本,例如1.7.0_25 - 退出编辑器,然后键入以下命令使其生效
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文件是一个隐藏文件。它是一个可选文件,告诉系统当用户的配置文件登录时要运行哪些命令。例如,如果我的用户名是bruno,并且/ Users / bruno /中有.profile文件,则其所有内容将在登录过程中执行。
我想将默认的java版本形式1.6 *更改为1.7 *。我尝试了以下步骤,它对我有用:
- 从/ usr / bin下删除了链接“java”
- 再次创建它,指向新位置:
ln -s /Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/bin/java java
- 用“java -version”验证
java版“1.7.0_51” Java(TM)SE运行时环境(版本1.7.0_51-b13) Java HotSpot(TM)64位服务器VM(内置24.51-b03,混合模式)
我也一直在那里搜索/usr/libexec/java_home
如何工作,但我找不到任何关于它如何确定它列出的可用Java虚拟机的信息。
我已经尝试了一下,我认为它只是执行一个ls /Library/Java/JavaVirtualMachines
,然后检查它在那里发现的所有运行时的./<version>/Contents/Info.plist
。
然后它按Info.plist中包含的密钥JVMVersion
对它们进行排序,默认情况下,它使用第一个条目作为其默认JVM。
我认为我们唯一可能做的就是更改plist:sudo vi /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Info.plist
,然后将QVMVersion从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
现在您需要注销/登录然后:
java -version
java version "1.7.0_45"
:-)
当然我不知道现在是否还有其它东西,或者1.8.0-ea版本的java是否仍能正常工作。
您可能不应该这样做,而是简单地卸载1.8.0。
但到目前为止,这对我有用。
这实际上非常简单。假设我们在JavaVirtualMachines文件夹中有这个:
- jdk1.7.0_51.jdk
- jdk1.8.0.jdk
想象一下1.8是我们的默认值,然后我们只添加一个新文件夹(例如'old')并将默认的jdk文件夹移动到该新文件夹。再次java -version
和瞧,1.7!
甲骨文的uninstallation instructions for Java 7为我工作。
摘抄:
卸载JDK要卸载JDK,您必须具有管理员权限,并以root身份或使用sudo(8)工具执行remove命令。
导航到/ Library / Java / JavaVirtualMachines并删除名称与以下格式匹配的目录:*
/Library/Java/JavaVirtualMachines/jdk<major>.<minor>.<macro[_update]>.jdk
例如,要卸载7u6:
% rm -rf jdk1.7.0_06.jdk
这很简单,如果你不介意卷起袖子...... / Library / Java / Home是JAVA_HOME的默认设置,它只是指向以下之一的链接:
- /system/library/Java/Java virtual machines/1.?.?.JDK/contents/home
- /library/Java/Java virtual machines/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重新指定上面的符号链接应该很容易创建愚蠢......
一旦你改变了/ 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)
有点晚了但是因为这是Mac OSX的持续问题......
我找到的最简单的解决方案是简单地删除Apple安装的OpenJDK内容。每次Mac OSX更新到达时,它都会安装,您需要再次删除它。
如果您使用Java在Mac上为Google App Engine开发应用程序,这种方法非常有效。 OpenJDK无法正常运行,Mac OSX Yosemite升级附带的Java版本将使App Engine的Eclipse插件在每次部署时崩溃,并显示有用的错误:“读取超时”。
我测试了“jenv”以及设置“JAVA_HOME”但没有成功的其他事情。现在我和下面的解决方案一起努力
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
}
(添加到〜/ .bashrc或〜/ .bash.profile或〜/ .zshrc)
并且这样打电话:
setJava 1.8
java_home会处理错误的输入。所以你不能做错事。 Maven和其他东西现在会选择合适的版本。
MacOS使用/ usr / libexec / java_home来查找当前的Java版本。绕过的一种方法是更改plist文件,如上面的@ void256所述。其他方法是备份java_home并将其替换为您自己的脚本java_home和代码 echo $ JAVA_HOME
现在,通过将以下命令添加到〜/ .bash_profile,将JAVA_HOME导出到所需的SDK版本。 export JAVA_HOME =“/ System / Library / Java / JavaVirtualMachines / 1.6.0.jdk / Contents / Home”launchctl setenv JAVA_HOME $ JAVA_HOME ///使环境变量全局
运行命令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的位置。查找VisualVM启动位置的最简单方法,然后使用以下方法查看进程:
ps -ef |抓住VisualVM
你会看到类似的东西:
... -Dnetbeans.dirs = / Applications / VisualVM.app / Contents / Resources / visualvm / visualvm ...
您想要获取netbeans.dir属性并查找目录,您将找到etc文件夹。
取消注释visualvm.conf中的这一行并更改jdk的路径
visualvm_jdkhome="/path/to/jdk"
另外,如果你的visualvm速度很慢并且内存很多,我会建议大大增加可用的内存量并在服务器模式下运行它:
v以上是关于如何更改从/ usr / libexec / java_home返回的Mac OS默认Java VM的主要内容,如果未能解决你的问题,请参考以下文章
File “/usr/libexec/urlgrabber-ext-down“, line 28
File “/usr/libexec/urlgrabber-ext-down“, line 28
File “/usr/libexec/urlgrabber-ext-down“, line 28
linux centos系统 /usr/libexec 目录下装的是啥东西