如何在Mac OSX上安装Java以允许版本切换?

Jay*_*ard 241 java java-12

我想在Mac OSX上安装OpenJDK Java 11,并将其与其他JDK一起使用,因为它是一个较新版本.目前,我下载了tar.gz并将其放在我的路径中,但这很难维护.

我发现自动做更多事情的唯一其他安装是通过Homebrew cask进行的Oracle安装,但这是商业JDK,我想要开源的!

brew cask info java
Run Code Online (Sandbox Code Playgroud)

显示:

java:11,28:55eed80b163941c8885ad9298e6d786a https://www.oracle.com/technetwork/java/javase/overview/index.html

它是Oracle JDK而不是OpenJDK,请参阅:https: //discourse.brew.sh/t/how-to-install-openjdk-with-brew/712

从较旧的问题(Mac OS X和多个Java版本)的指示已过时,并给我错误的版本 - Oracle而不是OpenJDK.

更新: 截至2018年10月3日,Homebrew酒桶现在指向OpenJDK 11

Jay*_*ard 560

注意: 这些解决方案适用于您的Java 11 OpenJDK特定情况,但也适用于列出的版本管理器涵盖的任何其他以前的Java版本.这包括来自OpenJDK,Oracle,IBM,Azul,Amazon Correto,Graal等的替代JDK.轻松使用Java 7,Java 8,Java 9,Java 10,Java 11,甚至可以早期访问Java 12!

您可以选择如何进行安装以及管理JDK切换.可以通过Homebrew,SDKMAN,Jabba或手动安装来完成安装.切换可以由JEnv,SDKMAN,Jabba完成,也可以通过设置手动完成JAVA_HOME.所有这些都在下面描述.


安装

首先,使用您喜欢的任何方法安装Java,包括Homebrew,SDKMAN或手动安装tar.gz文件.手动安装的优点是JDK的位置可以放置在Mac OSX的标准化位置.

使用SDKMAN安装

这是一个简单的模型,它处理安装和版本切换,但需要注意的是它将JDK安装到非标准目录中.

< 参见下面"使用SDKMAN安装和切换版本" >

使用Jabba安装

这也是一个简单的模型,安装和版本切换都由同一个工具处理.安装到非标准目录.

< 见下文"使用Jabba安装和切换版本" >

从OpenJDK下载页面手动安装:

  1. 从下载的OpenJDK 11的Mac OSX http://jdk.java.net/11/(或提前获得JDK 12 http://jdk.java.net/12/)

  2. 取消归档OpenJDK tar,并将生成的jdk-13.jdk文件夹放入您的/Library/Java/JavaVirtualMachines/文件夹,因为这是JDK安装的标准和预期位置.您也可以在现实中随意安装.

用Homebrew安装

Homebrew Cask中可用的Java版本到2018年10月3日确实是Oracle JVM.但是现在它已经更新为OpenJDK.请务必更新Homebrew,然后您将看到可用于安装的最新版本.

  1. 如果你还没有安装Homebrew.确保它已更新:

    brew update
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果您尚未添加垃圾桶,请添加:

    brew tap homebrew/cask-versions
    
    Run Code Online (Sandbox Code Playgroud)
  3. 寻找可安装的版本:

    brew tap adoptopenjdk/openjdk
    
    Run Code Online (Sandbox Code Playgroud)
  4. 检查将要安装的版本的详细信息:

    brew search java   
    
    Run Code Online (Sandbox Code Playgroud)

    注意:在2018年10月3日之前,当前版本是Java 11的Oracle商业版本,在10月3日之后,现在是OpenJDK 11.

  5. 安装特定版本的JDK,例如java11,adoptopenjdk8java当前:

    brew search jdk     
    
    Run Code Online (Sandbox Code Playgroud)

    AdoptOpenJDK版本可用,以及现在从家酿木桶:

    brew cask info java
    
    Run Code Online (Sandbox Code Playgroud)

这些将被安装到adoptopenjdkMac OSX上预期的传统位置.

其他安装选项:

openJDK的其他一些风格是:

Azul Systems Java Zulu认证的OpenJDK版本可以按照其网站上说明进行安装.

Zulu®是OpenJDK的认证版本,完全符合Java SE标准.Zulu是100%开源的,可免费下载.现在,Java开发人员,系统管理员和最终用户可以享受开源Java的全部优势,具有部署灵活性和对升级时间的控制.

Amazon Correto OpenJDK版本具有易于使用的版本8安装包(其他版本即将推出),并安装到/Library/Java/JavaVirtualMachines/Mac OSX上的标准目录中.

Amazon Corretto是Open Java Development Kit(OpenJDK)的免费,多平台,生产就绪版本.Corretto提供长期支持,包括性能增强和安全修复.亚马逊在内部运行Corretto数千种生产服务,Corretto被认证为与Java SE标准兼容.使用Corretto,您可以在流行的操作系统上开发和运行Java应用程序,包括Amazon Linux 2,Windows和macOS.


