如果启用了“系统完整性保护”(SIP),则在 macOS 上,变量 LD_LIBRARY_PATH / DYLD_LIBRARY_PATH 不会传递到子进程的环境中。
确认方法:
#!/bin/zsh
cat << EOF > EnvDemo.java
public class EnvDemo {
public static void main(String[] args) throws Exception {
System.out.println(System.getenv("LD_LIBRARY_PATH"));
System.out.println(System.getenv("DYLD_LIBRARY_PATH"));
System.out.println(System.getenv("PATH"));
System.out.println(System.getenv("CUSTOM_FLAG"));
}
}
EOF
javac EnvDemo.java
export LD_LIBRARY_PATH=/usr/local/library
export DYLD_LIBRARY_PATH=/usr/local/library
export CUSTOM_FLAG=custom_flag
java EnvDemo
# null
# null
# /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/oracle-19-5
# custom_flag
echo "env | grep LD_LIBRARY_PATH"
env | grep LD_LIBRARY_PATH
# No output here
echo "env | grep DYLD_LIBRARY_PATH"
env | grep DYLD_LIBRARY_PATH
# No output here
我相信在一个进程中的任何给定环境变量不一定会被复制到从它生成的任何进程中。
因此,在这里,您的zsh进程明显具有LD_LIBRARY_PATH
环境变量,但是您的java进程没有。
如果您像这样设置:
LD_LIBRARY_PATH=/Applications/blabla
您将获得此行为。 您要寻找的是:
export LD_LIBRARY_PATH=/Applications/blabla
java
可执行文件(运行 which java
)。它可能是一个 shell 脚本,在运行真正的 java
之前设置了 LD_LIBRARY_PATH
。 - okapi