我正在使用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呢?
1条答案
按热度按时间ndasle7k1#
/usr/libexec/java_home
似乎大部分没有文档,很难找到有关它如何工作的信息。结合网上找到的关于它的一些信息和一些尝试和错误,我设法欺骗/usr/libexec/java_home
返回SDKMAN的当前JDK。我们需要解决两个问题:
/usr/libexec/java_home
知道的位置在MacOS上,手动安装的JDK安装在
/Library/Java/JavaVirtualMachines
中,看起来像这样(不详尽):但是SDKMAN只安装实际的JDK文件。解决方案是伪造SDKMAN没有安装的所有内容:
/Library/Java/JavaVirtualMachines
中为你的JDK创建一个文件夹,我将把我的文件夹命名为sdkman-current
,但名字并不重要。sdkman-current
中创建Contents
文件夹Contents
文件夹中创建一个名为Home
的符号链接,链接到实际的JDK:Contents
文件夹中创建一个Info.plist
文件,包含以下内容:您可以在其中使用任何您想要的
<string>
值,但请注意,删除任何条目都会阻止/usr/libexec/java_home
找到您的JDK。我将它的版本设置为9999,以便它总是由/usr/libexec/java_home
返回的版本。现在,依赖
/usr/libexec/java_home
来查找JDK的东西应该可以工作,包括使用/bin/sh
的XCode脚本构建阶段。