Unsupported major.minor 52.0 exception in Java - java

Given such an exception:
java.lang.UnsupportedClassVersionError: com/sun/tools/javac/Main : Unsupported major.minor version 52.0
And I know this is because that the JDK and JRE are not compatible. However, when I type in:
which java
The output is:
/usr/java/jdk1.6.0_24/bin/java
And when typing in:
which javac
The output is:
/usr/java/jdk1.6.0_24/bin/javac
It is the compatible in version. So what's the problem?

The problem is typically caused by this sequence:
Code is compiled with new JDK, and "target" set to current version of Java.
Attempt to run the code with an older JDK or JRE.
In this case, minor version 52 means that something has been compiled with a Java 8 JDK, and with Java 8 as the target platform, and that you are attempting to run it on an older JRE / JDK.
You could also have gotten a JAR file from somewhere else that was compiled for Java 8.
To solve your problem, you need to figure out:
which class file or files have the version number problem (the exception message should tell you the first one ...),
where the class file came from (from a JAR file? from the file system?), and then
how come it was compiled with Java 8 though you thought you were compiling with Java 6.
It is an indisputable fact that the class that won't load was compiled using Java 8 (or later) compiler. You need to figure out why, and then either recompile it with the older JDK, or run it with Java 8.

it says version 52.0 so you should install java 8.

Check if tools.jar used during compilation complies with the JRE set. If you are on eclipse, verify the versions as:
Goto Window->Preferences
Check Ant Runtime by selecting Runtime under Ant in the left pane. Check the Global Entries under classpath tab. You can see the version in folder path.
On the left pane check installed JREs under Java. Check the version.

Related

Launch4j-FakeMain compiled by more recent version Java Runtime(class file version 55 0)this Java Runtime only recognizes class file version up to 52 0

This is my first application that i try to execute exe.
I'm using launch4j to do this. After executing and trying to run, I get this error:
Blockquote
Launch4j - Exception in thread "main" java.lang.UnsupportedClassVersionError: FakeMain has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
I searched something about versions of java, so I checked my versions of java and they are the same.
That's my versions of java:
My versions of java in cmd
Maybe I did something wrong there?
Screen of Launch4j
I don't know what I can do. I spend all this day about fix this and nothing.
Error after try to run exe file
You have compiled the code with Java 11 as target. But your PC want's to execute the Java Code with Version 8, which is not possible.
Make sure you have installed the correct Versions and also make sure that the executable uses Java 11.
Here you can find the Java Versions mapped to the Runtime Versions: Java Version Numbers
The Article gives you also some information about how to compile and execute for the correct versions.

java.lang.UnsupportedClassVersionError: javax/servlet/ServletException : Unsupported major.minor version 51.0 [duplicate]

