4

I have installed JDK 6, but I can't execute a Java program.

For example, I have made test.java. I compile it with javac tes.java and there's no error when I compile it, but when I want to execute that program it always displays an error. I execute the Java program with java tes.

Exception in thread "main" java.lang.UnsupportedClassVersionError: tes : Unsupported major.minor version 51.0
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:634)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:277)
    at java.net.URLClassLoader.access$000(URLClassLoader.java:73)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:212)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
Could not find the main class: tes. Program will exit.

My javac version is 1.7.0, my java version is 1.6.0.

Here is my tes.java code:

class tes{

    public static void main(String[]args){
        System.out.println("hello");    
    }   

}
3
  • 2
    please provide the output of these commands: java -version, javac -version and update-java-alternatives -l
    – Salem
    Dec 2, 2011 at 3:18
  • Did you really try javac tes.java (it's probable since it's in the stack trace, too)? If so, it's a simple typo, see my reply below.
    – tohuwawohu
    Dec 2, 2011 at 9:14
  • Recompile your program with Java 6. Jun 30, 2012 at 9:38

6 Answers 6

5

It looks like you've compiled the Java source with a newer version of Java (7) which cannot be executed by the older Java runtime (6). If you don't need/want Java 7, uninstall the openjdk-7-jdk package and install openjdk-6-jdk instead:

sudo apt-get remove openjdk-7-jdk
sudo apt-get install openjdk-6-jdk

The alternative is using the direct paths to the specific versions of the compiler or runtime:

Running the Java 7 runtime

It's possible that Java 6 is still the default (compatibility with older programs?). To force the use of the Java 7 runtime, use the direct path to it:

/usr/lib/jvm/java-7-openjdk-amd64/bin/java tes

(replace amd64 by i386 for the 32-bit version of Java)

Running the Java compiler version 6

If you want to have code compiled for Java version 6, use the full path to the Java 6 compiler:

/usr/lib/jvm/java-6-openjdk/bin/javac tes.java

Alternatives

Like I've said before, if you don't like version 7 or 6, uninstall it (openjdk-7-jdk and openjdk-7-jre for version 7, openjdk-6-jdk and openjdk-6-jre for version 6). It's possible to have both versions installed. Use the alternatives system to configure the default one. Run the below commands to configure the runtime and compiler. It'll provide you a choice for the default.

sudo update-alternatives --config java
sudo update-alternatives --config javac
2

Please take a look at this Java.net thread http://www.java.net/node/664117

In summary this happens when you are compiling your code with one version of JDK but then trying to run the compiled code on an older version of JDK. So for example if you compile your code with JDK6 but try to run it with JDK5, you will get this error.

If you are compiling and running test.java on the same PC then please compare the outputs of the following commands. I believe they will give separate version numbers.

javac -version
java -version

If you are compiling on one PC and then running on another, then compare the output of the first command from the PC where you compile to the output of second command from the PC where you run the program.

It would also help if you add this version info to your question.

2
  • my javac version is 1.7.0, java version is Dec 4, 2011 at 8:04
  • @RickoDevian: What is your jvm version i.e the version given as output of "java -version" command?
    – binW
    Dec 4, 2011 at 12:08
1

Every generated class file have a major and minor version in it. Because the particular jvm support a range that comes within major and minor version. So your compiled class file have the higher version then your jvm support. Now you have two choice you can use "1.6 java compiler" or "1.7 java".

1

Having tried all the above, If it still doesn't work. Try executing the file the below commands:

javac tes.java
java -cp "." tes

This kind of errors are observed when the CLASSPATH variable is not set. Even I had the same problem. Couldn't just execute it. With the above commands it did work.

For further information about CLASSPATH.

0

You wrote you tried to compile the file test.java with javac tes.java - this won't work independently from your JDK because the *.java file name has to match the name of its class; and i assume there's no tes.java file. So, does javac test.java work?

Additional info from the javac manpage:

"Source code file names must have .java suffixes, class file names must have .class suffixes, and both source and class files must have root names that identify the class. For example, a class called MyClass would be written in a source file called MyClass.java and compiled into a bytecode class file called MyClass.class."

0

Use sudo update-alternatives --config java and set the version you may want to use.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .