如何在 MacOS 上使用 SDKMAN 使 /usr/libexec/java_home 找到安装的 JDK?

Rib*_*esg 7 xcode sh java-home sdkman

我正在使用 Kotlin 制作 iOS 应用程序,它依赖于从 XCode 调用 Gradle 的脚本构建阶段。使用 SDKMAN 安装 JDK 后,它不起作用并产生以下错误:

\n
The operation couldn\xe2\x80\x99t be completed. Unable to locate a Java Runtime.\nPlease visit http://www.java.com for information on installing Java.\n
Run Code Online (Sandbox Code Playgroud)\n

使用 SDKMAN 安装的 JDK 在我的系统上正常工作,SDKMAN通过从 或获取其脚本来设置JAVA_HOME为。但是 XCode Script Phase 使用,并且它似乎不读取此类文件。/Users/{user}/.sdkman/candidates/java/currentsdkman-init.sh.bash_profile.zshrc/bin/sh

\n

我尝试导出诸如、等JAVA_HOME文件,但没有结果。~/.profile/etc/profile

\n

经过一番研究,我发现这个输出是来自没有产生结果的调用/usr/libexec/java_home。我还发现,在正确设置的/usr/libexec/java_home终端内手动调用JAVA_HOME不会拾取它,因此JAVA_HOME在这种情况下玩弄是没有用的:它只是不读取它。

\n

那么,如何让/usr/libexec/java_home命令找到在 MacOS 上使用 SDKMAN 安装的 JDK?

\n

Rib*_*esg 15

似乎/usr/libexec/java_home大部分都没有记录,很难找到有关其工作原理的信息。结合网上找到的关于它的少量信息以及一些试验和错误,我设法/usr/libexec/java_home返回 SDKMAN\'s 当前的 JDK。

\n

我们需要解决两个问题:

\n
    \n
  • SDKMAN 安装的 JDK 看起来不像手动安装的 JDK
  • \n
  • SDKMAN 安装的 JDK 不在/usr/libexec/java_home已知的位置
  • \n
\n

在 MacOS 上,手动安装的 JDK 的安装方式如下/Library/Java/JavaVirtualMachines(非详尽):

\n
jdk-root-folder/\n  Contents/\n    Info.plist\n    Home/\n      <actual JDK files here>\n
Run Code Online (Sandbox Code Playgroud)\n

但 SDKMAN 只安装实际的 JDK 文件。解决方案是伪造 SDKMAN 未安装的所有内容:

\n
    \n
  • 为您的 JDK创建一个文件夹/Library/Java/JavaVirtualMachines,我将其命名为我的sdkman-current,但名称并不重要。
  • \n
  • Contents里面创建一个文件夹sdkman-current
  • \n
  • 创建一个在文件夹Home内命名的符号链接Contents,链接到您的实际 JDK:\n
    jdk-root-folder/\n  Contents/\n    Info.plist\n    Home/\n      <actual JDK files here>\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
  • 在文件夹中创建一个包含以下内容的Info.plist文件:\nContents
    <?xml version="1.0" encoding="UTF-8"?>\n<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\n<plist version="1.0">\n<dict>\n    <key>CFBundleIdentifier</key>\n    <string>sdkman.current</string>\n    <key>CFBundleName</key>\n    <string>SDKMAN Current JDK</string>\n    <key>JavaVM</key>\n    <dict>\n        <key>JVMPlatformVersion</key>\n        <string>9999</string>\n        <key>JVMVendor</key>\n        <string>Homebrew</string>\n        <key>JVMVersion</key>\n        <string>9999</string>\n    </dict>\n</dict>\n</plist>\n
    Run Code Online (Sandbox Code Playgroud)\n您可以在其中使用<string>您想要的任何值,但请注意,删除任何条目将阻止/usr/libexec/java_home找到您的 JDK。我将其版本设置为 9999,以便它始终是/usr/libexec/java_home.
  • \n
  • 检查一切是否正常:\n
    \xe2\x9e\x9c  /usr/libexec/java_home\n/Library/Java/JavaVirtualMachines/sdkman-current/Contents/Home\n\xe2\x9e\x9c  /usr/libexec/java_home -V\nMatching Java Virtual Machines (1):\n    9999 (arm64) "Homebrew" - "SDKMAN Current JDK" /Library/Java/JavaVirtualMachines/sdkman-current/Contents/Home\n/Library/Java/JavaVirtualMachines/sdkman-current/Contents/Home\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
\n

现在,依赖于/usr/libexec/java_home查找 JDK 的东西应该可以工作,包括使用/bin/sh.

\n