On macos catalina \'\'\'echo $VARIABLE\'\'\'
I see the value of the variable but java couldn\'t read the system variable.
In linux there is not a problem
Variables LD_LIBRARY_PATH / DYLD_LIBRARY_PATH are not passed to the environment of a child process on macOS if System Integrity Protect (SIP) is enabled.
To confirm :
#!/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
I believe that any given env variable in a process is not necessarily copied to any processes spawned from it.
So, here, your zsh process clearly has the LD_LIBRARY_PATH
env variable, but your java process does not.
If you set it like so:
LD_LIBRARY_PATH=/Applications/blabla
you'd get this behaviour. You're looking for:
export LD_LIBRARY_PATH=/Applications/blabla