我的JDK在哪里?!?!

要查找在默认系统位置安装的以前安装的Java JDK的位置,请使用:

brew cask info adoptopenjdk
Run Code Online (Sandbox Code Playgroud)

匹配Java虚拟机(8):11,x86_64:"Java SE 11"/Library/Java/JavaVirtualMachines/jdk-11.jdk/Contents/Home 10.0.2,x86_64:"Java SE 10.0.2"/ Library/Java /JavaVirtualMachines/jdk-10.0.2.jdk/Contents/Home 9,x86_64:"Java SE 9"/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home 1.8.0_144,x86_64:"Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home

您还可以使用报告特定Java版本的位置 /Library/Java/JavaVirtualMachines/

brew cask install java
Run Code Online (Sandbox Code Playgroud)

/Library/Java/JavaVirtualMachines/jdk-11.jdk/Contents/Home

在使用像JEnv这样的工具,或者在SDKMAN中添加本地安装,或者在Jabba中链接系统JDK时,了解已安装JDK的位置也很有用 - 您需要知道在哪里找到它们.

如果您需要通过其他工具查找JDK,请检​​查以下位置:

  • SDKMAN安装到 -v
  • Jabba安装到 ~/.sdkman/candidates/java/

手动切换版本

Java可执行文件是一个包装器,它将使用配置的任何JDK ~/.jabba/jdk,因此您可以更改它以更改正在使用的JDK.

例如,如果您安装或解压缩JDK 11,JAVA_HOME如果它是最高版本号,它应该已经是默认值,如果不是,您只需设置:

brew cask install homebrew/cask-versions/java11
Run Code Online (Sandbox Code Playgroud)

现在路径中的Java可执行文件将看到这一点,并使用正确的JDK.

使用/Library/Java/JavaVirtualMachines/jdk-13.jdk前面描述的实用程序可以帮助您创建别名或运行命令以通过识别不同JDK安装的位置来更改Java版本.例如,在您中创建shell别名/usr/libexec/java_home或为您.profile更改.bash_profile:

/usr/libexec/java_home -V
Run Code Online (Sandbox Code Playgroud)

然后要更改版本,只需使用别名即可.

/usr/libexec/java_home -v 13
Run Code Online (Sandbox Code Playgroud)

java版"1.8.0_144"

当然JAVA_HOME手动设置也有效!


使用JEnv切换版本

JEnv希望Java JDK已经存在于机器上,并且可以在任何位置.通常,您会找到已安装的Java JDKJAVA_HOME.JEnv允许设置Java的全局版本,一个用于当前shell,一个每个目录的本地版本,当某些项目需要不同版本的版本时,它们很方便.

  1. 如果您还没有安装JEnv,请在网站http://www.jenv.be/上进行手动安装或使用Homebrew.

  2. 将任何Java版本添加到JEnv(如果将其放在其他位置,请调整目录):

    export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-13.jdk/Contents/Home
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用以下命令设置全局版本:

    export JAVA_8_HOME=$(/usr/libexec/java_home -v1.8)
    export JAVA_9_HOME=$(/usr/libexec/java_home -v9)
    export JAVA_10_HOME=$(/usr/libexec/java_home -v10)
    export JAVA_11_HOME=$(/usr/libexec/java_home -v11)
    export JAVA_12_HOME=$(/usr/libexec/java_home -v12)
    export JAVA_13_HOME=$(/usr/libexec/java_home -v13)
    
    alias java8='export JAVA_HOME=$JAVA_8_HOME'
    alias java9='export JAVA_HOME=$JAVA_9_HOME'
    alias java10='export JAVA_HOME=$JAVA_10_HOME'
    alias java11='export JAVA_HOME=$JAVA_11_HOME'
    alias java12='export JAVA_HOME=$JAVA_12_HOME'
    alias java13='export JAVA_HOME=$JAVA_13_HOME'
    
    # default to Java 13
    java13
    
    Run Code Online (Sandbox Code Playgroud)

您还可以/Library/Java/JavaVirtualMachines/以类似方式添加其他现有版本,并列出可用的版本.例如Java 8:

java8
java -version
Run Code Online (Sandbox Code Playgroud)

有关更多命令,请参阅JEnv文档.您现在可以随时在整个系统,shell或每个本地目录之间切换任何Java版本(Oracle,OpenJDK,其他).

jenv add在使用JEnv时帮助管理,您可以添加导出插件来为您执行此操作.

jenv add /Library/Java/JavaVirtualMachines/jdk-13.jdk/Contents/Home
Run Code Online (Sandbox Code Playgroud)

JAVA_HOME如果已经设置了导出插件,则可能无法进行调整,因此您可能需要在配置文件中清除此变量,以便可以由JEnv进行管理.

