java.lang.UnsupportedClassVersionError

BlubBlub

Bekanntes Mitglied
Hi,

ich habe folgendes Problem:
Ich habe ein Plugin Fähiges System entwickelt.

Ich habe eine Starter Klasse geschrieben, welche die main Funktion beinhaltet.
Diese Starter Klasse lädt aus einem Plugin Ordner alle dort befindlichen Plugins und führt sie aus.
Damit ein Dritter ein Plugin schreiben kann, habe ich eine Api.jar erstellt die das notwendige Interface "ExternalFunction" enthält, welches alle Plugins implementieren müssen.

Code:
Api.jar
   |----------> META-INF
   |                |----------> MANIFEST.MF
   |
   |----------> interfaces
                    |----------> ExternalFunction.class

Nachdem ein Dritter nun ein Klasse geschrieben hat, welche das Interface implementiert, kompiliert er dieses.

Dazu gibt er beispielsweise auf der Windows Konsole folgendes ein:
javac -classpath "Pfad\Zur\Api.jar" "Pfad\Zur\MyPlugin.java"

Anschließend packt man die MyPlugin.class Datei die man hieraus erhält in ein jar-Archiv und diese legt man in den Plugin Ordner.
Beim Starten des Programm mit der main Function wird nun das Plugin geladen.

Die Starter Klasse mit der Main Funktion habe ich in Eclipse geschrieben. Dieses verwendet JRE 1.6.

Das Problem: Führe ich in Eclipse die Starter Klasse aus, so funktioniert alles wunderbar, wenn das von einem Dritten geschrieben Plugin mit einem JDK der Version 1.6 kompiliert wurde.
Das in der Api.jar geschrieben Interface welches ich dem Dritten mitliefer wurde von mir auc über das JDK der Version 1.6 kompiliert.
Hat der Dritte aber sein Plugin mit einem JDK der Version 1.7 kompiliert und führt, dann das Hauptprogramm aus, dann kommt es zu einer:
Exception in thread "main" java.lang.UnsupportedClassVersionError: MyPlugin : Unsupported major.minor version 51.0

Sprich:
C:\Program Files\Java\jdk1.6.0_29\bin\javac -classpath "Pfad\Zur\Api.jar" "Pfad\Zur\MyPlugin.java"
(Das Hauptprogramm wird beim Laden der Klasse KEINEN java.lang.UnsupportedClassVersionError werfen)

C:\Program Files\Java\jdk1.7.0_01\bin\javac -classpath "Pfad\Zur\Api.jar" "Pfad\Zur\MyPlugin.java"
(Hierbei wird nachher beim Laden der Klasse ein java.lang.UnsupportedClassVersionError geworfen)

Hierhin sehe ich aber ein Problem für die späteren Plugin Entwickler. Denn es kommen ja immer wieder
mal neue Version des JDK heraus. Und ich denke mal, nicht dass ein Entwickler alle JDK Versionen auf seinem Rechner haben wird sondern in der Regel die neueste.
Um aber ein Plugin für meine Hauptprogramm schrieben zu können muss er offensichtlich eine JDK der Version 1.6 verwenden ansonsten kommt es zur oben genannten Exception.
Irgendwie verstehe ich dieses Konzept aber nicht, denn ich fänds irgendwie logischer wenn die Plugins die mit JDK 1.7 oder höher entwickelt wurden abwärtskompatibel sein sollten, und nicht unbedingt mit JDK 1.6 zu entwickeln sind. Dem ist halt aber nicht so.
Muss ich dem Dritten jetzt also jedes mal die JDK Version 1.6 mitgeben damit er seine PluginKlasse kompilieren kann, bzw. muss ich ihm sagen dass er sich diese JDK Version runterladen muss, damit später keine Exception geworden werden.


Java:
package starter;


import interfaces.ExternalFunction;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.jar.JarEntry;
import java.util.jar.JarInputStream;

import javax.swing.JOptionPane;


