JDK 9 + Mac OS + jlink?

时间:2017-09-25 18:46:21

标签: java macos java-9 jigsaw jlink

我在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

3 个答案:

答案 0 :(得分:3)

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

/Library/Java/JavaVirtualMachines...

[例如我将它用作export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/] 您还可以在内容

的bin文件夹中找到jlink
find /Library/Java/JavaVirtualMachines/jdk-9.jdk -iname jlink\* 

应返回

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

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

enter image description here

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

答案 1 :(得分:2)

要将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。对于在Finder中找不到.bashrc的新手:按⌘⇧。 (命令移位点)显示隐藏文件。

答案 2 :(得分:1)

这里有一些重要的上下文: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发行之后的某个时刻,jshell的符号链接和包装器已添加到macOS,但看来jlink并没有做任何事情。

为使事情持续进行,我建议编写一个等效的包装器,将其放在正确的位置,并在/usr/bin中为其添加符号链接。

不幸的是,由于包装程序脚本位于/System下,因此除非禁用系统完整性保护,否则您无法创建或修改任何内容,即使是root用户也是如此。这需要几分钟的时间,并且需要重新启动几次,但是很容易做到:

  1. 重新启动计算机。重新启动时,按住 R 。这将导致机器以恢复模式启动。您可以在看到进度条时释放键。
  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 退出插入模式,并通过键入 w q 。

  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的某些将来版本默认包含这些内容。