Installing Oracle JDK on Windows subsystem for Linux

When trying to use the Linux version of Oracle's JDK on the latest Windows 10 build having support for bash, I am running into a problem with the prompt hanging whenever attempting to invoke the java binary.

Typing even something as simple as java -version hangs and I have to terminate the process to resume control.

Anyone got this working yet?


Solution 1:

I wanted to clarify that as of 9 December 2016, you most certainly can install Java 8 on Ubuntu Bash for Windows 10 and that @Karl Horton is correct.

You will need to install unzip sudo apt-get install unzip

Copy this script somewhere in your bash for windows session and make it executable (chmod +x filename). If you do not use a command line based editor such as vim then you will have windows line endings to deal with. you can use dos2unix or your preferred way of dealing with that. I just paste it into a file using vim.

 #!/bin/bash

set -ex

# UPDATE THESE URLs
export JDK_URL=http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.tar.gz
export UNLIMITED_STRENGTH_URL=http://download.oracle.com/otn-pub/java/jce/8/jce_policy-8.zip

# Download Oracle Java 8 accepting the license
wget --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" \
${JDK_URL}
# Extract the archive
tar -xzvf jdk-*.tar.gz
# clean up the tar
rm -fr jdk-*.tar.gz
# mk the jvm dir
sudo mkdir -p /usr/lib/jvm
# move the server jre
sudo mv jdk1.8* /usr/lib/jvm/oracle_jdk8

# install unlimited strength policy
wget --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" \
${UNLIMITED_STRENGTH_URL}
unzip jce_policy-8.zip
mv UnlimitedJCEPolicyJDK8/local_policy.jar /usr/lib/jvm/oracle_jdk8/jre/lib/security/
mv UnlimitedJCEPolicyJDK8/US_export_policy.jar /usr/lib/jvm/oracle_jdk8/jre/lib/security/

sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/oracle_jdk8/jre/bin/java 2000
sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/oracle_jdk8/bin/javac 2000

sudo echo "export J2SDKDIR=/usr/lib/jvm/oracle_jdk8
export J2REDIR=/usr/lib/jvm/oracle_jdk8/jre
export PATH=$PATH:/usr/lib/jvm/oracle_jdk8/bin:/usr/lib/jvm/oracle_jdk8/db/bin:/usr/lib/jvm/oracle_jdk8/jre/bin
export JAVA_HOME=/usr/lib/jvm/oracle_jdk8
export DERBY_HOME=/usr/lib/jvm/oracle_jdk8/db" | sudo tee -a /etc/profile.d/oraclejdk.sh

And now I can do the following

fieldju@DESKTOP-LTL6MIC:~$ java -version
java version "1.8.0_112"
Java(TM) SE Runtime Environment (build 1.8.0_112-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.112-b15, mixed mode)                                                

The links and versions in the above script are likely to be out of date by the time you read this, so just head over to http://www.oracle.com/technetwork/java/javase/downloads/index.html accept the license so that their js lets you copy the new URLs and you should be good to go.

Solution 2:

It seems in 2017 august the solution is simpler as suggested by @noah-david.

I was able to install Oracle JDK 8 from the “WebUpd8” team repository.

Instructions. To add the repository:

sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update

To install:

sudo apt-get install oracle-java8-installer 
sudo apt install oracle-java8-set-default

After install

costin@amanta-win:/mnt/c/work$ java -version
java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)

costin@amanta-win:/mnt/c/work$ which java
/usr/bin/java

costin@amanta-win:/mnt/c/work$ uname -a
Linux amanta-win 4.4.0-43-Microsoft #1-Microsoft Wed Dec 31 14:42:53 PST 2014 
  x86_64 x86_64 x86_64 GNU/Linux

Solution 3:

I must be missing something... all I did was:

sudo apt-get update
sudo apt-get install default-jdk

java -version

output:

java version "1.7.0_131"
OpenJDK Runtime Environment (IcedTea 2.6.9) (7u131-2.6.9-0ubuntu0.14.04.2)
OpenJDK 64-Bit Server VM (build 24.131-b00, mixed mode)

Solution 4:

I used the script given by @fieldju but he missed some things that the script depends on, and also copy/pasting the contents results in having windows line endings/carriage returns (/r) which will need replacing to linux returns. Also, I found it a lot more straightforward to download the zips needed first and put them alongside the script. Here's a full list of what I did:

  1. In bash, type sudo apt-get install zip unzip to make sure unzip/zip is installed on your bash console
  2. Download the latest Linux version of the Java JDK from the oracle website (I have a 64 bit system so I chose "Linux x64") and save it in a folder somewhere on your computer that you can get to in bash NOTE: don't change the file name to ensure it works with the script
  3. Download the unlimited strength policy seperately in the same folder as the last zip, again ensuring you keep the filename as-is.
  4. Copy and paste the following script into notepad and save it as java_install_predownloaded.sh in the same folder alongside the zips:

Script:

#!/bin/bash

# Extract the archive
tar -xzvf jdk-*.tar.gz

# mk the jvm dir
sudo mkdir -p /usr/lib/jvm
# move the server jre
sudo mv jdk1.8* /usr/lib/jvm/oracle_jdk8

# install unlimited strength policy
mv UnlimitedJCEPolicyJDK8/local_policy.jar /usr/lib/jvm/oracle_jdk8/jre/lib/security/
mv UnlimitedJCEPolicyJDK8/US_export_policy.jar /usr/lib/jvm/oracle_jdk8/jre/lib/security/

sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/oracle_jdk8/jre/bin/java 2000
sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/oracle_jdk8/bin/javac 2000

sudo echo "export J2SDKDIR=/usr/lib/jvm/oracle_jdk8
export J2REDIR=/usr/lib/jvm/oracle_jdk8/jre
export PATH=$PATH:/usr/lib/jvm/oracle_jdk8/bin:/usr/lib/jvm/oracle_jdk8/db/bin:/usr/lib/jvm/oracle_jdk8/jre/bin
export JAVA_HOME=/usr/lib/jvm/oracle_jdk8
export DERBY_HOME=/usr/lib/jvm/oracle_jdk8/db" | sudo tee -a /etc/profile.d/oraclejdk.sh

This code is a modified version from @fieldju which assumes the zips are already downloaded and in the same folder as this .sh file

  1. because the file has the windows carriage returns you need to ensure they are replaced, so in bash navigate to where you saved java_install_predownloaded.sh and run the following command:

    sed 's/^M$//' java_install_predownloaded.sh > java_install_predownloaded_unix.sh

I also then ran the following to ensure there are definitely no line endings from windows:

sed 's/\r$//' java_install_predownloaded_unix.sh > java_install_predownloaded_unix_final.sh

  1. After running those 2 lines, a file called java_install_predownloaded_unix_final.sh will be in the folder which is our 'cleaned' version without the windows line endings, so you just need to execute ./java_install_predownloaded_unix_final.sh in bash and watch the magic happen. Hey Presto you now have java installed on your bash instance on windows!