public class Starter 
{
	public static void main(String[] args)
	{		
		try 
		{			  
			ArrayList<ExternalFunction> externalFunctionArrayList = new ArrayList<ExternalFunction>();
			
			File pluginFile = new File("C:\\Users\\Ich\\Desktop\\MyProgram2\\Plugins");
			File[] pluginJars = pluginFile.listFiles(new JARFileFilter());
			URL[] urls = new URL[pluginJars.length];
  
			for (int i = 0; i < pluginJars.length; i++)
			{ 
    			urls[i] = pluginJars[i].toURI().toURL();
				System.out.println(urls[i]);
			}
			  
			URLClassLoader urlClassLoader = new URLClassLoader(urls);
			
			for(int i=0; i <pluginJars.length; i++)
			{
				JarInputStream jarInputStream = null;
				try 
				{
					jarInputStream = new JarInputStream(new FileInputStream(pluginJars[i]));
					JarEntry jarEntry = jarInputStream.getNextJarEntry();
					
					while(jarEntry != null)
					{
						if(jarEntry.getName().toLowerCase().endsWith(".class"))
						{
							String clazzLocation = jarEntry.getName().substring(0, jarEntry.getName().length()-6).replace('/', '.');
							Class<?> clazz = urlClassLoader.loadClass(clazzLocation);
							Object object = clazz.newInstance();
							  
							if(object instanceof ExternalFunction)
								externalFunctionArrayList.add((ExternalFunction)object);
						}
						
						jarEntry = jarInputStream.getNextJarEntry();
					}
				}
				catch (FileNotFoundException e)
				{
					e.printStackTrace();
				}
				catch (IOException e)
				{
					e.printStackTrace();
				}
				finally
				{
					try 
					{
						jarInputStream.close();
					} 
					catch (IOException e)
					{
						e.printStackTrace();
					}
				}
			}
			
			externalFunctionArrayList.get(0).doSomething();
		}
		catch (MalformedURLException e)
		{
			e.printStackTrace();
		} 
		catch (ClassNotFoundException e)
		{
			e.printStackTrace();
		}
		catch (InstantiationException e)
		{
			e.printStackTrace();
		} 
		catch (IllegalAccessException e)
		{
			e.printStackTrace();
		}
	}
}
 
Zuletzt bearbeitet:
M

maki

Gast
Was ist denn die Frage?

Wenn du nur ein JRE 1.6 auf deiner Kiste am laufen hast, kannst du eben keine Klassen ausführen die für Java 7 kompiliert wurden, ist doch logisch.
 

AFlieger

Mitglied
Irgendwie verstehe ich dieses Konzept aber nicht, denn ich fänds irgendwie logischer wenn die Plugins die mit JDK 1.7 oder höher entwickelt wurden abwärtskompatibel sein sollten, und nicht unbedingt mit JDK 1.6 zu entwickeln sind. Dem ist halt aber nicht so.

In Java 7 sind Spracherweiterungen hinzugekommen. Stichwort "Project Coin". Wie soll das mit der Abwärtskompatibilität funktionieren?
 
G

Gast2

Gast
Die sind ja auch abwärtskompatibel. Das heisst, dass man Java 6 Klassen in 7 nutzen kann und nicht umgekehrt.

Was du versuchst (eine 7er Klasse in 6 zu nutzen) nennt man Aufwärtskompatibilität. Das geht natürlich nicht!
 

L-ectron-X

Gesperrter Benutzer
Man könnte da am Besten das Hauptprogramm bei neuen JDK-Versionen mit der jeweils aktuellen Version kompilieren und das Programm gleich eine Versionsnummer nach oben schalten, um anzuzeigen, dass es angepasst wurde.
 

FerFemNemBem

Bekanntes Mitglied
Halloechen,

Du kannst auch einfach den Hinweis (in der readme.txt o.ä.) geben, dass der Plugin-Ersteller mit "-target 1.6" compilieren soll. Sprach und Syntaxerweiterungen des 7er JDK kann er dann natuerlich nicht nutzen.

Gruss, FFNB.
 
Zuletzt bearbeitet:

BlubBlub

Bekanntes Mitglied
Du kannst auch einfach den Hinweis (in der readme.txt o.ä.) geben, dass der Plugin-Ersteller mit "-target 1.6" compilieren soll. Sprach und Syntaxerweiterungen des 7er JDK kann er dann natuerlich nicht nutzen.

Ich hab folgende Eingabe gemacht:
javac -cp ..\Api.jar -target 1.6 MyPlugin.java

wobei ich mit jdk1.7.0_01 kompiliert habe.
Als Ausgabe erhalte ich allerdings auf der Konsole:
javac: target release 1.6 conflicts with default source release 1.7

