Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何更改Mac OS';从/usr/libexec/Java_home返回的默认Java VM_Java_Macos_Java Home - Fatal编程技术网

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

如何更改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):

(不确定这是否应该继续进行……迁移当然是一种选择,但更多的程序员阅读了这里的问题,所以这里就开始了)

我运行的是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):
    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