I am trying to use Notepad++ as my all-in-one tool 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.
How do I fix it?
Should I install the JDK, and setup my path variable to the JDK instead of JRE?
What is the difference between the PATH variable in JRE or JDK?
The version number shown describes the version of the JRE the class file is compatible with.
The reported major numbers are:
Java SE 19 = 63,
Java SE 18 = 62,
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.
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.
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.
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!
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.
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.
Source: http://computers.tutsplus.com/tutorials/speed-up-your-terminal-workflow-with-command-aliases-and-profile--mac-30515
In Eclipse's menu Window -> Preferences -> Java -> Compiler check also "Configure Project Specific Settings".
If you stil have the error with same Java version: try to delete build folder of your project manually. Then restart Eclipse.
You can have some JAR library compiled in Java 7, and you have only Java 6 as Java Runtime. It could happen with some new libraries.
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:
JENKINS-30561 - Unable to launch agent using SSH
However selecting the right version of Java (newer) with update-alternatives should work.
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.
I have faced the same problem when I was working with an Ant script to build my application.
I use Eclipse for my application development, and I changed the compiler version in build properties of the project. But that didn't work for me. Then I found out that I can provide the compiler version in the Ant script.
I modified the Ant script at the section where it compile Java files.
<target name="build-java" depends="prepare-build">
<echo message="Compiling java files"/>
<javac ....
target="1.5"...
</javac>
</target>
This worked for me to resolve the unsupported major minor issue.
When I installed JDK 1.7, the problem got solved.
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.
As answered elsewhere by several people, the Java program is being run on an older version of Java than the one it was compiled it for. It needs to be "crosscompiled" for backward compatibility. To put it another way, there is a mismatch between source and target Java versions.
Changing options in Eclipse menus don't answer the original poster, who said he/she is not using Eclipse. On OpenJDK javac version 1.7, you can crosscompile for 1.6 if you use parameters -source and -target, plus provide the rt.jar -file of the target version (that is, the older one) at compile time. If you actually install the 1.6 JRE, you can point to its installation (for example, /usr/lib/jvm/java-6-openjdk-i386/jre/lib/rt.jar on Ubuntu, /usr/jdk/jdk1.6.0_60/jre/lib/rt.jar on SunOS apparently. Sorry, I don't know where it is on a Windows system). Like so:
javac -source 1.6 -target 1.6 -bootclasspath /usr/lib/jvm/java-6-openjdk-i386/jre/lib/rt.jar HelloWorld.java
It looks like you can just download rt.jar from the Internet, and point to it. This is not too elegant though:
javac -source 1.6 -target 1.6 -bootclasspath ./rt.jar HelloWorld.java
If you use Maven, set your Java compile level. Open a command line and write java -version for your compile level:
If you use IntelliJ IDEA, select project → File → Settings → Build Execution Deployment → Compiler → Java Compiler. Then change byte code as 1.7 like this image:
If you're facing this issue while using Maven, you can compile your code using the plug-in Maven Compiler.
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
.....
UPDATE: set source and target to 1.8, if you are using JDK 8.
I had the same error message when running Ant from Eclipse, but the other solutions mentioned here didn't solve my problem. The funny thing was that running Ant from the Windows command line was running fine, so it had to be a configuration issue within Eclipse.
It turned out that under Eclipse you can specify the environment that Ant should be running with and this was set as a JRE instead of a JDK.
Go to: Run -> External Tools -> External Tools Configurations ...
Select the Ant build.xml for your project (if you have multiple projects)
Activate the Tab 'JRE'
Here was selected 'Separate JRE: jre6'. When I changed this to a JDK from the 1.6 or 1.7 series, the error was gone.
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.
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.
Had this problem when I reverted to Java 6 and tried to run classes previously compiled with Java 7. What worked for me was Preferences > java > compiler --> set compliance level to 1.6 and crucially "configure project settings"..
Today, this error message appeared in our Tomcat 7 on Ubuntu 12.04.2 LTS (Precise Pangolin):
/var/log/tomcat7/localhost.2014-04-08.log:
Apr 8, 2014 9:00:55 AM org.apache.catalina.core.StandardContext filterStart
SEVERE: Exception starting filter struts2
java.lang.UnsupportedClassVersionError: controller/ReqAccept : Unsupported major.minor version 51.0 (unable to load class controller.ReqAccept)
The Struts application is compiled with Java 7.
It turned out, someone uses "service tomcat [stop/start]" to restart Tomcat 7,
$ ps -ef | grep java
tomcat7 31783 1 32 20:13 ? 00:00:03 /usr/lib/jvm/default-java/bin/java...
$ /usr/lib/jvm/default-java/bin/java -version
java version "1.6.0_27"
Which causes the "Unsupported major.minor version 51.0" error.
When we used "/etc/init.d/tomcat7 [stop/start]" to restart Tomcat 7, the problem was solved.
$ ps -ef | grep java
tomcat7 31886 1 80 20:24 ? 00:00:10 /usr/local/java/jdk1.7.0_15/bin/java
$ /usr/local/java/jdk1.7.0_15/bin/java -version
java version "1.7.0_15"
I solved it. I ran:
JAVA_HOME=/usr/lib/jvm/java-7-openjdk-i386
The error is misleading, Unsupported major.minor version 51.0. This gives the impression that version 51 (Java 7) is not supported. And we should use Java 6.
The error should have been:
The current Java version, 50, is unsupported. Use Java version 7 (51:0 and greater) instead.`
Your Java file is compiled with a different version (higher compiler version) than the version (lower runtime version) you are trying to run it with.
It is basic understanding that classes compiled with lower versions are expected to run in the later higher versions. But the opposite (compiled with higher compiler version and trying to run it with lower runtime version) is quite not possible sometimes.
Hence you are shown this error, when trying to execute your program. Unsupported major.minor version x.x
Q: I have created an application in Java 7, but when my users try to
run it they get an Unsupported major.minor version 51.0 error. What
does this mean and what can I do about it?
A: If you compile an application using javac in Java 7, the resulting classfiles will have the 51.0 version number. Versions of
Java prior to 7 do not recognize this number, so your users will have
to upgrade to Java 7 prior to running your application. If you are not
using any Java 7 APIs you can try to compile your application using
javac -target 1.6 to create a 1.6-compatible classfile. If your
application is deployed using webstart you can specify the minimum
version required. For more information, see the docs on Java Web Start
and JNLP here. This issue will go away once we trigger autoupdate to
Java 7 for end-users currently having Java 6 on their desktops. The
timeline for this is not yet determined, we want to give developers
time to work out any issues between their code and JDK 7 first.
(Source: oracle.com.)
Oh Mac OS X I was able to solve this problem by setting the JAVA_HOME variable:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home
First let's get some basics right...
JRE is a component in NetBeans/Eclipse/standalone that is going to provide you with libraries, JVM, Java plugins & Java web start. Note that it does not provide compliers or debuggers.
JDK is the superset of JRE along with compliers and debuggers.
So when you have your default library as a JRE instead of JDK, you are going to have a nice time importing stuff, but it won't compile.
Instead, set your path to JDK (I use NetBeans, and I set them using netbeans.conf in netbeans/etc/netbeans.conf and change the path).
In my case the problem was in the server runtime configuration:
Check the JRE is the version you need:
The project was in version 1.7 and the server JRE was set as 1.6, after changing to the proper java version it's launched fine.
I had the problem whereby I was having to run a Maven compilation on my project from the command line in order to run my unit tests; if I made a change to the test class and let Eclipse automatically recompile it, then I got the "Unsupported major.minor version 51.0" error.
I do have both JDK6 and JDK7 installed, but all my JRE settings were pointing at 1.6, both in the pom and from the project properties page in Eclipse. No amount of Maven Update Project and/or refreshing solved this.
Finally I tried closing the project and re-opening it, and this seemed to fix it! HTH
You have compiled your Java class with JDK 7 and you are trying to run same class on JDK 6 .
Install JDK 7.0.55 and set the Java for Eclipse for JDK 7.0.55.
Build the project with JDK 7.0.55 by configuring on build path JDK 7.0.55.
Set the compiler in Eclipse for JDK 7.0.55 by menu Windows -> Preferences -> Java -> Compiler - choose 1.7.

java.lang.UnsupportedClassVersionError: Unsupported major.minor version 51.0 (unable to load class org.eclipse.core.runtime.Platform) [duplicate]

I am trying to use Notepad++ as my all-in-one tool 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.
How do I fix it?
Should I install the JDK, and setup my path variable to the JDK instead of JRE?
What is the difference between the PATH variable in JRE or JDK?
The version number shown describes the version of the JRE the class file is compatible with.
The reported major numbers are:
Java SE 19 = 63,
Java SE 18 = 62,
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.
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.
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.
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!
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.
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.
Source: http://computers.tutsplus.com/tutorials/speed-up-your-terminal-workflow-with-command-aliases-and-profile--mac-30515
In Eclipse's menu Window -> Preferences -> Java -> Compiler check also "Configure Project Specific Settings".
If you stil have the error with same Java version: try to delete build folder of your project manually. Then restart Eclipse.
You can have some JAR library compiled in Java 7, and you have only Java 6 as Java Runtime. It could happen with some new libraries.
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:
JENKINS-30561 - Unable to launch agent using SSH
However selecting the right version of Java (newer) with update-alternatives should work.
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.
I have faced the same problem when I was working with an Ant script to build my application.
I use Eclipse for my application development, and I changed the compiler version in build properties of the project. But that didn't work for me. Then I found out that I can provide the compiler version in the Ant script.
I modified the Ant script at the section where it compile Java files.
<target name="build-java" depends="prepare-build">
<echo message="Compiling java files"/>
<javac ....
target="1.5"...
</javac>
</target>
This worked for me to resolve the unsupported major minor issue.
When I installed JDK 1.7, the problem got solved.
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.
As answered elsewhere by several people, the Java program is being run on an older version of Java than the one it was compiled it for. It needs to be "crosscompiled" for backward compatibility. To put it another way, there is a mismatch between source and target Java versions.
Changing options in Eclipse menus don't answer the original poster, who said he/she is not using Eclipse. On OpenJDK javac version 1.7, you can crosscompile for 1.6 if you use parameters -source and -target, plus provide the rt.jar -file of the target version (that is, the older one) at compile time. If you actually install the 1.6 JRE, you can point to its installation (for example, /usr/lib/jvm/java-6-openjdk-i386/jre/lib/rt.jar on Ubuntu, /usr/jdk/jdk1.6.0_60/jre/lib/rt.jar on SunOS apparently. Sorry, I don't know where it is on a Windows system). Like so:
javac -source 1.6 -target 1.6 -bootclasspath /usr/lib/jvm/java-6-openjdk-i386/jre/lib/rt.jar HelloWorld.java
It looks like you can just download rt.jar from the Internet, and point to it. This is not too elegant though:
javac -source 1.6 -target 1.6 -bootclasspath ./rt.jar HelloWorld.java
If you use Maven, set your Java compile level. Open a command line and write java -version for your compile level:
If you use IntelliJ IDEA, select project → File → Settings → Build Execution Deployment → Compiler → Java Compiler. Then change byte code as 1.7 like this image:
If you're facing this issue while using Maven, you can compile your code using the plug-in Maven Compiler.
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
.....
UPDATE: set source and target to 1.8, if you are using JDK 8.
I had the same error message when running Ant from Eclipse, but the other solutions mentioned here didn't solve my problem. The funny thing was that running Ant from the Windows command line was running fine, so it had to be a configuration issue within Eclipse.
It turned out that under Eclipse you can specify the environment that Ant should be running with and this was set as a JRE instead of a JDK.
Go to: Run -> External Tools -> External Tools Configurations ...
Select the Ant build.xml for your project (if you have multiple projects)
Activate the Tab 'JRE'
Here was selected 'Separate JRE: jre6'. When I changed this to a JDK from the 1.6 or 1.7 series, the error was gone.
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.
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.
Had this problem when I reverted to Java 6 and tried to run classes previously compiled with Java 7. What worked for me was Preferences > java > compiler --> set compliance level to 1.6 and crucially "configure project settings"..
Today, this error message appeared in our Tomcat 7 on Ubuntu 12.04.2 LTS (Precise Pangolin):
/var/log/tomcat7/localhost.2014-04-08.log:
Apr 8, 2014 9:00:55 AM org.apache.catalina.core.StandardContext filterStart
SEVERE: Exception starting filter struts2
java.lang.UnsupportedClassVersionError: controller/ReqAccept : Unsupported major.minor version 51.0 (unable to load class controller.ReqAccept)
The Struts application is compiled with Java 7.
It turned out, someone uses "service tomcat [stop/start]" to restart Tomcat 7,
$ ps -ef | grep java
tomcat7 31783 1 32 20:13 ? 00:00:03 /usr/lib/jvm/default-java/bin/java...
$ /usr/lib/jvm/default-java/bin/java -version
java version "1.6.0_27"
Which causes the "Unsupported major.minor version 51.0" error.
When we used "/etc/init.d/tomcat7 [stop/start]" to restart Tomcat 7, the problem was solved.
$ ps -ef | grep java
tomcat7 31886 1 80 20:24 ? 00:00:10 /usr/local/java/jdk1.7.0_15/bin/java
$ /usr/local/java/jdk1.7.0_15/bin/java -version
java version "1.7.0_15"
I solved it. I ran:
JAVA_HOME=/usr/lib/jvm/java-7-openjdk-i386
The error is misleading, Unsupported major.minor version 51.0. This gives the impression that version 51 (Java 7) is not supported. And we should use Java 6.
The error should have been:
The current Java version, 50, is unsupported. Use Java version 7 (51:0 and greater) instead.`
Your Java file is compiled with a different version (higher compiler version) than the version (lower runtime version) you are trying to run it with.
It is basic understanding that classes compiled with lower versions are expected to run in the later higher versions. But the opposite (compiled with higher compiler version and trying to run it with lower runtime version) is quite not possible sometimes.
Hence you are shown this error, when trying to execute your program. Unsupported major.minor version x.x
Q: I have created an application in Java 7, but when my users try to
run it they get an Unsupported major.minor version 51.0 error. What
does this mean and what can I do about it?
A: If you compile an application using javac in Java 7, the resulting classfiles will have the 51.0 version number. Versions of
Java prior to 7 do not recognize this number, so your users will have
to upgrade to Java 7 prior to running your application. If you are not
using any Java 7 APIs you can try to compile your application using
javac -target 1.6 to create a 1.6-compatible classfile. If your
application is deployed using webstart you can specify the minimum
version required. For more information, see the docs on Java Web Start
and JNLP here. This issue will go away once we trigger autoupdate to
Java 7 for end-users currently having Java 6 on their desktops. The
timeline for this is not yet determined, we want to give developers
time to work out any issues between their code and JDK 7 first.
(Source: oracle.com.)
Oh Mac OS X I was able to solve this problem by setting the JAVA_HOME variable:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home
First let's get some basics right...
JRE is a component in NetBeans/Eclipse/standalone that is going to provide you with libraries, JVM, Java plugins & Java web start. Note that it does not provide compliers or debuggers.
JDK is the superset of JRE along with compliers and debuggers.
So when you have your default library as a JRE instead of JDK, you are going to have a nice time importing stuff, but it won't compile.
Instead, set your path to JDK (I use NetBeans, and I set them using netbeans.conf in netbeans/etc/netbeans.conf and change the path).
In my case the problem was in the server runtime configuration:
Check the JRE is the version you need:
The project was in version 1.7 and the server JRE was set as 1.6, after changing to the proper java version it's launched fine.
I had the problem whereby I was having to run a Maven compilation on my project from the command line in order to run my unit tests; if I made a change to the test class and let Eclipse automatically recompile it, then I got the "Unsupported major.minor version 51.0" error.
I do have both JDK6 and JDK7 installed, but all my JRE settings were pointing at 1.6, both in the pom and from the project properties page in Eclipse. No amount of Maven Update Project and/or refreshing solved this.
Finally I tried closing the project and re-opening it, and this seemed to fix it! HTH
You have compiled your Java class with JDK 7 and you are trying to run same class on JDK 6 .
Install JDK 7.0.55 and set the Java for Eclipse for JDK 7.0.55.
Build the project with JDK 7.0.55 by configuring on build path JDK 7.0.55.
Set the compiler in Eclipse for JDK 7.0.55 by menu Windows -> Preferences -> Java -> Compiler - choose 1.7.

