How to fix java.lang.UnsupportedClassVersionError: Unsupported major.minor version? [Answered]

Problem explained:

I am trying to use Notepad++ as my all-in-one tool to edit, run, compile, etc.

I have JRE installed, and I have setup my path variable to the .../bin directory.

When I run my “Hello world” in Notepad++, I get this message:

java.lang.UnsupportedClassVersionError: test_hello_world :
 Unsupported major.minor version 51.0
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(Unknown Source)
       .........................................

I think the problem here is about versions; some versions of Java may be old or too new.

  1. How do I fix it?
  2. Should I install the JDK, and setup my path variable to the JDK instead of JRE?
  3. What is the difference between the PATH variable in JRE or JDK?

How to fix java.lang.UnsupportedClassVersionError? Answer #1:

The version number shown describes the version of the JRE the class file is compatible with.

The reported major numbers are:

Java SE 17 = 61,
Java SE 16 = 60, 
Java SE 15 = 59,
Java SE 14 = 58,
Java SE 13 = 57,
Java SE 12 = 56,
Java SE 11 = 55,
Java SE 10 = 54,
Java SE 9 = 53,
Java SE 8 = 52,
Java SE 7 = 51,
Java SE 6.0 = 50,
Java SE 5.0 = 49,
JDK 1.4 = 48,
JDK 1.3 = 47,
JDK 1.2 = 46,
JDK 1.1 = 45

(Source: Wikipedia)

To fix the actual problem you should try to either run the Java code with a newer version of Java JRE or specify the target parameter to the Java compiler to instruct the compiler to create code compatible with earlier Java versions.

For example, in order to generate class files compatible with Java 1.4, use the following command line:

javac -target 1.4 HelloWorld.java

With newer versions of the Java compiler, you are likely to get a warning about the bootstrap class path not being set. More information about this error is available in a blog post New javac warning for setting an older source without bootclasspath.

Answer #2:

java.lang.UnsupportedClassVersionError happens because of a higher JDK during compile time and lower JDK during runtime.

In Eclipse, I just went to menu command Window -> Preferences -> Java -> Compiler and then set “Compiler compliance level” to 1.6.

Answer #3:

Don’t worry, I got it solved.

It is actually simple – you need to install BOTH JRE / JDK with the same version.

JRE 6 -> JDK 6

JRE 7 -> JDK 7

And so on.

Answer #4:

This error means you’re trying to load a Java “class” file that was compiled with a newer version of Java than you have installed.

For example, your .class file could have been compiled for JDK 7, and you’re trying to run it with JDK 6.

So the solution is to either:

  • Upgrade your Java runtime or
  • Recompile the class if you have the source, using your local Java compiler (if you have one).javac FileName.java

For developers, this can happen if another developer checks in a .class file, and they’ve got a newer version of java than you have!

Answer #5:

You are trying to run your program with a Java version that does not support the version in which the code was compiled. So basically you must have compiled your code with a higher version and trying to run it using a lower version.

As you are getting

Unsupported major.minor version 51.0

and version 51.0 corresponds to J2SE 7 you have most probably compiled your code in Java 7 and trying to run it using a lower version. Check what java -version displays. It should be the Java 7 version. If not make appropriate changes in the PATH/JAVA_HOME. Or you can compile with the same version you are trying to run the code. If the configurations are confusing you can always give absolute path /home/user/jdk1.7.0_11/bin/javac and /home/user/jdk1.7.0_11/bin/java.

Answer #6:

I had a similar situation on Mac, and the following process worked for me:

In the terminal, type

vi ~/.profile

Then add this line in the file, and save

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk<version>.jdk/Contents/Home

where version is the one on your computer, such as 1.7.0_25.

Exit the editor, then type the following command make it become effective

source ~/.profile 

Then type java -version to check the result

java -version 

What is .profile file?

.profile file is a hidden file. It is an optional file which tells the system which commands to run when the user whose profile file it is logs in. For example, if my username is bruno and there is a .profile file in /Users/bruno/, all of its contents will be executed during the log-in procedure.

Answer #7:

The most common issue is misconfiguration of your JAVA_HOME variable which should point to the right Java Development Kit library, if you’ve multiple installed.

To find where SDK Java folder is located, run the following commands:

jrunscript -e 'java.lang.System.out.println(java.lang.System.getProperty("java.home"));'

Debian/Ubuntu

