PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SWT - NoClassDefFoundError



Peter S.
17-11-2004, 07:50
Hallo Leute,

ich hab ein kurioses Problem. Ich möchte aus einer Datei "xxx.class" eine "xxx.jar" erzeugen, die sodann die Klassendatei und das Manifest enthält. Aus dem "xxx.jar"-File möchte ich sodann ein EXE-File mit "Xenoage JStart" erzeugen.

Folgendes Beispiel - einfaches Fenster:

public class y {
private org.eclipse.swt.widgets.Shell sShell = null;
public y() {
super();
}

public static void main(String[] args) {
System.setProperty("java.library.path", "C:\\programme\\java\\eclipse\\plugins\\org.eclipse .swt.win32_3.0.1\\os\\win32\\x86");
org.eclipse.swt.widgets.Display display = org.eclipse.swt.widgets.Display.getDefault();
y thisClass = new y();
thisClass.createSShell() ;
thisClass.sShell.open();

while (!thisClass.sShell.isDisposed()) {
if (!display.readAndDispatch()) display.sleep ();
}
display.dispose();
}

private void createSShell() {
sShell = new org.eclipse.swt.widgets.Shell();
sShell.setSize(new org.eclipse.swt.graphics.Point(300,200));
sShell.setText("Shell");
}
}

Auch ohne Festlegung der Systemeigenschaft (Arguments->VM Arguments in Eclipse) für den SWT Klassenpfad (Djava.library.path="C:\programme\java\eclipse\plugins\org.eclipse.swt. win32_3.0.1\os\win32\x86") funktioniert das Ganze, wenn für die Ausführung die Klassendatei verwendet wird.

java -classpath .;%classpath%;C:\java\x\y.jar -Djava.library.path="C:\Programme\Java\eclipse\plugins\org.eclipse.swt. win32_3.0.1\os\win32\x86" y -> funktioniert!!!!!!

Wenn ich nun ein "jar-File" erzeuge, so erhält die darin enthaltene Manifestdatei folgenden Eintrag:

Manifest-Version: 1.0
Main-Class: y

Nachstehender Aufruf erzeugt jedoch ein Fehler:

java -classpath .;%classpath%;C:\java\x\y.jar -Djava.library.path="C:\Programme\Java\eclipse\plugins\org.eclipse.swt. win32_3.0.1\os\win32\x86" -jar y.jar -> Error: Exception in thread “main” java.lang.NoClassDefFoundError: org/eclipse/swt/widgets/Display at y.main(y.java:34)

Warum findet "java" die “org/eclipse/swt/widgets/Display”-Klasse bei einem direkten Aufruf der Projektklassendatei, jedoch bei einem Aufruf der daraus erzeugten "jar"-Datei nicht???

Für jeden Hinweise vielen Dank im Voraus
Peter

Peter S.
22-11-2004, 13:18
Ich habs gefunden. Man muss im Manifest des jar-Files den Class-Path relativ zum jar-File angeben, da bei Verwendung von z.B. "java -classpath .;C:\xx -jar y.jar" der Classpath ignoriert wird, nur ein solcher im Manifest wird berücksichtigt.

In meinem Fall war die einfachste Lösung, die Datei "swt.jar" in das Verzeichnis des auszuführenden Jar-Files zu kopieren.