您还可以使用为该JAVA_HOME命令运行单个命令jenv exec <command> <parms...>JAVA_HOME为其正确设置,这可能包括打开另一个shell.


使用SDKMAN安装和切换版本

SDKMAN有点不同,它处理安装和切换.SDKMAN还将已安装的JDK放入其自己的目录树中,这通常是PATH.SDKMAN允许设置全局默认版本以及特定于当前shell的版本.

  1. https://sdkman.io/install安装SDKMAN

  2. 使用SDKMAN安装Java 11:

    jenv global 13
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将11设为默认版本:

    jenv add /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home 
    jenv versions
    
    Run Code Online (Sandbox Code Playgroud)

    或者为会话切换到11:

    $ jenv enable-plugin export
      You may restart your session to activate jenv export plugin echo export plugin activated
    
    Run Code Online (Sandbox Code Playgroud)

您可以使用list命令列出可供安装的可用版本:

sdk list java
Run Code Online (Sandbox Code Playgroud)

并安装其他版本,例如JDK 8:

sdk install java 13.0.0-open 
Run Code Online (Sandbox Code Playgroud)

SDKMAN可以使用以前安装的现有版本.只需进行本地安装,给出自己的版本标签和JDK的位置:

sdk default java 13.0.0-open
Run Code Online (Sandbox Code Playgroud)

并自由使用:

sdk use java 13.0.0-open
Run Code Online (Sandbox Code Playgroud)

SDKMAN使用指南中提供了更多信息以及可以安装和管理的其他SDK.

SDKMAN会在您更改版本时自动管理您~/.sdkman/candidates/javaPATH您.


使用Jabba安装和切换版本

Jabba还处理安装和切换.Jabba还将已安装的JDK放入其自己的目录树中,这通常是JAVA_HOME.

  1. 按照主页上说明安装Jabba .

  2. 列出可用的JDK

    sdk list java
    
    Run Code Online (Sandbox Code Playgroud)
  3. 安装Java JDK 11

    sdk install java 8.0.181-oracle
    
    Run Code Online (Sandbox Code Playgroud)
  4. 用它:

    sdk install java my-local-13 /Library/Java/JavaVirtualMachines/jdk-13.jdk/Contents/Home
    
    Run Code Online (Sandbox Code Playgroud)

您还可以为版本名称添加别名,链接到已安装的现有JDK,并查找有趣的JDK,如GraalVM,Adopt JDK,IBM JDK等.完整的使用指南也可在主页上找到.

