Java_HOME not found when changed shell from Bash to Zsh on OSX?

I stumbled upon your question when trying to solve the same issue while migrating from bash to oh-my-zsh. The reason it's not there is that there is no code setting it for zsh but there was for bash. Generally theres something exporting JAVA_HOME whenever a new bash window is opened so it's always set for you. There is a good thread where this might be happening on the Unix & Linux StackExchange site.

To do the same thing in zsh, you can edit the .zshrc which is run every time zsh starts. I found a sample .zshrc which got me most of the way. The key line being:

export JAVA_HOME=`/usr/libexec/java_home`

Here is the file which I appended to the end of my existing ~/.zshrc file:

#zshrc, interactive shell settings
export ZSH=$HOME/.zsh

# emacs integration
[[ $EMACS = t ]] && unsetopt zle

# env
if [[ -e /usr/libexec/java_home ]]; then
  export JAVA_HOME=`/usr/libexec/java_home`
fi

if [[ -e /usr/local/lib/node_modules ]]; then
  export NODE_PATH=/usr/local/lib/node_modules
fi

# path
export PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/X11/bin
export PATH=/opt/usr/sbin:/opt/sbin:/opt/usr/bin:/opt/bin:$PATH
export PATH=/usr/local/bin:/usr/local/sbin:$PATH
export PATH=$HOME/.cabal/bin:$PATH
export PATH=$HOME/.gem/ruby/1.8/bin:$PATH
export PATH=$JAVA_HOME/bin:$PATH
export PATH=$HOME/.bin:$PATH

setopt null_glob
# source all files in zsh root
for include in $ZSH/*.zsh; do
  source $include
done

# source all non-controlled files
for include in $ZSH/private/*.zsh; do
  source $include
done
unsetopt null_glob

Then source ~/.zshrc to run in the current shell (or just start a new one) and you should be able to see that it is set with export | grep JAVA_HOME.

I also ended up running mkdir ~/.zsh to create the directory this is looking for and removing the .cabal and .gem lines as they were not needed for me.


I have just installed Mac OS Catalina Version 10.15 and found that environment variables such as JAVA_HOME and others that have been set in my .bash_profile :

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home
export PATH=$JAVA_HOME/bin:$PATH
export ANDROID_HOME=/Users/mynziak/Library/Android/sdk
export PATH=$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools
export M2_HOME=/usr/local/Cellar/maven/3.6.2/libexec
export M2=${M2_HOME}/bin
export PATH=${PATH}:${M2_HOME}/bin

are not set in fact!

I saw % in terminal instead of general $ that means you are using a zsh shell instead of bash shell. With Catalina zsh is now the default shell and bash will be completely gone in the future.

oh-my-zsh shell: https://ohmyz.sh/

So you have to setup all environment variables in .zshrc file.

I just copy-pasted every variables from .bash_profile in to .zshrc and re-opened terminal.

Files .bash_profile and .zshrc are hidden (cmd+shift+. - show hidden files in finder) but can be found in path:

/Users/mynziak/.zshrc

but use own username!

enter image description here


When you set JAVA_HOME in a shell, then it is active and available only for that context, and it will be gone when you close that shell.

Instead either change global environment (or) your .bashrc to include it. So that every time you start a shell, the variable will be available.

edit the .profile or .bash_profile to include the JAVA_HOME.

export JAVA_HOME=`/usr/lib....`

and also below command will return the path for java home directory.

/usr/libexec/java_home -v 1.7

where 1.7 is the version you want.


export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)

export PATH=$JAVA_HOME/bin:$PATH

Add above 2 lines in ~/.bashrc or ~/.zshrc and reload the file using source command.

Tags:

Macos

Bash

Zsh