Ich krieg die Datei also nicht kompiliert.
Das verstehe ich nicht ich dachte, ich könnte mit der Angabe -target 1.6 auch mit einer jdk1.7 Version
eine Klasse für ein jre der 1.6 Version erstellen.
 
M

maki

Gast
Es gibt ime nur eine Möglichkeit das wirklich sicher hinzubekommen:
Unter einem JDK 1.6 entwickeln, source und target auf 1.6 stellen.
 

FerFemNemBem

Bekanntes Mitglied
Halloechen,

dann stell mal noch source auf 1.6 also:

javac -cp ..\Api.jar -source 1.6 -target 1.6 MyPlugin.java

Dann hast Du eine vollstaendig 1.6 kompatibele Klasse - auch unter einem 1.7er JDK kompiliert.

Gruss, FFNB.
 

BlubBlub

Bekanntes Mitglied
Eingabe:
javac -cp ..\Api.jar -source 1.6 -target 1.6 MyPlugin.java

hmm, dann erhalte ich folgende Ausgabe:
warning: [options] bootstrap class path not set in conjunction with -source 1.6
1 warning
 
Zuletzt bearbeitet:

FerFemNemBem

Bekanntes Mitglied
Halloechen,

dann setz den bootclasspath noch. Compiliert hat es aber trotz der Warnung oder?

Hier findest Du die javac Dokumentation. Dort wird auch auf Dein Problem eingegangen.

Sorry, muss jetzt hier erstmal los. Evtl. kann ich Dir heute Abend noch genaueres dazu schrieben...

// EDIT: noch kurz als Beispiel:

javac -cp ..\Api.jar -bootclasspath [Pfad_Zu_Deinem_1.6er_rt.jar] -source 1.6 -target 1.6 MyPlugin.java

Gruss, FFNB.
 
Zuletzt bearbeitet:

BlubBlub

Bekanntes Mitglied
Jau hast recht es wird zwar ne Warnung ausgeben aber die Datei wird dennoch kompiliert und funtkioniert auch richtig.

Hab mir jetzt nochmal ein paar Gedanken gemacht und paar Sachen ausprobiert.
Angenommen mein Hauptprogramm wurde mit JDK 1.6 kompiliert, PluginOne wurde ebenfalls mit JDK 1.6 kompiliert und PluginTwo mit JDK 1.7
Urpsprünglich hatte ich die Befürchtung, dass ich dem Plugin Hersteller immer die JDK 1.6 mitgeben muss zum kompilieren seiner Plugins, da mein Hauptprogramm ebenfalls mit JDK 1.6 kompiliert wurde. Doch dies spielt überhaupt keine Rolle. Es ist durchaus zulässig, dass das Hauptprogramm mit JDK 1.6 kompiliert wurde und die Plugins mit höheren Versionen.

Macht der User Regelmäßige Updates seiner JRE so wird er keine Schwierigkeiten haben Plugins die mit neuen JDK Versionen erstellt wurden auszuführen.
Der Benutzer muss also immer mindestes die JRE Version haben welche gleich der höchsten kompilierten Klasse mit einer JDK Version ist.
Sprich benutzt das auszuführende Programm eine Klasse die mit einer JDK Version 1.7 kompiliert wurde, und gibt es keine andere Klasse die mit einer höheren Version kompiliert wurde, so muss der User ein JRE runterladen welches ebenfalls der Version 1.7 entspricht.

Sprich Plugin Entwickler muss sich keine Gedanken machen mit welcher JDK er seine Plugins kompiliert, solange der Benutzer, die aktuelleste JRE Version verwendet.

Somit funktioniert ja alles Bestens =)