当您更改版本时,Jabba将自动管理您~/.jabba/jdkPATH您.

  • 可能是在MacOS上运行不同JDK的最广泛和最有用的答案,涵盖了许多不同的方法,有些我以前从未遇到过. (7认同)
  • 对于手动安装,我认为您需要设置`JAVA_HOME`以选择特定版本,例如``.bash_profile`中的`export JAVA_HOME = $(/ usr/libexec/java_home -v <version>)` (2认同)
  • 酿酒桶中的Java在昨天,即2018年10月3日改为OpenJDK 11. (2认同)
  • 对于那些考虑使用 `sdkman` 安装 JDK + `jenv` 在它们之间切换的人:您需要知道 sdkman 安装的 JAVA_HOME 等效项是 ~/.sdkman/candidates/java/&lt;identifier&gt; 。但无论如何,如果你可以继续使用brew而不是sdkman,那就更容易了。 (2认同)

Hug*_* M. 12

不使用第三方工具手动切换系统默认版本:

正如这个旧答案中所详述的那样,在 macOS 上/usr/bin/java是一个包装器工具,它将使用指向的 Java 版本,JAVA_HOME或者如果未设置该变量,则将在下面查找 Java 安装/Library/Java/JavaVirtualMachines/并使用具有最高版本的那个。它通过查看Contents/Info.plist每个包下来确定版本。

掌握了这些知识,您可以:

  • 通过重命名Info.plist您不想用作默认值的版本来控制系统将使用哪个版本(实际 Java 运行时本身不使用该文件)。
  • 通过设置来控制用于特定任务的版本 $JAVA_HOME

我刚刚验证了 OpenJDK 和 Mojave 仍然如此。

在一个全新的系统上,没有安装 Java 版本:

$ java -version
No Java runtime present, requesting install.
Run Code Online (Sandbox Code Playgroud)

取消这个,在https://jdk.java.net上下载 OpenJDK 11 & 12ea ;安装 OpenJDK11:

$ cd /Library/Java/JavaVirtualMachines/
$ sudo tar xzf ~/Downloads/openjdk-11.0.1_osx-x64_bin.tar.gz
Run Code Online (Sandbox Code Playgroud)

系统 java 现在是 11:

$ java -version
openjdk version "11.0.1" 2018-10-16
[...]
Run Code Online (Sandbox Code Playgroud)

安装 OpenJDK12(目前抢先体验):

$ sudo tar xzf ~/Downloads/openjdk-12-ea+17_osx-x64_bin.tar.gz 
Run Code Online (Sandbox Code Playgroud)

系统 java 现在是 12:

$ java -version
openjdk version "12-ea" 2019-03-19
[...]
Run Code Online (Sandbox Code Playgroud)

现在让我们从系统 java 包装器中“隐藏”OpenJDK 12:

$ cd jdk-12.jdk/Contents/
$ sudo mv Info.plist Info.plist.disabled
Run Code Online (Sandbox Code Playgroud)

系统java回到11:

$ java -version
openjdk version "11.0.1" 2018-10-16
[...]
Run Code Online (Sandbox Code Playgroud)

您仍然可以通过手动设置来准时使用版本 12 JAVA_HOME

$ export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-12.jdk/Contents/Home
$ java -version
openjdk version "12-ea" 2019-03-19
[...]
Run Code Online (Sandbox Code Playgroud)


Lyn*_*tel 12

使用 Homebrew 和 jenv:

假设:Mac 机器并且您已经安装了自制软件。

从 Oracle 官方网站安装 Java。您可以安装多个版本的 JDK。它将安装在以下路径上:

 /Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/
 /Library/Java/JavaVirtualMachines/jdk1.11.0_2.jdk/
 /Library/Java/JavaVirtualMachines/jdk-14.0.2.jdk/
Run Code Online (Sandbox Code Playgroud)

没有jenv,系统将使用最后安装的java。

如果要使用/管理多个版本,则可以使用jenv

安装和配置 jenv:

$ brew install jenv
$ echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.zshrc
$ echo 'eval "$(jenv init -)"' >> ~/.zshrc
$ source ~/.zshrc
Run Code Online (Sandbox Code Playgroud)

将已安装的 java 添加到 jenv 中:

$ jenv add /Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home
$ jenv add /Library/Java/JavaVirtualMachines/14.0.2.jdk/Contents/Home
Run Code Online (Sandbox Code Playgroud)

要查看所有已安装的 java:

$ jenv versions
Run Code Online (Sandbox Code Playgroud)

上面的命令将给出已安装的java列表:

  system
  1.8
* 1.8.0.291 (set by /Users/lpatel/.jenv/version)
  14
  14.0
  14.0.2
  oracle64-1.8.0.291
  oracle64-14.0.2
Run Code Online (Sandbox Code Playgroud)

配置要使用的 java 版本:

$ jenv global 1.8.0.291
Run Code Online (Sandbox Code Playgroud)

  • @ChumiestBucket 我已经更新了解决方案,如果您在这方面遇到任何问题,请告诉我。谢谢 ! (2认同)

Lyn*_*tel 7

如果您的机器上安装了多个版本,请在 bash 配置文件中添加以下内容:

导出 JAVA_HOME_7=$(/usr/libexec/java_home -v1.7)

导出 JAVA_HOME_8=$(/usr/libexec/java_home -v1.8)

导出 JAVA_HOME_9=$(/usr/libexec/java_home -v9)

并添加以下别名:

别名 java7='导出 JAVA_HOME=$JAVA_HOME_7'

别名 java8='导出 JAVA_HOME=$JAVA_HOME_8'

别名 java9='导出 JAVA_HOME=$JAVA_HOME_9'

并且可以使用别名切换到所需的版本:

在终端:

~ >> java7 export JAVA_HOME=$JAVA_7_HOME


VK3*_*321 6

这就是我做的。

步骤1: 安装Java 11

您可以从此处下载适用于Mac的Java 11 dmg:https//www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html

步骤2:安装Java 11之后。确认所有版本的安装。在终端中键入以下命令。

/usr/libexec/java_home -V
Run Code Online (Sandbox Code Playgroud)

步骤3:编辑.bash_profile

sudo nano ~/.bash_profile
Run Code Online (Sandbox Code Playgroud)

步骤4:默认添加11.0.1。(将以下行添加到bash_profile文件中)。

export JAVA_HOME=$(/usr/libexec/java_home -v 11.0.1)
Run Code Online (Sandbox Code Playgroud)

切换到任何版本

export JAVA_HOME=$(/usr/libexec/java_home -v X.X.X)
Run Code Online (Sandbox Code Playgroud)

现在按CTRL + X退出bash。按“ Y”保存更改。

步骤5:重新载入bash_profile

source ~/.bash_profile
Run Code Online (Sandbox Code Playgroud)

步骤6:确认Java的当前版本

java -version
Run Code Online (Sandbox Code Playgroud)

  • 问题是询问 Open JDK,但您改为链接到 Oracle JDK。Open JDK 似乎没有安装程序或安装说明。 (3认同)