当前位置: 首页 > 知识库问答 >
问题:

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

姜华翰
2023-03-14

(不确定这是否应该在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"

那么,有没有一个文件我可以编辑,我可以在那里设置我的JVM排序首选项全局?

(请不要告诉我启动Java Preferences面板,因为这根本不起作用:它不包含任何有用的内容,并且只列出了我已经安装的4个JVM中的一个。)

更新:

共有1个答案

郎建章
2023-03-14

我认为java_home是您所能做的最好的。像Javajavac这样的命令行工具将尊重该环境变量,您可以使用/usr/libexec/java_home-v'1.7*'给出一个合适的值放入java_home中,以便命令行工具使用Java7。

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

但是标准的双击应用程序包根本不使用安装在/library/java下的JDK。使用Apple的JavaApplicationStub的旧式.app包将使用/System/Library/Frameworks中的Apple Java 6,而使用AppBundler构建的新式包将使用/Library/Internet Plug-ins/JavaAppleTplugin.plugin/Contents/Home中的“公共”JRE-这是存根代码中硬编码的,不能更改,而且您不能同时安装两个不同的公共JRE。

Edit:假设您使用的是下载页面中的“applicathtml" target="_blank">ion Bundle”版本,我已经专门查看了VisualVM,并且这个特定的应用程序不是AppBundler应用程序,而是它的主要可执行程序是一个shell脚本,它调用了许多其他shell脚本并读取各种配置文件。它默认从/library/Java中选择最新的JDK,只要该JDK是7U10或更高版本,或者如果您的Java7安装是更新9或更早版本,则使用Java6。但是,在我看来,如果把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*'`"

这将迫使它选择Java7而不是8。

 类似资料:
  • 我在macOS monterrey上并使用自定义JDK 15(我必须使用为我的公司修改的自定义JDK)。当我运行时,我得到这个错误: 但是,当我运行时,我得到。此外,运行会返回正确的JDK版本。 因为 并没有指向使用 Java 的实际 JDK 目录工具不起作用。 有没有办法设置指向我的JDK目录?

  • 2010年的这个问题暗示了我正在努力做什么。

  • 问题内容: 2010年的这个问题暗示了我正在尝试做的事情。 我正在进行单元测试,该单元测试的代码需要许多模拟对象来完成所需的工作(测试HTML + PDF渲染)。为了使测试成功,我需要生成许多模拟对象,并且每个对象最终都会将一些String数据返回到要测试的代码中。 我 想 我可以通过实现自己的类或实现此目的,但是我不确定如何实现它们,因此它们仅影响返回String的方法。 我觉得下面的代码接近我

  • 问题内容: 尝试更改列的数据类型并设置新的默认值时遇到以下错误: 错误1064(42000):您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以在第1行的’VARCHAR(255)NOT NULL SET DEFAULT’{}’‘附近使用正确的语法 问题答案: 同样的第二种可能性(感谢juergen_d):

  • 在尝试更改列的数据类型并设置新的默认值时,我遇到以下错误: 错误1064(42000):您的SQL语法中有错误;查看与您的MySQL server版本相对应的手册,以了解第1行“varchar(255)NOT NULL SET DEFAULT”{}“附近使用的正确语法

  • 如何在Mac上更改Java的默认版本?