JDK 9 + Mac OS + jlink?

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
3个回答

5
您可以使用 which java 命令验证您的 JAVA_HOME 路径,并确保它指向默认安装路径,这通常应该是:
/Library/Java/JavaVirtualMachines...
< p > [例如,我将其用作export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/],然后您可以在Contents的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
它安装在/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/bin/jlink,谢谢!当定时器允许时,我将接受这个答案。然而,which java指示一个完全不同的目录,因为我更新了我的主帖子以显示。我不认为这是自定义更改,我相信这是默认设置。 - clay
@clay 可能尝试更新bash_profile以导出更新的JAVA_HOME,这可能也会修复which java - Naman

3

这里有一些重要的背景信息:理解Mac上的Oracle Java

标准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之后的某个时候,macOS添加了jshell的符号链接和包装器,但似乎没有为jlink做任何事情。

为了保持未来的一致性,建议编写一个等效的包装器,将其放在正确的位置,并在/usr/bin中添加一个符号链接。

不幸的是,由于包装器脚本位于/System下,因此您无法创建或修改任何内容,即使作为root也不行,直到禁用系统完整性保护。这需要几分钟时间并涉及几次重新启动,但很容易做到:

  1. Reboot your machine. While it reboots, hold down R. This will cause the machine to start up in Recovery Mode. You can release the keys when you see the progress bar.
  2. Once in Recovery Mode, choose Terminal from the Utilities menu.
  3. At the prompt, type csr disable. You'll be prompted to reboot to cause the changes to take place. Do that as well.
  4. Once you're back in regular mode, open Terminal and do the following:

    % sudo vi /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/jlink
    Password:
    
  5. Enter your password at the prompt.

  6. In vi, switch to Insert mode by pressing I, then enter the following text:

    #!/bin/bash
    $JAVA_HOME/bin/jlink $@
    
  7. Then exit Insert mode by pressing esc, and save and exit by typing :wq.

  8. Issue the following commands to make the script executable, create the symlink, make the symlink executable, and check your work:

    % 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. Now it's time to re-enable System Integrity Protection. Reboot back into Recovery Mode (instructions in step 1).

  10. Once in Recovery Mode, choose Terminal from the Utilities menu.
  11. At the prompt, type csr enable. You'll be prompted to reboot once more.

如果您不想禁用/重新启用SIP,可以在/usr/bin/jlink创建该脚本。

希望将来的macOS版本能默认包含这些内容。


只是一个跟进的说明:我以为我能够优化这些步骤,让你只进入一次恢复模式,然后在那里创建必要的文件。不幸的是,该磁盘将无法挂载。如果您对此感到舒适,我想有一种方法可以从恢复模式挂载磁盘,然后进行更改。 - JakeRobb
可能包装器应该看起来更像这样:"$(/usr/libexec/java_home)/bin/jlink" "${@}",因为它可以与当前激活的 JVM 一起使用。 - Cromax
已经有一段时间了,我需要重新验证,但是如果我没记错的话,我写了这个脚本来模仿/usr/bin中其他Java二进制包装脚本的行为。 - JakeRobb
使用${JAVA_HOME}有其优点,因为它允许您通过导出此变量的新值来随时更改JDK。但这也是一个缺点,因为您实际上必须导出它(JAVA_HOME默认未设置)。 - Cromax
这绝对是一个权衡。在我看来,由于我只是填补另一个解决方案中的空缺,将我的决定与他们的决定保持一致比独立做出决定更明智。如果他们不一致,那么/usr/bin/jlink可能会指向与/usr/bin/javac不同的JDK版本。那将是糟糕的! - JakeRobb
如果原始包装是shell脚本,我们可以正确对齐,因为我们会知道它们是如何做到的(你是对的 - 拥有不一致的环境并不明智),但是这些包装器是二进制文件,所以谁能说得准呢?... - Cromax

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。对于无法在Finder中找到.bashrc的新手,请按下⌘⇧(command shift dot)以显示隐藏文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接