To check which java (openjdk) you’ve installed, check via:

dpkg -l "openjdk*" | grep ^i

or:

update-java-alternatives -l

To change it, use:

update-alternatives --config java

Prefix with sudo if required.

to select the alternative java version.

Or check which are available for install:

apt-cache search ^openjdk

Prefix with sudo if required.

Then you can install, for example:

apt-get install openjdk-7-jre

Prefix with sudo if required.

Fedora, Oracle Linux, Red Hat

Install/upgrade appropriate package via:

yum install java-1.7.0-openjdk java-1.7.0-openjdk-devel

The java-1.7.0-openjdk package contains just the Java Runtime Environment. If you want to develop Java programs then install the java-1.7.0-openjdk-devel package.

BSD

There is an OpenJDK 7 package in the FreeBSD Ports collection called openjdk7 which probably needs to be reconfigured.

See: OpenJDK wiki page.

Windows

Just install appropriate Java SE Development Kit library from the Oracle site or install

Jenkins

If you’re experiencing this issue with Jenkins, see:

However, selecting the right version of Java (newer) with update-alternatives should work.

Answer #8:

How do I fix it?

This error means that the JRE that is being used to execute your class code does not recognise the version of Java used. Usually because the version of Java that generated your class file (i.e. compiled it) is newer.

To fix it, you can either

a) Compile your Java sources with the same, or older, version of the Java compiler as will be used to run it. i.e. install the appropriate JDK.

b) Compile your Java sources with the newer version of the Java compiler but in compatibility mode. i.e. use the -target parameter.

c) Run your compiled classes in a JRE that is the same, or newer, version as the JDK used to compile the classes.

You can check the versions you are currently using with javac -version for the compiler, and java -version for the runtime.

Should I install the JDK, and setup my PATH variable to the JDK instead of JRE?

For compilation, certainly, install and configure the specific JDK that you want.

For runtime, you can use the one that comes with the JDK or a standalone JRE, but regardless, make sure that you have installed the right versions and that you have configured your PATH such that there are no surprises.

What is the difference between the PATH variable in JRE or JDK?

The PATH environment variable tells the command shell where to look for the command you type. When you type java, the command shell interpreter will look through all the locations specified in the PATH variable, from left to right, to find the appropriate java runtime executable to run. If you have multiple versions of Java installed – i.e. you have the java executable in multiple locations specified in the PATH variable, then the first one encountered when going from left to right will be the one that is executed.

The compiler command is javac and only comes with the JDK. The runtime command is java and comes with the JDK and is in the JRE.

It is likely that you have one version (51.0 = Java 7) of javac installed, and you also have the same version of java installed, but that another previous version of java is appearing earlier in the PATH and so is being invoked instead of the one you expect.

Answer #9:

You have used a higher version of the JDK to compile and trying to run from a lower version of JDK/JRE.

To check this, see the version information:

javac -version

java -version

They will be different and javac will have a higher version number.

To get around this, run using java from the JDK version or if you have a newer JRE/JDK that will work as well.

which javac will tell you the location, for example, /usr/bin/javac. Just run directly using /usr/bin/java <program>.

OR you can set the environment variable as a permanent solution.

Answer #10:

I got the same problem with a project written in 1.7 and tried to execute in 1.6.

My solution in Eclipse:

  • Right click on your Project Properties -> Java Build Path -> Libraries
  • Select your JRE System Library and click Edit on the right, and choose the target JRE.
  • Now go to Java Compiler on the left, and change the Compiler compliance level to your target.

That worked for me.

Answer #11:

Based on this…

J2SE 8 = 52
J2SE 7 = 51
J2SE 6.0 = 50
J2SE 5.0 = 49
JDK 1.4 = 48
JDK 1.3 = 47
JDK 1.2 = 46
JDK 1.1 = 45

In Eclipse, right click on project in package explorer:

Build Path -> Configure Build Path

Under:

Java Build Path -> Libraries -> Add Library -> JRE System Library -> Installed JREs -> Search.

Add the required JRE by selecting the library in the list available after the search is complete.

Hope you learned something from this post.

Follow Programming Articles for more!

About ᴾᴿᴼᵍʳᵃᵐᵐᵉʳ

Linux and Python enthusiast, in love with open source since 2014, Writer at programming-articles.com, India.

View all posts by ᴾᴿᴼᵍʳᵃᵐᵐᵉʳ →