How to know if I am using Open JDK or Oracle JDK?

Call sun.misc.Version#println in java code will dump the version info to stderr. If you want to fetch the JDK version from java code.

package bj.tmp;

import sun.misc.Version;

public class Foo {
    public static void main(String[] args) {
        Version.println();
    }
}

Like this:

java version "1.8.0_192"
Java(TM) SE Runtime Environment (build 1.8.0_192-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.192-b12, mixed mode)

Based on actual test I did on my system by using Oracle JDK and OpenJDK:

Option 1

  • You can execute the java –version command and in the case of OpenJDK you will clearly see “openjdk” in the output while in case of Oracle JDK you will se “Hotspot” in the output. That's how you can differentiate.
  • Below is actual from my system:

C:\Users\himanshu.agrawal>"C:\E_Drive\Softwares\OpenJDK-java-se-7u75-ri\jre\bin\java" -version
openjdk version "1.7.0_75"
OpenJDK Runtime Environment (build 1.7.0_75-b13)
OpenJDK Client VM (build 24.75-b04, mixed mode)

C:\Users\himanshu.agrawal>java -version
java version "1.8.0_301"
Java(TM) SE Runtime Environment (build 1.8.0_301-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.301-b09, mixed mode)

Option 2

  • You can use java.vm.name or java.runtime.name system property.
  • I think since Oracle is still the key contributor / responsible for the OpenJDK project so if you use java.vm.vendor or java.specification.vendor you still get Oracle as the vendor.
  • Below actual output from my system for these properties:

// when using OpenJDK
java.vm.name = OpenJDK 64-Bit Server VM
java.runtime.name = OpenJDK Runtime Environment
java.vm.vendor = "Oracle Corporation"
java.specification.vendor = Oracle Corporation

// when using Oracle JDK
java.vm.name = Java HotSpot(TM) 64-Bit Server VM
java.runtime.name = Java(TM) SE Runtime Environment
java.vm.vendor = Oracle Corporation
java.specification.vendor = Oracle Corporation

I think that you're using OracleJDK.

As I saw with a google search, the openJDK --version output is like this:

java -version

openjdk version "1.8.0-internal"

OpenJDK Runtime Environment (build 1.8.0-internal-0)

OpenJDK 64-Bit Zero VM (build 25.0-b20-internal, interpreted mode)

See: http://mail.openjdk.java.net/pipermail/jdk8-dev/2013-July/002840.html


On debian, jessie-backports, openjdk-8:

openjdk version "1.8.0_66-internal"
OpenJDK Runtime Environment (build 1.8.0_66-internal-b17)
OpenJDK 64-Bit Server VM (build 25.66-b17, mixed mode)

Using the ubuntu ppa for oracle-java-8:

java version "1.8.0_66"
Java(TM) SE Runtime Environment (build 1.8.0_66-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.66-b17, mixed mode)

I would assume, the string "java" at the beginning denotes Oracle Java, whereas the OpenJDK gets you "openjdk".