macOS - 如何安装 Java 17

Ram*_*ash 96 java macos javafx

有人可以告诉我在 Mac 上安装 Java 的步骤吗?

我做到了brew install java

我明白了

Warning: openjdk 17.0.1 is already installed and up-to-date.
To reinstall 17.0.1, run:
  brew reinstall openjdk
Run Code Online (Sandbox Code Playgroud)

如果我执行 java -version,我会得到这个。

openjdk version "13.0.8" 2021-07-20
Run Code Online (Sandbox Code Playgroud)

如果我导航到/Library/Java,我有 2 个空目录。

java 17安装在哪里?

fre*_*dev 233

到 2024 年,即使你只能使用brew..

\n
brew install openjdk@17 \n
Run Code Online (Sandbox Code Playgroud)\n

Java 将安装在这里:

\n
/usr/local/opt/openjdk@17/bin/java\n
Run Code Online (Sandbox Code Playgroud)\n

对于 Apple Silicon 来说,路径是/opt/homebrew/...而不是/usr/local/...

\n

为了让系统 Java 包装器找到这个 JDK,请将其符号链接为:

\n
sudo ln -sfn /usr/local/opt/openjdk@17/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk.jdk\n
Run Code Online (Sandbox Code Playgroud)\n

分别。用于硅

\n
sudo ln -sfn /opt/homebrew/opt/openjdk\\@17/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk.jdk\n
Run Code Online (Sandbox Code Playgroud)\n

现在,运行/usr/libexec/java_home -V应该显示 JAVA 17 的路径,如下所示:

\n
17.0.9 (x86_64) "Homebrew" - "OpenJDK 17.0.9" /usr/local/Cellar/openjdk@17/17.0.9/libexec/openjdk.jdk/Contents/Home\n
Run Code Online (Sandbox Code Playgroud)\n

(顺便说一句,这就是你所缺少的,如果javacjavac --version没有给你一个 command-not-found 而是一个The operation couldn\xe2\x80\x99t be completed. Unable to locate a Java Runtime.

\n

如果您看到错误的版本,请检查路径设置是否JAVA_HOME正确。如果没有,您可以通过以下方式设置:

\n
export JAVA_HOME=\\$(/usr/libexec/java_home)\n
Run Code Online (Sandbox Code Playgroud)\n

...尝试一下sdkman,这比brew

\n
curl -s "https://get.sdkman.io" | bash\n
Run Code Online (Sandbox Code Playgroud)\n

然后打开一个新的 shell并尝试list看看可以安装什么;-)

\n
sdk list java \n
Run Code Online (Sandbox Code Playgroud)\n

在撰写本文时,您可以使用:

\n
sdk install java 17.0.4.1-tem\n
Run Code Online (Sandbox Code Playgroud)\n

Java 将安装在这里:

\n
/Users/freedev/.sdkman/candidates/java/17.0.4.1-tem\n
Run Code Online (Sandbox Code Playgroud)\n

  • sdkman 是正确的选择!Eclipse 无法识别使用brew 安装的版本。 (9认同)
  • 有人可以向我解释为什么编程语言有不同的供应商吗?这对我来说是令人难以置信的,如果我想要一个 Python 版本,我就会得到那个版本。如果我想要一个 Go 版本,我就会得到那个版本。例如,如果我使用的是 macOS,那么一个供应商是否比另一个供应商更好? (3认同)
  • 在所有答案中,sdkman 是对我来说最好的解决方案。给它一个机会 (2认同)

rzw*_*oot 36

Java 不介意您安装多个版本。这通常是必需的;java 不向后兼容(它试图做很少的改变,但是例如 java8 到 java9 的转换破坏了很多东西,其中很多是不必要的,而且其中很多是库和应用程序无法合理预期或修复的,所以一堆 java 应用程序和库仅在 java8 上运行 - 只是一个示例)。

所以,是的,你已经安装了JDK17。另外,是的,如果你只是运行java而不指定你想要哪一个,那么你碰巧会在这里得到 java13。

要查看所有已安装的 java,您可以运行:

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

要“覆盖”,您可以使用类似的内容(取决于您在 Mac 上使用的 shell):

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

(反引号的意思是:运行它,然后获取它的输出并将其视为表达式的“值”。在这里,将其分配给 JAVA_HOME 环境变量。请求-v 17java 17 的路径。该-V选项列出了所有内容,用于您的眼球,而不是脚本。该-v选项主要用于脚本编写,这就是我们在这里使用它的方式)。

JAVA_HOME决定某些东西使用哪个 java,但是java当您键入时,您得到的java/usr/bin/java,并且该可执行文件实际上只是一个包装器,它从所有已安装的版本中选择要运行的 java。它使用 JAVA_HOME 来决定实际运行哪个 java。所有常用命令都有包装器(javac也)。您始终可以运行例如which javac来查看实际运行的内容;你可能会看到/usr/bin/javac。其中的所有内容/usr/bin都是这些包装器事物之一,它查看 JAVA_HOME,然后运行它在那里找到的二进制文件。


Ehu*_*Lev 27

指定版本 17

brew install openjdk@17
Run Code Online (Sandbox Code Playgroud)

后来我添加创建一个链接:

sudo ln -sfn /usr/local/opt/openjdk@17/libexec/openjdk.jdk \
     /Library/Java/JavaVirtualMachines/openjdk-17.jdk
Run Code Online (Sandbox Code Playgroud)

并使用jenv来控制使用哪个java版本


Joa*_*son 9

要使用 homebrew 安装的版本而不是操作系统安装的版本,您可以通过键入以下命令从 homebrew 获取详细信息

brew info java
Run Code Online (Sandbox Code Playgroud)

目前它指出

为了让系统 Java 包装器找到此 JDK,请使用 sudo ln -sfn /opt/homebrew/opt/openjdk/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk.jdk 进行符号链接

openjdk 是仅 keg 的,这意味着它没有符号链接到 /opt/homebrew 中,因为 macOS 提供了类似的软件,并行安装该软件可能会导致各种麻烦。

如果您需要首先在 PATH 中安装 openjdk,请运行: echo 'export PATH="/opt/homebrew/opt/openjdk/bin:$PATH"' >> ~/.zshrc

为了让编译器找到 openjdk,您可能需要设置:export CPPFLAGS="-I/opt/homebrew/opt/openjdk/include"


Puk*_*oni 7

对于 Homebrew,安装新 AdoptOpenJDK 的软件包被命名为 temurin。所以你需要使用以下命令:

brew install --cask temurin17
Run Code Online (Sandbox Code Playgroud)

如果您收到任何错误,例如 temurin cask not available,请使用以下命令更新brew:

brew update
brew tap homebrew/cask-versions
Run Code Online (Sandbox Code Playgroud)

要在不同版本的 java 之间快速切换,请根据您的 jdk 版本在 bashrc 中添加条目,例如:

alias j8="export JAVA_HOME=`/usr/libexec/java_home -v 1.8`; java -version"
alias j17="export JAVA_HOME=`/usr/libexec/java_home -v 17`; java -version"
Run Code Online (Sandbox Code Playgroud)