Can't fix Unsupported major.minor version 52.0 even after fixing compatibility

When I try running my java .jar on another machine I get the error
Unsupported major.minor version 52.0
I compiled my program using the jdk 1.6 and my machine (separate one) has java 7 installed.
This is the java version my machine is running:
Here are the settings in my IDE (Eclipse Lunar)
Why am I still getting an unsupported error?
I did check my run configuration and change it to jre6, but when I do I can't even run my program in the IDE.
Note: I would like my program to work with jdk 6, if that is not possible jdk 7.
My Class Path:
I agree with chrylis: you believe you changed your project's compliance settings but probably you didnt.
Right click on your project and:
Java / Build Path : Go to Libraries tab and ensure yourself that you are really using jre6
Java / Compiler : Ensure yourself that you have selected 1.6 compliance
By the way you can "tell" eclipse that jre8 is 1.6 compliance clicking on Window/Preferences/Java/Installed JREs/Execution Environment and selecting in the left panel, Execution Environments, JavaSE-1.6 and in the Compatible JRE's panel, jre8
Hi I found this link that helped me understand the issue. Hope it is useful.
Version released so far are
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
and from thata data it simply means
Many people think why do you get a version mismatch error if Java is backward compatible. Well, its true that Java is backward compatible, which means you can run a Java class file or Java binary (JAR file) compiled in lower version (java 6) into higher version e.g. Java 8, but it doesn't mean that you can run a class compiled using Java 7 into Java 5, Why? because higher version usually have features which are not supported by lower version.
Sometimes you may have more than one version of Java installed in you machine. Make sure the application you are running is pointing to the right or highest version available.
I Encounter similar issue while doing development on Android Studio 2.2.
My Machine Configuration -
JDK version 1.7.0_79 installed
JDK version 1.8.0_101 installed
Environment variable contains : JAVA_HOME = 1.7.0_79 JDK path and same is added to path variable
Project SDK Location = C:\Program Files\Java\jdk1.8.0_101
I then made below changes -
1. Uninstall JDK 1.7.0_79
2. Updated JAVA_HOME = 1.8.0_101 JDK path (Similar to SDK Location)
Now i am able to compile and run my application successfully , no more Unsupported major.minor version 52.0 Error
If you are trying to execute your program/application from the command prompt. Just make sure to restart your cmd after you have changed the JAVA_HOME var. Very simple but easily missed sometimes.
Several possiblies that causes this problem. The root cause is mismatched of compiler version between projects and IDE.
For windows environment you can refer to this blog to do the detail troubleshooting.
The error happens when you have compiled with higher version of Java and it is been tried to run with lower version of JRE. Even with minor version mismatch you would have this issue
I had issue compiling with JDK 1.8.0_31 and it was run with jdk1.8.0_25 and was displaying the same error. Once either the target is updated to higher version or compiled with same or lesser version would resolve the issue
Are you using retrolambda? If so, just do JAVA_HOME=$JAVA8_HOME.
Source: https://github.com/evant/gradle-retrolambda/issues/74
Its a silly problem, just make sure that the jdk and jre are latest version. This problem mainly occurs due to the automatic update of java(jre) and the jdk is not supported to that version, this makes problem.
Right Click on Project,
Properties ---> Java Compiler ( on same page change compiler Compliance Level to 1.6 (or) 1.7 (or) 1.8 ( match with your JAVA_HOME)
First of all thank you for all above answers.
However, I use Intellij Idea for daily basis. So, I hope my answer will help others.
Run your favourite terminal or command line. Then check your java version by running command
java -version
Then in Intellij press
Ctrl+Alt+Shift+S
in the
Project Settings
tab under
Project SDK
choose appropriate java version. Lastly, rerun your code.
I had also same issue. I solved this problem by updating my system jdk.
Previously i used jdk7.0 and now it is updated to jdk8.0.
find below link to download the updated jdk with new version.
it help me to solve my problem.
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
I also had to update the version of Tomcat I was using from Tomcat 7 to Tomcat 8.
I had the same issue. Turned out I used some external jars (apache poi 4.1.2) which were compiled with 1.8. Solved it by changing Java Build Path JRE to 1.8.

Peculiar Eclipse java.lang.UnsupportedClassVersionError, Unsupported major.minor version 52.0

First of all, I'd like to point out that I am aware that this question has been asked countless times and I am aware of the usual solution. However, it doesn't seem to work for me.
When the error Exception in thread "main" java.lang.UnsupportedClassVersionError: org/telegram/mtproto/state/ConnectionInfo : Unsupported major.minor version 52.0 occurs, it is generally caused by compiling with an incompatible JDK-JRE combination. However, as shown by the images below, my setup seems to be in order:
Fig. 1. JDK Compliance
Fig. 2. JRE Setting
Fig. 3. Java Home
What seems to be the problem? What am I missing? I'm using Eclipse Luna, trying to run some Telegram API Layer 11 code (the code works I reckon, as it was used by others).
The JAVA_HOME environment variable is irrelevant to how Eclipse will run code, as far as I'm aware. Likewise the compiler settings you've shown for a project don't affect how code is run.
Instead, you need to look at the Run Configuration you're using when you run it, and check the environment there. Make sure you're using Java 8, and all should be well. Click on the triangle next to the Run button, and select "Run Configurations..." to open the dialog with all the settings. Then look at the JRE tab, and ensure you're using the right JRE.
i see that you have a 32bits JDK version for the JDK 1.8 and a 64bits version for the JDK 1.7
i you running your project on a 64bits machine try to use the 64bits version of JDK 1.8
Note: you must have a 64bits version for eclipse too

Categories