JDK9+MacOS+jlink?
JDK 9 + Mac OS + 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
您可以使用 which java
验证您的 JAVA_HOME
并确保它指向默认安装路径,理想情况下应该是
/Library/Java/JavaVirtualMachines...
[例如我用它作为 export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/
]
此外,您可以在 Contents
的 bin 文件夹中找到 jlink
find /Library/Java/JavaVirtualMachines/jdk-9.jdk -iname jlink\*
哪个应该return
/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/bin
附上屏幕截图以供参考其安装位置:-
注意:虽然在屏幕截图中,命令没有运行成功,但它被识别了。
要将 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
的任何新手:按 ⌘⇧。 (命令 shift 点)显示隐藏文件。
这里有一些重要的上下文: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 用户,直到您禁用系统完整性保护。这需要几分钟时间并需要重新启动几次,但很容易做到:
- 重启你的机器。在它重新启动时,按住 ⌘R。这将导致机器以恢复模式启动。当您看到进度条时,您可以松开按键。
- 进入恢复模式后,从实用程序菜单中选择终端。
- 在提示符下,键入
csr disable
。系统将提示您重新启动以使更改生效。也这样做。
回到常规模式后,打开终端并执行以下操作:
% sudo vi /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/jlink
Password:
在提示符处输入密码。
在vi
中,按I切换到插入模式,然后输入以下文本:
#!/bin/bash
$JAVA_HOME/bin/jlink $@
然后按esc退出插入模式,输入:保存退出wq.
发出以下命令使脚本可执行,创建符号链接,使符号链接可执行,并检查您的工作:
% 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
%
现在是时候重新启用系统完整性保护了。重新启动回到恢复模式(步骤 1 中的说明)。
- 进入恢复模式后,从实用程序菜单中选择终端。
- 在提示符下,键入
csr enable
。系统将再次提示您重新启动。
如果您不想弄乱 disabling/re-enabling SIP,您可以在 /usr/bin/jlink
.
创建脚本
希望 macOS 的某些未来版本默认包含这些。
我在 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
您可以使用 which java
验证您的 JAVA_HOME
并确保它指向默认安装路径,理想情况下应该是
/Library/Java/JavaVirtualMachines...
[例如我用它作为 export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/
]
此外,您可以在 Contents
jlink
find /Library/Java/JavaVirtualMachines/jdk-9.jdk -iname jlink\*
哪个应该return
/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/bin
附上屏幕截图以供参考其安装位置:-
注意:虽然在屏幕截图中,命令没有运行成功,但它被识别了。
要将 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
的任何新手:按 ⌘⇧。 (命令 shift 点)显示隐藏文件。
这里有一些重要的上下文: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 用户,直到您禁用系统完整性保护。这需要几分钟时间并需要重新启动几次,但很容易做到:
- 重启你的机器。在它重新启动时,按住 ⌘R。这将导致机器以恢复模式启动。当您看到进度条时,您可以松开按键。
- 进入恢复模式后,从实用程序菜单中选择终端。
- 在提示符下,键入
csr disable
。系统将提示您重新启动以使更改生效。也这样做。 回到常规模式后,打开终端并执行以下操作:
% sudo vi /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/jlink Password:
在提示符处输入密码。
在
vi
中,按I切换到插入模式,然后输入以下文本:#!/bin/bash $JAVA_HOME/bin/jlink $@
然后按esc退出插入模式,输入:保存退出wq.
发出以下命令使脚本可执行,创建符号链接,使符号链接可执行,并检查您的工作:
% 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 %
现在是时候重新启用系统完整性保护了。重新启动回到恢复模式(步骤 1 中的说明)。
- 进入恢复模式后,从实用程序菜单中选择终端。
- 在提示符下,键入
csr enable
。系统将再次提示您重新启动。
如果您不想弄乱 disabling/re-enabling SIP,您可以在 /usr/bin/jlink
.
希望 macOS 的某些未来版本默认包含这些。