Danke für dieTipps
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
Y java.lang.UnsupportedClassVersionError: Allgemeine Java-Themen 5
M java.lang.UnsupportedClassVersionError: Bad version number i Allgemeine Java-Themen 5
P Fehler: Hauptklasse Main konnte nicht gefunden oder geladen werden Ursache: java.lang.ClassNotFoundException: Main Allgemeine Java-Themen 24
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
G java.lang.NoClassDefFoundError: org/aspectj/lang/Signature Allgemeine Java-Themen 2
P9cman java.Lang Klassen fehlen in JRE System Library Allgemeine Java-Themen 1
F Fehlermeldung: java.lang.NoClassDefFoundError: org/apache/commons/net/ntp/NTPUDPClient Allgemeine Java-Themen 6
P Swing Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: npoints > xpoints.length || npoints > ypoints.length Allgemeine Java-Themen 5
S Exception in thread "main" java.lang.NullPointerException at FamilienApp.main(FamilienApp.java:15) Allgemeine Java-Themen 1
E HILFE !! Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/io/FileUtils Allgemeine Java-Themen 4
J Threads - java.lang.IllegalThreadStateException Allgemeine Java-Themen 6
javaerd Binomialkoeffizient ausrechnen, Exception in thread "main" java.lang.StackOverflowError Allgemeine Java-Themen 6
T Eclipse Dll einbinden java.lang.UnsatisfiedLinkError nur in Eclipse nicht via javac Allgemeine Java-Themen 1
V Compiler-Fehler Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 125, Size: 125 Allgemeine Java-Themen 11
J Exception in thread "main" java.lang.NoClassDefFoundError Allgemeine Java-Themen 4
H Java Mail Fehlermeldung: java.lang.NoClassDefFoundError: javax/mail/internet/AddressException Allgemeine Java-Themen 5
Crooda Compiler-Fehler java.lang.NoClassDefFoundError bitcoinj Allgemeine Java-Themen 1
I Fehler java.lang.NullPointerException Allgemeine Java-Themen 5
L Eigenener ClassLoader wirft java.lang.NoClassDefFoundError Allgemeine Java-Themen 0
H java.lang.NullPointerException Allgemeine Java-Themen 5
L Interpreter-Fehler java.lang.NullPointerException Allgemeine Java-Themen 17
F java.lang.ClassNotFoundException: .class Allgemeine Java-Themen 5
S java.lang.NoClassDefFoundError Allgemeine Java-Themen 5
J Compiler-Fehler java.lang.StringIndexOutOfBoundsException Allgemeine Java-Themen 12
D java.lang.TypeNotPresentException Allgemeine Java-Themen 3
A java.lang.NullPointerException bei Schleife Allgemeine Java-Themen 3
L java.lang.OutOfMemoryError: Java heap space Allgemeine Java-Themen 10
S javadoc java.lang.NullPointerException Allgemeine Java-Themen 2
H java.lang.OutOfMemoryError bei der wiederholten Erzeugng von Threads Allgemeine Java-Themen 8
B Variable class in java.lang.Object Allgemeine Java-Themen 11
N java.lang.IllegalMonitorStateException: object not locked by thread before notify() Allgemeine Java-Themen 2
T ProcessBuilder (java.lang.NoClassDefFoundError) Allgemeine Java-Themen 2
T java.lang.AssertionError: Allgemeine Java-Themen 4
T java.lang.ClassCastException: Allgemeine Java-Themen 4
P Java Probleme - java.lang.Thread.run(Unkown Source) Allgemeine Java-Themen 10
M cannot be cast to java.lang.Comparable Allgemeine Java-Themen 5
B JNI - java.lang.UnsatisfiedLinkError Allgemeine Java-Themen 21
E Interpreter-Fehler java.lang.ExceptionInInitializerError Allgemeine Java-Themen 12
C java.lang.ClassCastException Allgemeine Java-Themen 3
P Fehler beim Programmstart: java.lang.NoClassDefFound Allgemeine Java-Themen 12
T java.lang.ClassCastException Allgemeine Java-Themen 7
B Java - java.lang Allgemeine Java-Themen 12
sylo java.lang.NoSuchMethodError: Obwohl Methode vorhanden Allgemeine Java-Themen 8
MonsterBit java.lang.NullPointerException Allgemeine Java-Themen 2
H Applet java.lang.reflect.InvocationTargetException Allgemeine Java-Themen 9
M SerialPort RS232 : java.lang.NoSuchFieldError: eis Allgemeine Java-Themen 2
U java.lang.ClassNotFoundException: .jar Allgemeine Java-Themen 8
G NoClassDefFoundError: java/lang/Object Allgemeine Java-Themen 4
W java.lang.ClassCastException Allgemeine Java-Themen 10
N Exception in thread "main" java.lang.UnsatisfiedLinkError: no lwjgl in java.library.p Allgemeine Java-Themen 4
N java.lang.InstantiationException Allgemeine Java-Themen 10
J java.lang.NullPointerException bei Threadprogrammierung Allgemeine Java-Themen 9
D replaceAll => no such java.lang.NoSuchMethodError Allgemeine Java-Themen 5
G java.lang.LinkageError: loader constraints violation. Allgemeine Java-Themen 3
O java.lang.NumberFormatException für normalen integer Allgemeine Java-Themen 4
G Javadoc generiert keine Links zu java.lang Klassen? Allgemeine Java-Themen 4
G java.lang.ClassCastException Allgemeine Java-Themen 3
J Fehler: java.lang.NullPointerException Allgemeine Java-Themen 2
E java.lang.outofmemory über windows-cmd ändern Allgemeine Java-Themen 6
J Folgender Fehler: java.lang.NullPointerException Allgemeine Java-Themen 4
I java.lang.UnsatisfiedLinkError: Allgemeine Java-Themen 8
J Exception in thread "main" java.lang.OutOfMemoryEr Allgemeine Java-Themen 26
J java.lang.StackOverflowError Debugging? Allgemeine Java-Themen 51
D java.lang.UnsatisfiedLinkError Allgemeine Java-Themen 5
S Fortran Funktion mit JNI aufrufen: java.lang.UnsatisfiedLink Allgemeine Java-Themen 2
S java.lang.UnsatisfiedLinkError mit JNI Allgemeine Java-Themen 6
reibi java.lang.Class - Resource - Solaris Allgemeine Java-Themen 17
S Exception in Thread "main" java.lang.NoClassDef. b Allgemeine Java-Themen 2
J java Thread java.lang.OutOfMemoryError: Java heap space Allgemeine Java-Themen 7
O "AWT-EventQueue-1" java.lang.ArrayIndexOutOfBounds Allgemeine Java-Themen 6
B Exception in thread "main" java.lang.NoClassDefFou Allgemeine Java-Themen 12
G Error: java.lang.OutOfMemoryError: Java heap space Allgemeine Java-Themen 2
S java.lang.OutOfMemoryError: Java Allgemeine Java-Themen 22
G java.lang.NullPointerException JFreeChart Allgemeine Java-Themen 5
E Java Fehlermeldung java.lang.NoClassDefFoundError Allgemeine Java-Themen 3
G Problem mit java.lang.reflect.Field Allgemeine Java-Themen 15
P Kompilerfehler: at java.lang.ClassLoader.loadClassInternal(U Allgemeine Java-Themen 16
M java.lang.NullPointerException im Chatclient Allgemeine Java-Themen 12
H java.lang.ExceptionInInitializerError Allgemeine Java-Themen 7
D java.lang.IllegalMonitorStateException: current thread not Allgemeine Java-Themen 3
P Exception in thread "main" java.lang.NoClassDefFou Allgemeine Java-Themen 3
P Exception in thread "main" java.lang.NoClassDefFou Allgemeine Java-Themen 15
P Exception in thread "main" java.lang.NoClassDefFou Allgemeine Java-Themen 3
T Profifrage: java.lang.StackOverflowError bei BigInteger Allgemeine Java-Themen 27
M java.lang.OutOfMemoryError Allgemeine Java-Themen 2
W java.lang.ClassNotFoundException Allgemeine Java-Themen 10
F java.lang.OutOfMemoryError: Java heap space Allgemeine Java-Themen 22
B Exception in thread "main" java.lang.OutOfMemoryEr Allgemeine Java-Themen 5
S fehlermeldung java.lang.OutOfMemoryError Allgemeine Java-Themen 5
B java.lang.NullPointerException Allgemeine Java-Themen 11
S Exception in thread "main" java.lang.StringIndexOu Allgemeine Java-Themen 9
H Skalieren von Image -> java.lang.OutOfMemoryError - WARUM Allgemeine Java-Themen 18
J java.lang.ArrayIndexOutOfBoundsException Allgemeine Java-Themen 2
P Hilfe zu java.lang.Object Allgemeine Java-Themen 3
K java.lang.reflect - Getter und Setter ermitteln Allgemeine Java-Themen 8
G jTable-Problem --> java.lang.OutOfMemoryError Allgemeine Java-Themen 5
G Java.lang.Compiler Allgemeine Java-Themen 3
E Exception in Thread "main" java.lang.NoClassDefFou Allgemeine Java-Themen 5
F java.lang.OutOfMemoryError Allgemeine Java-Themen 13
R java.lang.String maximale Anzahl der Zeichen Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben