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

58wvjzkj  于 2023-06-24  发布在  Java
关注(0)|答案(1)|浏览(141)

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

The operation couldn’t be completed. Unable to locate a Java Runtime.
Please visit http://www.java.com for information on installing Java.

与SDKMAN一起安装的JDK在我的系统上正常工作,SDKMAN通过从.bash_profile.zshrc获取sdkman-init.sh脚本,将JAVA_HOME设置为/Users/{user}/.sdkman/candidates/java/current。但是XCode Script Phase使用的是/bin/sh,它似乎不能读取这些类型的文件。
我尝试将JAVA_HOME导出到~/.profile/etc/profile等文件中。却毫无结果
经过一些研究,我发现这个输出来自对/usr/libexec/java_home的调用,没有产生任何结果。我还发现,在JAVA_HOME设置正确的终端中手动调用/usr/libexec/java_home并不能拾取它,所以在这种情况下玩弄JAVA_HOME是无用的:就是读不出来
那么,如何让/usr/libexec/java_home命令在MacOS上找到使用SDKMAN安装的JDK呢?

ndasle7k

ndasle7k1#

/usr/libexec/java_home似乎大部分没有文档,很难找到有关它如何工作的信息。结合网上找到的关于它的一些信息和一些尝试和错误,我设法欺骗/usr/libexec/java_home返回SDKMAN的当前JDK。
我们需要解决两个问题:

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

在MacOS上,手动安装的JDK安装在/Library/Java/JavaVirtualMachines中,看起来像这样(不详尽):

jdk-root-folder/
  Contents/
    Info.plist
    Home/
      <actual JDK files here>

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

  • /Library/Java/JavaVirtualMachines中为你的JDK创建一个文件夹,我将把我的文件夹命名为sdkman-current,但名字并不重要。
  • sdkman-current中创建Contents文件夹
  • Contents文件夹中创建一个名为Home的符号链接,链接到实际的JDK:
sudo ln -s /Users/{REPLACE_ME}/.sdkman/candidates/java/current /Library/Java/JavaVirtualMachines/sdkman-current/Contents/Home
  • Contents文件夹中创建一个Info.plist文件,包含以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CFBundleIdentifier</key>
    <string>sdkman.current</string>
    <key>CFBundleName</key>
    <string>SDKMAN Current JDK</string>
    <key>JavaVM</key>
    <dict>
        <key>JVMPlatformVersion</key>
        <string>9999</string>
        <key>JVMVendor</key>
        <string>Homebrew</string>
        <key>JVMVersion</key>
        <string>9999</string>
    </dict>
</dict>
</plist>

您可以在其中使用任何您想要的<string>值,但请注意,删除任何条目都会阻止/usr/libexec/java_home找到您的JDK。我将它的版本设置为9999,以便它总是由/usr/libexec/java_home返回的版本。

  • 检查是否一切正常:
➜  /usr/libexec/java_home
/Library/Java/JavaVirtualMachines/sdkman-current/Contents/Home
➜  /usr/libexec/java_home -V
Matching Java Virtual Machines (1):
    9999 (arm64) "Homebrew" - "SDKMAN Current JDK" /Library/Java/JavaVirtualMachines/sdkman-current/Contents/Home
/Library/Java/JavaVirtualMachines/sdkman-current/Contents/Home

现在,依赖/usr/libexec/java_home来查找JDK的东西应该可以工作,包括使用/bin/sh的XCode脚本构建阶段。

相关问题