9

我在 Mac OS 上安装了 JDK 9 的发行版。

jshell 很好用,Jigsaw 模块支持很好用,但是没有 jlink:

➜  java --version
java 9
Java(TM) SE Runtime Environment (build 9+181)
Java HotSpot(TM) 64-Bit Server VM (build 9+181, mixed mode)

这是空的:

find /System/Library/Frameworks/JavaVM.framework/Versions/Current/ -iname jlink\*

供参考:

➜  ls -l $(which java)
lrwxr-xr-x  1 root  wheel  74 Nov  7  2016 /usr/bin/java -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java
4

3 回答 3

5

您可以验证您的JAVA_HOME使用which java并确保它指向默认安装路径,理想情况下应该是

/Library/Java/JavaVirtualMachines...

[例如,我将其用作export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/],您还可以jlink 在 Contents 的 bin 文件夹中找到

find /Library/Java/JavaVirtualMachines/jdk-9.jdk -iname jlink\* 

应该返回

/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/bin

附上屏幕截图以供参考其安装位置:-

在此处输入图像描述

注意:虽然在屏幕截图中,该命令未成功运行,但已被识别。

于 2017-09-25T18:48:59.047 回答
3

要将 JDK 9 工具添加到您的路径,请将以下内容添加到.bashrc您的主目录的文件中:

export JAVA_HOME=$(/usr/libexec/java_home -v 9)
export PATH="$JAVA_HOME/bin:$PATH"

你注意到了-v 9吗?如果您想切换回 JDK 1.8,可以将其更改为 1.8。对于无法.bashrc在 Finder 中找到的任何新手:按 ⌘⇧。(命令移位点)显示隐藏文件。

于 2017-09-26T12:31:36.087 回答
3

这里有一些重要的上下文:Understanding Oracle's Java on Mac

标准 JDK 实用程序(java、javac 等)实际上安装在/Library/Java/JavaVirtualMachines/(JDK_VERSION)/Contents/Home/bin.

/usr/bin位于路径中,在该目录中您会找到所有常用的 JDK 实用程序。当您键入java(或任何其他命令)时,它会找到那些,但它们实际上是指向具有相同名称的可执行文件的符号链接/System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands。这些可执行文件只是询问您的 JAVA_HOME 环境变量(应该指向实际安装位​​置)并调用在那里找到的真实二进制文件的包装器。我不清楚为什么有人认为这两层抽象是必要的,但事实就是如此。

在 Java 9 发布后的某个时候,jshellmacOS 中添加了符号链接和包装器,但似乎没有为jlink.

为了让事情继续向前发展,我建议编写一个等效的包装器,将它放在正确的位置,并在/usr/bin.

不幸的是,由于包装脚本位于 下/System,因此在禁用系统完整性保护之前,您无法创建或修改任何内容,即使以 root 身份也是如此。这需要几分钟并需要重新启动几次,但很容易做到:

  1. 重新启动您的机器。当它重新启动时,按住⌘</kbd>R. This will cause the machine to start up in Recovery Mode. You can release the keys when you see the progress bar.
  2. 进入恢复模式后,从实用程序菜单中选择终端。
  3. 在提示符下,键入csr disable。系统将提示您重新启动以使更改发生。也这样做。
  4. 回到常规模式后,打开终端并执行以下操作:

    % sudo vi /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/jlink
    Password:
    
  5. 在提示符处输入您的密码。

  6. vi中,按 切换到插入模式I,然后输入以下文本:

    #!/bin/bash
    $JAVA_HOME/bin/jlink $@
    
  7. 然后按 退出插入模式esc,然后键入 保存并退出:wq

  8. 发出以下命令以使脚本可执行、创建符号链接、使符号链接可执行并检查您的工作:

    % sudo chmod +x /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/jlink
    % sudo ln -s /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/jlink /usr/bin/jlink
    % sudo chmod +x /usr/bin/jlink
    % ls -la $(which jlink)
    lrwxr-xr-x  1 root  wheel    75B Jun 19 10:33 /usr/bin/jlink@ -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/jlink
    % ls -la $(which java) 
    lrwxr-xr-x  1 root  wheel    74B Sep 25  2017 /usr/bin/java@ -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java
    % jlink --version
    10.0.1
    % 
    
  9. 现在是时候重新启用系统完整性保护了。重新启动进入恢复模式(步骤 1 中的说明)。

  10. 进入恢复模式后,从实用程序菜单中选择终端。
  11. 在提示符下,键入csr enable。系统将提示您再次重新启动。

如果您不想禁用/重新启用 SIP,您可以在/usr/bin/jlink.

希望某些未来版本的 macOS 将默认包含这些。

于 2018-06-19T13:58:34.483 回答